前言 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前10或前100个数,同时要保证 内存和速度的效率,我们可能第一个想法就是利用排序,然后截取前10或前100,而排序对于量不是特别大的时候没有任何问题,但只要量特别大是根本不可能 完成这个 ...
分类:
编程语言 时间:
2017-07-23 18:28:12
阅读次数:
323
当我们需要高效的完成以下操作时: 1.插入一个元素 2.取得最小(最大)的数值,并且删除 能够完成这种操作的数据结构叫做优先队列 而能够使用二叉树,完成这种操作的数据结构叫做堆(二叉堆) 堆与优先队列的时间复杂度: 若共有n个元素,则可在O(logn)的时间内完成上述两种操作 堆的结构如下图: 堆最 ...
分类:
其他好文 时间:
2017-07-13 23:40:58
阅读次数:
221
堆最重要的性质就是儿子的值一定不小于父亲的值。 堆的push与pop操作的时间复杂度都是O(logn) 堆也是二叉树,所以满足: 左儿子的编号是自己编号*2+1; 右儿子的编号是自己编号*2+2; (左儿子与右儿子没有对应的大小关系) 堆还是很好理解的,能理解树就能理解堆。 附代码: 1 int h ...
分类:
编程语言 时间:
2017-07-10 12:00:53
阅读次数:
126
关于二叉树有一点需要注意:二叉树并不是树的一种特殊形式。 二叉树又有几种特殊的形式:二叉排序树(二叉查找树)、最优二叉树(哈弗曼树)、二叉堆(大顶堆,小顶堆)等。斜线是数据结构 二叉排序树(二叉查找树)(BST)它或者是一棵空树;或者是具有下列性质的二叉树:(常用二分查找) 1,若左子树不空,则左子 ...
分类:
其他好文 时间:
2017-07-01 23:22:32
阅读次数:
448
【简介】 树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。 二叉树是每个结点最多有两个子树的有序树。通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用作二叉查找树和二叉堆或是二叉排序树。二叉树的每个结点至多只有二棵子树(不存 ...
分类:
其他好文 时间:
2017-06-13 17:12:37
阅读次数:
270
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i ...
分类:
其他好文 时间:
2017-06-10 23:39:09
阅读次数:
368
【问题描写叙述】 Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: You may assume that nums1 has enough space ...
分类:
编程语言 时间:
2017-06-08 21:24:33
阅读次数:
183
--------------------siwuxie095 堆的基本存储 在堆中实现的插入操作和删除操作,都是 logN 级别的, 显然,堆一定相应的是一个树形结构,最为经典的一种 堆的实现叫做 二叉堆(Binary Heap) 二叉堆对应的是二叉树,所谓二叉树,就是每一个节点, 最多有两个子节点... ...
分类:
其他好文 时间:
2017-06-05 20:59:26
阅读次数:
237
堆可以看成一个近似的完全二叉树,其任何一非叶节点满足性质: Key[i]<=key[2i+1]&&Key[i]<=key[2i+2](小根堆) 或者 Key[i]>=Key[2i+1]&&key[i]>=key[2i+2](大根堆) 有了上面的定义,就有下面的计算: #define Pa(i) i> ...
分类:
其他好文 时间:
2017-06-01 19:40:21
阅读次数:
200