前k小元素的选择..docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
前k小元素的选择.

目录前k小的元素的选择1一、实验内容和实验要求1二、算法详细设计11.堆选择法12.快速排序法23.快速选择法2三、算法的效率分析与测试21.堆选择法22.快速排序法33.快速选择法34.几种算法的效率对比3四、算法实现清单51.堆选择法52.快速选择法73.快速排序法9前k小的元素的选择一、实验内容和实验要求名企面试考核程序员,很喜欢问关于第k 小元素、前k 小元素或前k 大元素的选择,因为在很短的时间内能考核一个程序员对算法的基本理解和在各种应用场景的选择。请用三种或以上的方法来实现“前k 小元素的选择”,并分析每一种算法的效率和优缺点。二、算法详细设计堆选择法在这里,题目要求选择前k小的元素。因此可以直接选择出前k小的元素,而不需排序。我们可以很直观地利用堆来实现这个任务。堆是一种特殊的数据结构,它可以很方便地利用数组来实现。它在物理结构上是数组,但在逻辑结构上可以将它抽象成为一颗完全二叉树,与树这种数据结构具有类似的性质。这样的话对堆的处理会方便很多。堆结构在操作系统进行基于优先级的任务调度中用得很多。此外,由于堆的性质,它还可以用来进行元素的排序,尤其是在元素数量相当庞大,甚至要利用到外部存储时,堆排序就能显出优势。堆的性质,十分适合完成前k小元素的选择。接下来我们就详细阐述利用堆对进行前k小元素选择的思路。这里有必要说一下两种类型的堆:一种堆是根节点的值是数组元素中最大的,这种叫做最大堆;另一种是根节点的值是数组元素中最小的,这种叫做最小堆。这里我们选择最大堆来进行问题的解决。首先我们先创建一个大小为k的heap数组,然后将所有的元素(个数为countOfNum)数据统统放到一个大数组elemArray中。这样就完成了初始化。接下来我们就要将大数组elemArray前k个元素加入到堆中(heap数组中),然后对堆进行调整,使之符合最大堆的要求。然后对大数组elemArray中k之后的元素ei(k=icountOfNum)逐个与堆(heap数组)中根节点的值(heap[0])进行比较。若ei大于heap[0],那么将ei加入到heap[0],然后对heap数组进行调整;若ei小于等于heap[0],则扫描elemArray中的下一元素。遍历elemArray直到i=countOfNum-1为止。此时,heap数组中的元素都是大数组elemArray中前k小的元素(heap数组中的元素无序)。快速排序法快速排序的基本思想是:每次从无序的序列中找出一个数作为中间点(可以把第一个数作为中间点),然后把小于中间点的数放在中间点的左边,把大于中间点的数放在中间点的右边;对以上过程重复log(n)次得到有序的序列。快速选择法既然是选择前K个对象,那么就没必要对所有的对象进行排序,可以采用快速选择的思想获得前K个对象,即在快速排序的基础上对递归树进行剪枝,比如首先采用快速排序的集合划分方法划分集合:S1,pivot,S2,然后比较K是否小于S1的个数,如果小于,则直接对S1进行快速排序,如果K的个数超过S1,那么对S2进行快速排序,排序完成之后,取数组的前K个元素就是数组的前K个最小值。这种实现方法肯定比第一种的全快速排序要更快速。三、算法的效率分析与测试堆选择法堆选择法的效率分析主要集中在两个方面,一个是时间复杂度的分析,另一个是空间复杂度的分析。空间复杂度很明显为O(n+k),其中n为大数组元素的数量,k为堆中元素数量。时间复杂度可以分为两部分:、初始化堆中元素的时间复杂度;、后续元素加入堆中后调整堆的时间复杂度。对于,根节点的最大调整次数为??+1,那么整个堆的调整次数不会超过k(??+1)次。对于,选出了前k个数,剩下(n-k)个元素,假设剩下的元素都会插入堆顶。那么对于每一这样的元素,调整堆的次数最大为k(??+1),因此这部分的运算次数不会超过(n-k)(??+1)。上述的和的计算次数结合到一起,得到总的计算次数不会超过n(??+1)次。明显可得堆选择法的时间复杂度为O(n)。快速排序法快速排序的时间复杂度分析:快速排序每次将待排序数组分为两个部分,在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要次划分。而在最坏情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,快速排序将不幸退化为冒泡排序,所以快速排序时间复杂度下界为O(n),最坏情况为O(n2)。在实际应用中,快速排序的平均时间复杂度为O(n)。快速排序的空间复杂度分析:就空间复杂度来说,主要是递归造成的栈空间的使用,最好情况,递归树的深度为,其空间复杂度也就为O(),最坏情况,需要进行n‐1递归调用,其空间复杂度为O(n),平均情况,空间复杂度也为O()。快速选择法快速选择的时间复杂度分析:快速选择算法其实是基于快速排序算法的分区的步

文档评论(0)

stzs + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档