数据结构
you can*fighting
这个作者很懒,什么都没留下…
展开
-
冒泡排序
1.冒泡排序:从头开始依次比较相邻的元素,我们定义为cur和next,如果cur>next,则交换cur和next所指向的元素(假设我们想将n个数从小到大进行排序)。从最开始的一对到最后一对,经过一趟比较便可以找出所有元素中最大的数,此时最大的数就是最后一个元素。然后重复上述步骤,最多经过n-1趟的比较便可以完成排序。如图:2.接下来,我们对冒泡排序进行算法分析时间复杂度:最好情况:所有元素...原创 2018-03-17 15:28:37 · 102 阅读 · 0 评论 -
搜索结构之平衡树
AVL tree:称为高度平衡的二叉搜索树(左右子树的高度差不超过1),是1962年有俄罗斯的数学家G.M.Adel'son-Vel'skii和E.M.Landis提出来的。它能保持二叉树的高度平衡,尽量降低二叉树的高度,减少树的平均搜索长度。AVL树的性质: 1. 左子树和右子树的高度之差的绝对值不超过1 2. 树中的每个左子树和右子树都是...原创 2018-08-12 13:30:51 · 390 阅读 · 0 评论 -
快速排序
快速排序:快速排序是对冒泡排序的一种改进,由C.A.R.Hoare在1962年提出。快速排序的基本思想是:先找到一个基准值key,(至于这个key怎么找,我在后面会列出来)。通过一趟排序把待排序序列分为两部分,左边一部分为小于基准值的元素,右边一部分为大于基准值的元素。然后再循环分别对这两部分进行取基准值并排序,所以快速排序实际上是一个递归的过程,可以以此达到使整个序列变为有序序列。我来画一个...原创 2018-03-27 15:56:08 · 667 阅读 · 0 评论 -
哈希应用变形之位图
位图(bitmap):即用二进制位的状态来判断某个值存不存在,常适用于海量数据问题,用0来表示数据不存在,用1来表示数据存在。例如:原创 2018-04-02 15:55:45 · 140 阅读 · 0 评论 -
归并排序
1.归并排序归并排序是建立在归并上的一种有效的排序方法,把复杂的问题分解成若干个小文题,是很多复杂问题的 有效解决办法。化繁为简,分而治之。分治法使我们经常会用到的一种方法,归并排序就是采用分治法的一个典型的应用,它是将已经有序的两个区间进行连续归并成一个有效区间,即将两个顺序序列合并为一个顺序序列,我们可以称为二路归并。这个概念可能比较抽象,我们并不能十分清晰的去理解它的排序过程。再来介绍一下归...原创 2018-03-22 12:14:57 · 164 阅读 · 0 评论 -
堆排序
1.堆排序:提到堆排序,我们先来介绍一下堆,堆从本质上来讲就是一颗二叉树,堆有大堆和小堆之分。大堆指的是每个节点的值都小于它对应的父节点的值,所以在大堆中根节点的值是整个二叉树中值最大的;小堆与大堆刚好相反,即在小堆中,任意一个节点的父节点的值都小于子节点的值,所以在小堆中根节点的值是整颗树中最小的元素。基于堆的这种特性,我们可以很好的去利用它来高效快速的完成排序。堆排序是排序算法中比较常见的一种...原创 2018-03-21 19:10:09 · 261 阅读 · 0 评论 -
搜索结构之哈希
哈希表:哈希表是一种可以在O(1)时间内查找到某个元素的数据结构,它是用数组实现的,这依赖于内存的随机访问特性。那哈希表到底是什么样呢?哈希表是通过哈希函数(hashfunc)使元素的存储位置与关键码一一对应的关系,所以在进行元素查找的时候可以通过该函数快速的找到该元素。若结构中存在关键字和key相等的元素,则必然存储在f(k)的位置上。由此,不需要进行比较便可以直接取得所查记录。这个对应函数就被...原创 2018-03-30 15:40:12 · 284 阅读 · 0 评论 -
希尔排序
1.希尔排序(ShellSort):又称缩小增量排序,该方法因DL.Shell于1959年提出而得名。前面我们讲了插入排序,那么其实希尔排序就是在插入排序上延伸出来的一种更高效的排序算法,为什么说它更加高效呢?因为其实在元素个数非常少或者元素已经基本有序的情况下插入排序的速度是非常快的。那么究竟什么是希尔排序呢?希尔排序是基本排序算法中的一种,是一种直接插入排序优化后的排序方法,它通过设置步长进行...原创 2018-03-20 08:46:57 · 161 阅读 · 0 评论 -
海量数据处理问题
1.给定一个大小超过100G的文件,其中存在IP地址,找出其中出现次数最多的IP地址。思路:显然我们是不可能将这100G内存直接加载到内存中去处理的。所以我们可以对大文件进行划分,前提当然是相同的IP地址会被划分在一块。假定我们将这个文件分为1024份,那么一个文件的大小大概为100M,然后利用哈希算法对IP地址进行映射,得到的值%1024,将同一个IP地址映射到同一个文件中。然后对每个文件进行处...原创 2018-03-06 16:47:16 · 175 阅读 · 0 评论 -
直接插入排序
1.直接插入排序:一种比较简单直观的排序算法,将待插入元素找到一个合适的位置并插入到前面的有序序列中。具体实现方法为:每次先用一个临时变量把带插入数据保存起来,然后逐个与前面有序集合里的元素进行比较,如果集合里的元素大于待插入元素(假设我们要从小到大进行排序),就将它向后移动一个单元,直到在有序集合里找到小于等于待插入元素的数时就将待插入元素放在这个数后面。这里,我们依旧用画图的方法来更直观的理解...原创 2018-03-19 16:34:49 · 147 阅读 · 0 评论 -
选择排序
1.选择排序(SelectSort):选择排序是一种较为简单的排序方法。它是每次在待排序元素中找到最大或者最小的元素,存放在序列的起始位置,直到所有的数据排完为止。如图:从图中我们再来看一下选择排序的过程,假设总共n个元素。首先,第一趟拿初始序列中的第一个元素和后面的元素依次作比较,(以从小到大排序为例)如果大于,就不断进行交换,(当然在不断的交换过程中第一个元素在不断发生改变),最后一次比较完成...原创 2018-03-18 15:42:34 · 91 阅读 · 0 评论 -
浅析红黑树底层原理及实现
我们在上一篇博客认识到了平衡二叉树(AVLTree),了解到平衡二叉树的性质,其实平衡二叉树最大的作用就是查找,AVL树的查找、插入和删除在平均和最坏情况下都是O(logn)。AVL树的效率就是高在这个地方。如果在AVL树中插入或删除节点后,使得高度之差大于1。此时,AVL树的平衡状态就被破坏,它就不再是一棵二叉树;为了让它重新维持在一个平衡状态,就需要对其进行旋转处理, 现在呢,我们来思考一下虽...原创 2018-08-12 16:38:38 · 4256 阅读 · 0 评论