堆(优先队列)priority queue特殊的队列,取出元素的顺序是依照元素的优先权(关键字)大小,而出元素进入队列的先后顺序操作:查找最大值(最小值),删除(最大值) 数组:链表:有序数组:有序链表: 采用二叉搜索树? NO 采用完全二叉树 YES堆的连个特性结构性:用数组表示的完全二叉树:有序 ...
分类:
其他好文 时间:
2018-08-24 00:36:36
阅读次数:
528
"链接" 一面 1 找一个无序数组的中位数 老题,方法有: 1. 先排序再定位 2. 最大堆和最小堆配合 3. 变体的快排 代码: c++ include include include include include include include include using namespace ...
分类:
其他好文 时间:
2018-08-16 13:33:28
阅读次数:
180
斐波那契堆是具有最小堆序的有根树的集合,也就是集合中的每棵树都具有父结点的关键字小于或等于子结点的关键字。 对于每一个结点x,主要有以下属性: 名称 说明 记作 关键字 结点存储的值 x.key 父结点 结点的父亲 x.p 左兄弟 结点的左兄弟 x.left 右兄弟 结点的右兄弟 x.right 孩 ...
分类:
编程语言 时间:
2018-08-02 23:10:11
阅读次数:
255
Top K问题比较常见啦,这里总结一下方法。 1、用最小堆来做。 思路是先利用数组中前k个数字建一个最小堆,然后将剩余元素与堆顶元素进行比较,如果某个元素比堆顶元素大,就替换掉堆顶元素,并且重新调整成最小堆。 到这里,堆中保存着的其实是前k个最大的数字。堆顶就是第K个最大的数字。这样前k个,第k个都 ...
分类:
编程语言 时间:
2018-07-28 23:28:48
阅读次数:
177
堆是具有下列性质的完全二叉树: 每个结点的值L[i]L[i]都大于或等于其左孩子L[left(i)]L[left(i)]和右孩子L[right(i)]L[right(i)]结点的值,称为大顶堆(最大堆); 每个结点的值L[i]L[i]都小于或等于其左孩子L[left(i)]L[left(i)]和右孩 ...
分类:
其他好文 时间:
2018-07-22 23:34:35
阅读次数:
216
题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 思路 用一 ...
分类:
其他好文 时间:
2018-07-21 11:55:34
阅读次数:
123
Java和C++之间有一堵由内存管理和垃圾收集技术所围成的“高墙”,墙外的人想进去,墙内的人却想出来。 摘自《深入理解Java虚拟机》 作为一个Java程序员,因为虚拟机的好处,在开发过程中一般不用关心内存分配和垃圾回收方面的内容,这就让我在跟C++的朋友聊天或沟通的时候,总觉得自己是个假的程序员, ...
分类:
编程语言 时间:
2018-07-15 00:49:37
阅读次数:
198
概述 与C++不同的是:在Java中我们无需关心对象占用空间的释放,这主要得益于Java中的垃圾处理器(简称GC)帮助我们自动的进行对象占用空间的释放。 下面我们带着几个问题来学习: 1、堆内存是如何分代的? 用一张图片来描述(面积大小不代表实际占用空间大小) 堆内存分为:年轻代(Young) + ...
分类:
编程语言 时间:
2018-07-14 17:20:37
阅读次数:
279
方法一:采用归并的思想将链表两两合并,再将两两合并后的链表做同样的操作直到合并为只有一个新的链表为止。 归类的时间复杂度是O(logn),合并两个链表的时间复杂度是O(n),则总的时间复杂度大概是O(nlogn)。 方法二:利用了最小堆这种数据结构,我们首先把k个链表的首元素都加入最小堆中,它们会自 ...
分类:
其他好文 时间:
2018-07-08 13:32:41
阅读次数:
136