您好、欢迎来到现金彩票网!
当前位置:秒速快3 > 输入优先级 >

最小的K个数(手写大顶堆和用优先级队列比较)

发布时间:2019-07-30 20:33 来源:未知 编辑:admin

  输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

  第一种方法,用优先级队列构造出最大堆,然后不断更新最大堆,每次只和堆顶比,如果比堆顶小,删除堆顶,新数入堆。但是这里利用集合并不好,手写最大堆会比这个更优,因为在超过k个数的时候,优先级队列需要poll和offer(或者add)操作,poll会下沉恢复堆有序(源码思路:将数组最后一个元素赋给堆顶,size-1,然后从堆顶往下一个个比较,相当于把堆顶往下沉,然后到合适位置,堆顶下沉只会赋值一次,并不是下沉的时候比较交换),offer会上升恢复堆有序(源码思路:从堆底往上一个个比较,相当于把堆底往上浮,堆底上浮只会赋值一次到合适位置,并不是上浮的时候比较交换),而如果手写堆实现的话,仅仅只需要将堆顶元素替换再下沉,就没有了上升恢复堆有序的环节。如果是100W个数找最小的5个数,假如情况比较糟糕,每次都需要更新最大堆堆顶,如果那么使用PriorityQueue将要多做999995(99W近100W)次上升恢复堆有序的操作。可以看一下PriorityQueue的源码就知道。

  并且最后迭代的时候要么foreach要么iterator,本质就是iterator迭代。为什么不用for循环去list.add(queue.poll())?虽然也可以出结果,但是queue的poll方法会有下沉恢复堆有序操作,而iterator不会,仅仅是遍历数组。最后返回的ArrayList是满足要求的数字但不一定有序(因为数组堆不一定有序),返回这个ArrayList,最后判题系统应该会排序后来判断结果对不对。

  PS:优先级队列的传入比较器参数new Comparator是需要在上浮和下沉的时候将回调我们重写的compare方法来构建出最大最小堆。

  这里如果pareTo(i2)那么就是构建的小顶堆(其实默认也是小顶堆),如果i2.compareTo(i1)就是大顶堆。

  原问题是:给定两个数组,求两个数组中最大的k个数刚上来看到是两个数组以为要排序,后来发现2个数组其实也只是幌子,可以使用维持一个k个数的集合,进一个(依次)出一个(最小值)的方式来解决,最后全部过滤完...博文来自:ljn799498049的专栏

  Java中的PriorityQueue是一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的Comparator进行排序,具体取决于所使用的构造方法。优先...博文来自:x_i_y_u_e的专栏

  前言前言点击此处查看:是基于堆数据...博文来自:wotchin的技术博客

  建议读者先去下载《啊哈算法》看大概在P182页的堆,什么是最小堆?ps:如果想进来学习什么是堆的童鞋们,你们不需要再继续往下面阅读啦,对你们有意义的是第一行哦~随后我将此本算法书会长传到csdn上哦~...博文来自:李静静

  //二叉堆--用于优先队列的实现//完全二叉树的I结点的两个child是I*2andI*2+1.--二叉树的性质//完全二叉树的I结点的father是I/2.--二叉树的性质//队列结构-head-...博文来自:生命有一种绝对

  优先队列优先队列中的元素会按某种优先级依次出队列,即可实现按此优先级排序,时间复杂度和堆排序差不多 优先队列的头文件 #includelt;queuegt; 优先队列的定义式1.p...博文来自:的博客

  1.大体思路队列内使用最大堆排序,将最大值放在根节点,出队操即每次取出堆顶值,并将队列长度减1;入队操作则是在队列末尾加入待入队的数字,并使用之前函数BuildMaxHeap(Arr,Len)重新建立...博文来自:Nick

  本文将概括性描述优先队列ADT,只对基本的堆数据结构做简要总结,不涉及左式堆,d-堆,斜堆,二项队列等高级数据结构。(算法入门级的总结,欢迎批评指正,根据《数据结构与算法(JAVA语言描述)》...博文来自:卷毛的博客

  优先队列与堆优先队列与堆一优先队列1.1定义1.2API1.3实现二堆2.1定义2.2表示2.3堆的有序化2.4基于堆的优先队列一优先队列1.1定义在很多应用中,我们通常需要按照优先级情况对待处理对象...博文来自:能能

  优先级队列是比栈和队列更专用的数据结构。优先级队列与上面普通的队列相比,主要区别在于队列中的元素是有序的,关键字最小(或者最大)的数据项总在队头。数据项插入的时候会按照顺序插入到合适的位置以确保队列的...博文来自:小志的博客

  优先队列简介作用代码优先队列简介是一个完全二叉树(除最后一行外,其余部分为满二叉树),且父亲永远比孩子大或小。用一个数组实现i的孩子为i*2和i*2+1,父亲为i/2。作用1.迅速输出最大值,用pop...博文来自:yzyyylx的博客

  剑指offer刷题日记29(python)题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路第一个想法是对数组进行排...博文来自:ggdhs的博客

  java自带的优先级队列默认是小顶堆,现在来写一个大顶堆的自带的优先级队列用法见之前的这篇博客:博文来自:新手lcy

  【题目】输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。【方案一】主要有两种方案。第一是利用我们熟知的partition算法,...博文来自:FreeeLinuxs blog

  堆的概念堆是将一组数据按照完全二叉树的存储顺序,将数据存储在一个一维数组中的结构。堆有两种结构,一种称为大顶堆,一种称为小顶堆,如下图。小顶堆:任意结点的值均小于等于它的左右孩子,并且最小的值位于堆顶...博文来自:Maple的博客

  题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:维护一个大小为k的最大堆,先初始化前k个数,然后滑动窗口,如果比...博文来自:benjamin.li的小屋

  优先队列:顾名思义,首先它是一个队列,但是它强调了“优先”二字,所以,已经不能算是一般意义上的队列了,它的“优先”意指取队首元素时,有一定的选择性,即根据元素的属性选择某一项值最优的出队~说到队列,我...博文来自:ac_blood的博客

  优先队列:优先队列时一种数据结构,其数据项中带有关键字,支持两种基本操作:向优先队列中插入一个新的数据项;删除优先队列中的关键字最大的数据项;优先队列数组实现:将记录存储在一个无序数组中,从数组的末尾...博文来自:Hulk

  剑指offer面试题30:最小的K个数题目:输入n个整数,找出其中最小的k个数。例如:例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4提交网址: 博文来自:dotNet匠人Bravo Yeung-羊较瘦之自留地

  1堆(heap)的简单介绍    堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:a.堆中某个节点的值总是不大于或不小于其父节点...博文来自:cqulun123的博客

  学习二叉树后,有一个东西需要我们来关注下,就是堆,对于堆,来说我们可以把堆看作一颗完全二叉树。这里我们也可以叫做二叉堆。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的...博文来自:宇哲

  思路:使用list实现优先级队列的特点就是1.父节点总是比子节点要大2.是一种完全二叉树按照以上特点1.可以得到父节点的两个子节点的index2.通过简单的对比大小,交换list中元素的位置,最后得到...博文来自:nameYX的博客

  题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。输入int[]input:待搜索的数组intk:需要找出最小的数量输出...博文来自:开心阳

  思路一:排序法, 对n个数排序,然后迭代前k个数即可,时间复杂度以快排为准是O(nlogn),代码略  思路二:局部替换法 假设前k个数就是整个数组中最小的,找出最大的数和k+1比较,如果比k+1大就...博文来自:常见的专栏

  题目寻找数组中的最小的k个数,也叫topk问题。牛客网测试地址注意:牛客网的提交需要将最终的结果排序思路快速排序的partition()方法,会返回一个整数j使得a[l..j-1]小于等于a[j],且...博文来自:楼上小宇_home

  题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。求最小k个数,或者求第k大的数,或者求第k小的数;像这类题型的解题思路...博文来自:weixin_37725502的博客

  问题描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:这个算是面试中常见题了,这里总结一下解决方法(注意判断k的合法...博文来自:SevenEleven的博客

  输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。...博文来自:明柳梦少的博客

  题目描述:输入N个数,找出其中最小的K个数。例如,输入1,2,3,4,5,6,7,8,求最小的4个数,既输出1,2,3,4。解题思路一:这道题我们最直接的想法就是将这些数按照升序排序,然后取前K个数,...博文来自:HanSion.Z

  题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。*思路一:快排*思路二:堆排解决/时间复杂度O(nlogk)适合海量数据...博文来自:xingkong930403的博客

  题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。思路:O(n)的算法,只有当我们可以修改输入的数组是可用经典常用的算法,快...博文来自:Sweet Baby,甜宝

  题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即是比...博文来自:RipL的专栏

  使用PriorityQueue实现大顶堆PriorityQueue默认是一个小顶堆,然而可以通过传入自定义的Comparator函数来实现大顶堆。如下代码实现了一个初始大小为11的大顶堆。这里只是简单...博文来自:山鬼谣弋痕夕的博客

  一、题目描述    返回数组中最小的k个数。二、解题思路    方法一:堆;             方法二:快排    方法一,堆实现:    1)整堆        2)交换堆顶和数组末尾元素,循...博文来自:菜鸟哆哆的专栏

  题目输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。法0:(最简单的思路)整体排序后取前k个数利用python自带sorted(...博文来自:张渊猛的博客

  1.题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。2.算法描述这种类型的题目都可以用排序算法做,只是时间效率有差别。...博文来自:半路出家的博客

  【剑指Offer】最小的K个数解题报告(Python)标签(空格分隔):剑指Offer题目地址:题目描述:输入...博文来自:负雪明烛

  题目描述:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个...博文来自:许文杰的博客

http://moserfarmshomes.com/shuruyouxianji/672.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有