c++求区间第k大数_寻找第K大的数的方法总结

今天看算法分析是,看到一个这样的问题,就是在一堆数据中查找到第k个大的值。

名称是:设计一组N个数,确定其中第k个最大值,这是一个选择问题,当然,解决这个问题的方法很多,本人在网上搜索了一番,查找到以下的方式,决定很好,推荐给大家。

所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。

解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k)。

解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)

解法3: 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:

1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;

2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)

解法4: 二分[Smin,Smax]查找结果X,统计X在数组中出现,且整个数组中比X大的数目为k-1的数即为第k大数。时间复杂度平均情况为O(n*logn)

解法5:用O(4*n)的方法对原数组建最大堆,然后pop出k次即可。时间复杂度为O(4*n + k*logn)

解法6:维护一个k大小的最小堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则,弹出堆顶,将当前值插入到堆中。时间复杂度O(n * logk)

解法7:利用hash保存数组中元素Si出现的次数,利用计数排序的思想,线性从大到小扫描过程中,前面有k-1个数则为第k大数,平均情况下时间复杂度O(n)

附注:

1. STL中可以用nth_element求得类似的第n大的数(由谓词决定),使用的是解法3中的思想,还可以用partial_sort对区间进行部分排序,得到类似前k大的数(由谓词决定),它采用的是解法5的思想。

2. 求中位数实际上是第k大数的特例。

《编程之美》2.5节课后习题:

1. 如果需要找出N个数中最大的K个不同的浮点数呢?比如,含有10个浮点数的数组(1.5,1.5,2.5,3.5,3.5,5,0,- 1.5,3.5)中最大的3个不同的浮点数是(5,3.5,2.5)。

解答:上面的解法均适用,需要注意的是浮点数比较时和整数不同,另外求hashkey的方法也会略有不同。

2. 如果是找第k到第m(0

解答:如果把问题看做m-k+1个第k大问题,则前面解法均适用。但是对于类似前k大这样的问题,最好使用解法5或者解法7,总体复杂度较低。

3. 在搜索引擎中,网络上的每个网页都有“权威性”权重,如page rank。如果我们需要寻找权重最大的K个网页,而网页的权重会不断地更新,那么算法要如何变动以达到快速更新(incremental update)并及时返回权重最大的K个网页?

提示:堆排序?当每一个网页权重更新的时候,更新堆。还有更好的方法吗?

解答:要达到快速的更新,我们可以解法5,使用映射二分堆,可以使更新的操作达到O(logn)

4. 在实际应用中,还有一个“精确度”的问题。我们可能并不需要返回严格意义上的最大的K个元素,在边界位置允许出现一些误差。当用户输入一个query的时候,对于每一个文档d来说,它跟这个query之间都有一个相关性衡量权重f (query, d)。搜索引擎需要返回给用户的就是相关性权重最大的K个网页。如果每页10个网页,用户不会关心第1000页开外搜索结果的“精确度”,稍有误差是可以接受的。比如我们可以返回相关性第10 001大的网页,而不是第9999大的。在这种情况下,算法该如何改进才能更快更有效率呢?网页的数目可能大到一台机器无法容纳得下,这时怎么办呢?

提示:归并排序?如果每台机器都返回最相关的K个文档,那么所有机器上最相关K个文档的并集肯定包含全集中最相关的K个文档。由于边界情况并不需要非常精确,如果每台机器返回最好的K’个文档,那么K’应该如何取值,以达到我们返回最相关的90%*K个文档是完全精确的,或者最终返回的最相关的K个文档精确度超过90%(最相关的K个文档中90%以上在全集中相关性的确排在前K),或者最终返回的最相关的K个文档最差的相关性排序没有超出110%*K。

解答:正如提示中所说,可以让每台机器返回最相关的K'个文档,然后利用归并排序的思想,得到所有文档中最相关的K个。 最好的情况是这K个文档在所有机器中平均分布,这时每台机器只要K' = K / n (n为所有机器总数);最坏情况,所有最相关的K个文档只出现在其中的某一台机器上,这时K'需近似等于K了。我觉得比较好的做法可以在每台机器上维护一个堆,然后对堆顶元素实行归并排序。

5. 如第4点所说,对于每个文档d,相对于不同的关键字q1, q2, …, qm,分别有相关性权重f(d, q1),f(d, q2), …, f(d, qm)。如果用户输入关键字qi之后,我们已经获得了最相关的K个文档,而已知关键字qj跟关键字qi相似,文档跟这两个关键字的权重大小比较靠近,那么关键字qi的最相关的K个文档,对寻找qj最相关的K个文档有没有帮助呢?

解答:肯定是有帮助的。在搜索关键字qj最相关的K个文档时,可以在qj的“近义词”相关文档中搜索部分,然后在全局的所有文档中在搜索部分。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

她在哭,但我没资格安慰她......​

1 我没资格安慰她......▼2 妈妈的关心总是突如其来▼3 突然就热得离谱了▼4 当贾玲和沈腾开始演起韩剧▼5 有些菜一旦错过就不在▼6 这要不是德高望重的长老还真带不了这样的帽子▼7 连狗都比你会放风筝▼你点的每个赞,我都认真当成了喜欢

指定的文件不是虚拟磁盘 没有快照_vmware workstaiton 15 虚拟机克隆(4)

安装客户机操作系统和应用程序可能要耗费很多时间。通过使用克隆,您可以通过一次安装及配置过程制作很多虚拟机副本。克隆虚拟机比复制虚拟机更简单、更快速。当您需要将多个相同的虚拟机部署到一个组时,克隆功能会非常有用。例如,MIS 部门可…

MySQL集群配

一.下面假设这3台服务的情况: Server1: 172.18.3.205 Server2: 172.18.3.207 Server3: 172.18.3.208 Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低,只需对Server3的系统进行很小的调整并且无需安装MySQL&#…

源码免杀处理的技巧与tips

2019独角兽企业重金招聘Python工程师标准>>> 首先,要了解编译中MAP的利用: 第一步设置VC编译环境生成Map文件。在 VC 中,点击菜单“Project -> Settings”选项页(或按下 AltF7),选择 C/C 选项卡,并在…

广东计算机专业软件排名前十大学,2017年全国计算机专业大学排名一览表

2017年全国计算机专业大学排名一览表计算机科学是一门包含各种各样与计算和信息处理相关主题的系统学科,从抽象的.算法分析、形式化语法等等,到更具体的主题如编程语言、程序设计、软件和硬件等。下面是小编收集的全国计算机专业大学排名一览表&#xff…

C# 通过正则表达式来限制控件输入有效性

,界面上允许用户输入的控件,大多是有一定限定的,比如电话号码,只允许11的数字,比如一些算法参数有取值范围限定,比如只允许[1,255]等,这种情况如果等用户输入运行后再在后台验证数据的有效性&am…

easyui数据请求两个url_jQuery Easyui datagrid连续发送两次请求问题

XXXXXX.datagrid({url: "${pageContext.request.contextPath}/xx/xx/xx,});用上述方式动态加载datagrid的数据时,通过net监听,发现调用了两遍XX方法,目前的解决方案是,将url放到datagrid初始化的时候执行。$(#XXXX).datagrid…

C# Winform编程之Button

参考了这篇文章: http://www.cnblogs.com/qianlifeng/archive/2010/04/13/1710869.html 我的代码: JButton.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.…

电热水器和插座之间的相亲故事

2019独角兽企业重金招聘Python工程师标准>>> 回到武汉,租房,然后发现原来的热水器不出水。让房产公司派师傅过来修理,终究还是放弃治疗了。不久,安装了一个新的电热水器。 我喜出望外,等了两个周&#xff0…

mysql in优化_MySQL 探秘: 1 整体架构

新开坑,计划做一系列专辑。由于 MySQL 源码太庞大,不可能面面俱到,先从丁奇《MySQL 实战 45 讲》[1] 案例开始入手,case by case 来做分享。同时强烈推荐丁奇的课,真的是受益匪浅,感谢感谢~~最新版本己经是…

清华姚班/智班2020级新生来了!中国奥数新晋“一姐”在列,湖南、湖北人数最多...

全世界只有3.14 % 的人关注了爆炸吧知识乾明 金磊 发自 凹非寺量子位 报道 | 公众号 QbitAI清华姚班/智班,又双叒叕纳一批英才。根据教育部公示的保送生拟录取名单的信息,清华大学姚班/智班2020年已拟定录取31名应届生,他们都是来自各省的顶级…

JS动态添加span等标签

今天在程序当中需要动态的往页面中添加span标签,同时需要设置span的文本,本人的JS不好,就从网上找了不少资料,多数是一样的做法,如下大体代码所示: function addTag() {var div document.createElement(&q…

成长 | 《大厂晋升指南》学习总结(下)

【学习总结】| Edison Zhou上一篇总结了面评技巧和学习方法部分,本篇总结做事方法和转向提升部分。温馨提示:文中的贴图均来自极客时间《大厂晋升指南》课程。1做事方法概要关于做事能力,有三条业界达成共识的判断标准,分别是闭环…

小学学校计算机教室使用计划,小学电脑室工作计划

以下是小编整理的2014小学电脑室工作计划、学校工作计划等,更多工作计划范文请登陆出国留学工作计划范文网(www.liuxue86.com/gongzuojihua/xuexiao/)一、指导思想:为了搞好学校信息技术教育教学管理工作,提高信息技术教学水平,以教育部制定的《中小学信息技术课程建…

自动以及手动清除手机垃圾文件

1.自动清除手机垃圾文件。 法1:用蓝牙传送一个大于手机内存的文件到手机内存中,手机会提示储存空间不足,自动清理一些隐藏的垃圾文件。 法2:传一个比较大的文件(我的机子是15【已用】117【未用】132M)&…

ubuntu流量监控_linux - 实时流量监控

前言有时候发现Linux主机的流量突然大涨,想要查看对应的IP是哪个,这时候就会用到iftop这个工具。iftop是类似于top的实时流量监控工具。可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等。安装Debian/Ubuntu/Deepinsudo apt updat…

在SD/MMC卡中可读写的FAT文件系统

2019独角兽企业重金招聘Python工程师标准>>> FAT文件系统 关于eLua中FAT文件系统的实现是使用了来自Elm Chan的一个很好的FatFS文件包。它可以在读写模式中处理FAT12,FAT16和FAT32文件系统。而且它打包了很多功能通过封装的形式。跟ROM文件系统一样它也与C库集成在一…

iphone4 短信截获

所谓的短信截获,可以被法度提前接管到,经过过滤以及响应的处理惩罚,然后发送到手机的收件箱中。 ios3上的短信截获经由过程可以经由过程一些私有的api即可完成,网上的教程也较多,这里不在反复。 前段时候在调研的ios4上…

hql取满足条件最新一条记录_MySql 之一条查询sql的执行过程

每当我把一条查询sql语句写完了,并且执行完得到想要的结果。这时我就在想为什么我写这样的一条sql语句,就能给我查询出我想要的结果,为什么我写了update就能更新一条语句?它们的执行过程是什么样的?它们的原理是什么&a…

高糊马赛克秒变高清,表情帝:这还是我吗?

全世界有3.14 % 的人已经关注了爆炸吧知识来源:机器之心参与:魔王、杜伟有了这个工具,我们终于能够看到马赛克下的那张脸了。给出一张高糊人脸照片,你能用它做什么?杜克大学近期的一项研究可以将高糊人脸照片转换成清晰…