最大堆

常用排序算法(插入排序,快速排序,归并排序,堆排序)

↘锁芯ラ 提交于 2019-12-25 05:10:57
选择排序和冒泡排序 冒泡排序和选择排序的原理和实现比较类似,冒泡排序是按次序将序列中相邻的元素比较,符合条件时交换两者的位置,最后在序列的末尾有一个最大值,除去末尾的数组成新的序列,重复前面的步骤。选择排序是将序列中每个元素和暂存元素进行比较,符合条件时将临时变量和序列中元素交换,最后将最优值(最大或最小)的元素循环地取出。 插入排序 插入排序的概念,就像平时玩扑克一样,将后面来的数插入到前面序列中,在后面的一张插入的时候,前面的序列已经是有序的了。 public class InsertSort { public static void insertSort(int[] a){ int i, j; int n =a.length; int target; for (i = 1; i < n; i++) { j = i; target = a[i]; while (j > 0 && target < a[j-1]) { a[j] = a[j-1]; j--; } a[j] = target; } } public static void main(String[] args){ int[] a={1,5,9,4,10,8,7}; insertSort(a); for(int i= 0;i<a.length;i++){ System.out.print(a[i]+","); } }

leetcode 352 & leetcode 239 & leetcode 295 & leetcode 53 & leetcode 209

人盡茶涼 提交于 2019-12-20 18:24:24
lc352 Data Stream as Disjoint Intervals 可以用treemap解 key保存interval的start,value保存interval的end。分别找出当前val的lowerKey(treemap中>val的最小key值,没有就返回null)和higherKey(<val的最大key没有就返回null) 有以下几种情况: 1) 当前插入的key与前后两个interval重叠 合并三者,将前一个的interval.end改成后一个的end,并且将后一个从treemap中删除 2) 当前插入的key与前面的interval重叠 合并,前一个interval的end改成Math.max(end, val) 注意这里的判断条件不能写成 treemap.(treemap.lowerKey(val)) == val – 1; 而是应该写成>=,前者会出现异常,举例来说[4, 9] 现在val=7,按前者的判断条件,可能就直接放到case4里了,变成[4, 9]和[7, 7]共存 3) 当前插入的key与后面的interval重叠 put(val, 后一个的end) remove(后一个的key) 4) 当前插入的key不和任何已存在interval重叠,直接插入,按题意value设为key值 class SummaryRanges { TreeMap

java实现数据结构08.02(堆详解代码之基于最大堆自定义优先队列)

一笑奈何 提交于 2019-12-19 01:40:14
阅读本文章前请先阅读 java实现数据结构08.01(堆详解代码之自定义最大堆) 基于最大堆自定义优先队列 /** * @description: 优先队列,基于最大堆实现自定义优先队列 * @author: liangrui * @create: 2019-12-18 12:15 **/ public class PriorityQueue < E extends Comparable < E > > implements Queue < E > { private MaxHeap < E > maxHeap ; public PriorityQueue ( ) { maxHeap = new MaxHeap < > ( ) ; } @Override public void enqueue ( E e ) { maxHeap . add ( e ) ; } @Override public E dequeue ( ) { return maxHeap . extractMax ( ) ; } @Override public E getFront ( ) { return maxHeap . findMax ( ) ; } @Override public int getSize ( ) { return maxHeap . getSize ( ) ; } @Override

并发编程(十四)—— ScheduledThreadPoolExecutor 实现原理与源码深度解析 之DelayWorkQueue

六月ゝ 毕业季﹏ 提交于 2019-12-14 19:59:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 目录 什么是堆? 满二叉树 完全二叉树 堆的实现 最大堆的插入(ADD) 最大堆的删除(DELETE) DelayedWorkQueue类 属性 插入元素方法 等待获取队列头元素 超时等待获取队列头元素 推荐博客 总结 正文 我们知道线程池运行时,会不断从任务队列中获取任务,然后执行任务。如果我们想实现延时或者定时执行任务,重要一点就是任务队列会根据任务延时时间的不同进行排序,延时时间越短地就排在队列的前面,先被获取执行。 队列是先进先出的数据结构,就是先进入队列的数据,先被获取。但是有一种特殊的队列叫做优先级队列,它会对插入的数据进行优先级排序,保证优先级越高的数据首先被获取,与数据的插入顺序无关。 实现优先级队列高效常用的一种方式就是使用堆。 回到顶部 什么是堆? 堆通常是一个可以被看做一棵树的数组对象。 堆(heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。 因为队列中允许的操作是先进先出(FIFO),在队尾插入元素,在队头取出元素。 而堆虽然在堆底插入元素,在堆顶取出元素,但是堆中元素的排列不是按照到来的先后顺序,而是按照一定的优先顺序排列的。 这里来说明一下满二叉树的概念与完全二叉树的概念。 满二叉树    除了叶子节点,所有的节点的左右孩子都不为空

海量数据处理专题4——堆

被刻印的时光 ゝ 提交于 2019-12-08 18:45:04
【什么是堆】 概念:堆是一种特殊的二叉树,具备以下两种性质 1)每个节点的值都大于(或者都小于,称为最小堆)其子节点的值 2)树是完全平衡的,并且最后一层的树叶都在最左边 这样就定义了一个最大堆。如下图用一个数组来表示堆: 那么下面介绍二叉堆:二叉堆是一种完全二叉树,其任意子树的左右节点(如果有的话)的键值一定比根节点大,上图其实就是一个二叉堆。 你一定发觉了,最小的一个元素就是数组第一个元素,那么二叉堆这种有序队列如何入队呢?看图: 假设要在这个二叉堆里入队一个单元,键值为2,那只需在数组末尾加入这个元素,然后尽可能把这个元素往上挪,直到挪不动,经过了这种复杂度为Ο(logn)的操作,二叉堆还是二叉堆。 那如何出队呢?也不难,看图: 出队一定是出数组的第一个元素,这么来第一个元素以前的位置就成了空位,我们需要把这个空位挪至叶子节点,然后把数组最后一个元素插入这个空位,把这个“空位”尽量往上挪。这种操作的复杂度也是Ο(logn)。 【适用范围】 海量数据前n大,并且n比较小,堆可以放入内存 【基本原理及要点】 最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元 素。这样最后得到的n个元素就是最小的n个。适合大数据量,求前n小,n的大小比较小的情况,这样可以扫描一遍即可得到所有的前n元素,效率很高。

海量数据处理专题(五)——堆

蓝咒 提交于 2019-12-08 18:44:18
转: http://blog.redfox66.com/post/mass-data-topic-5-heap.aspx 【什么是堆】 概念:堆是一种特殊的二叉树,具备以下两种性质 1)每个节点的值都大于(或者都小于,称为最小堆)其子节点的值 2)树是完全平衡的,并且最后一层的树叶都在最左边 这样就定义了一个最大堆。如下图用一个数组来表示堆: 那么下面介绍二叉堆:二叉堆是一种完全二叉树,其任意子树的左右节点(如果有的话)的键值一定比根节点大,上图其实就是一个二叉堆。 你一定发觉了,最小的一个元素就是数组第一个元素,那么二叉堆这种有序队列如何入队呢?看图: 假设要在这个二叉堆里入队一个单元,键值为2,那只需在数组末尾加入这个元素,然后尽可能把这个元素往上挪,直到挪不动,经过了这种复杂度为Ο(logn)的操作,二叉堆还是二叉堆。 那如何出队呢?也不难,看图: 出队一定是出数组的第一个元素,这么来第一个元素以前的位置就成了空位,我们需要把这个空位挪至叶子节点,然后把数组最后一个元素插入这个空位,把这个“空位”尽量往上挪。这种操作的复杂度也是Ο(logn)。 【适用范围】 海量数据前n大,并且n比较小,堆可以放入内存 【基本原理及要点】 最大堆求前n小,最小堆求前n大。方法,比如求前n小,我们比较当前元素与最大堆里的最大元素,如果它小于最大元素,则应该替换那个最大元 素

海量数据处理方法总结

青春壹個敷衍的年華 提交于 2019-12-08 17:59:16
下面的方法全部来自http://hi.baidu.com/yanxionglu/blog/博客 一、Bloom filter   适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集   基本原理及要点:对于原理来说很简单,位数组+k个独立hash函数。将hash函数对应的值的位数组置1,查找时如果发现所有hash函数对应位都是1说明存在,很明显这个过程并不保证查找的结果是100%正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键字。所以一个简单的改进就是 counting Bloom filter,用一个counter数组代替位数组,就可以支持删除了。   还有一个比较重要的问题,如何根据输入元素个数n,确定位数组m的大小及hash函数个数。当hash函数个数k=(ln2)*(m/n)时错误率最小。在错误率不大于E的情况下,m至少要等于n*lg(1/E)才能表示任意n个元素的集合。但m还应该更大些,因为还要保证bit数组里至少一半为0,则m应该>=nlg(1/E)*lge 大概就是nlg(1/E)1.44倍(lg表示以2为底的对数)。   举个例子我们假设错误率为0.01,则此时m应大概是n的13倍。这样k大概是8个。   注意这里m与n的单位不同,m是bit为单位,而n则是以元素个数为单位(准确的说是不同元素的个数)

数据结构--排序算法总结

拥有回忆 提交于 2019-12-07 22:04:26
原创不易,尊重原创,本文转载于 Nim的辙迹 的博文,博文地址:http://blog.csdn.net/codernim/article/details/54312616 概述 排序的分类:内部排序和外部排序 内部排序:数据记录在内存中进行排序 外部排序:因排序的数据量大,需要内存和外存结合使用进行排序 这里总结的八大排序是属于内部排序: 当n比较大的时候, 应采用时间复杂度为( nlog 2 n )的排序 算法 :快速排序、堆排序或归并排序。 其中,快速排序是目前基于比较的内部排序中被认为最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。 ——————————————————————————————————————————————————————————————————————— 插入排序——直接插入排序( Straight Insertion Sort ) 基本思想: 将一个记录插入到已排序好的有序表中,从而得到一个新的,记录数增1的有序表。 即:先将序列的第1个记录看成一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。 要点:设立哨兵,用于临时存储和判断数组边界 直接插入排序示例: 插入排序是稳定的 ,因为如果一个带插入的元素和已插入元素相等,那么待插入元素将放在相等元素的后边,所以,相等元素的前后顺序没有改变。 算法实现: [cpp]

【PTA】【数据结构与算法】堆

做~自己de王妃 提交于 2019-12-07 16:15:18
判断题 1.任何最小堆的前序遍历结果是有序的(从小到大)。 (2分) T F 2.任何最小堆中从根结点到任一叶结点路径上的所有结点是有序的(从小到大)。 (2分) T F 3.在有N个元素的最大堆中,随机访问任意键值的操作可以在O(logN)时间完成。 (2分) T F 4.一棵有124个结点的完全二叉树,其叶结点个数是确定的。 (2分) T F 5.完全二叉树中,若一个结点没有左孩子,则它必是树叶。 (1分) T F 6.完全二叉树的存储结构通常采用顺序存储结构。 (1分) T F 选择题 1.堆的形状是一棵: (2分) 选项 A 二叉搜索树 B 满二叉树 C 非二叉树 D 完全二叉树 2.创建一个初始堆,含有N个记录,其时间复杂度是: (2分) 选项 A O(logN) B O(N) C O(NlogN) D O(N 2 ) 3.哪种树,树中任何结点到根结点路径上的各结点值是有序的? (2分) 选项 A 二叉搜索树 B 完全二叉树 C 堆 D 以上都不是 4.将6、4、3、5、8、9顺序插入初始为空的最大堆(大根堆)中,那么插入完成后堆顶的元素为: (2分) 选项 A 3 B 5 C 6 D 9 5.下列的序列中,哪一组是堆? (2分) 选项 A 37,99,45,33,66,10,22,13 B 99,45,66,13,37,10,22,33 C 99,66,45,33,37

堆数据结构及其插入、提取操作图解

送分小仙女□ 提交于 2019-12-06 05:36:42
堆的特性 堆是一棵二叉树。根据根节点是最大值或最小值,分别称为最大堆或最小堆。 堆是左平衡树。随着节点增加,树会逐级从左至右增长。 堆比较好的实现方式,是采用数组实现。当i作为节点索引时,其父节点索引为(i-1)/2,其子节点索引分别为2i+1或2i+2,从而可以迅速定位。 堆的结构 这是一个包含5个节点的最大堆,根节点是所有节点的最大值。 在实现上采用数组存储每个节点,按照每一层从左往右排列。 堆的插入操作(Insert) 插入的节点首先写入数组末尾。此时的二叉树可能不满足结构特性,因此需要重组。 当前写入节点值与其父节点比较,如果大于父节点,则交换两个节点的值。(对于最小堆则是在小父节点时上移) 不断向上比较直至到达根节点,或者父节点值不再大于当前插入节点。 堆的提取操作(Extract) 堆的提取操作针对二叉树的根节点。根节点值取出后,需要补位。 首先将堆数组最后一个节点值,补位到根节点。此时对于最大堆,根节点不是最大值,需要下移重组。 将根节点与其两个子节点值进行比较,三节点最大者如果是子节点之一,则根节点与其交换位置。 递归执行上一步骤直至无子节点大于该值。 来源: https://my.oschina.net/luckysym/blog/3135911