社区
C语言
帖子详情
在N个元素中查找第k大的元素,有什么方法最快?
lwjwj1314
2005-12-05 01:53:52
re
...全文
2229
38
打赏
收藏
在N个元素中查找第k大的元素,有什么方法最快?
re
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
38 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pinelinda
2005-12-08
打赏
举报
回复
用冒泡吧,在排的过程中就找到了,或者根据情况也可以倒着冒
rockefeller8
2005-12-06
打赏
举报
回复
再说点,排序与找出第K大的元素是两个完全不同的概念。简单的说,排序需要对数据进行位置或指向的重排,而查找则不需要对元素位置或指向重排。
yuanchuang
2005-12-06
打赏
举报
回复
没时间看,Mark
rockefeller8
2005-12-06
打赏
举报
回复
如果数据较少,有限范围,先期数据处理得好,我认为哈希函数处理最快,^_^当然能不能采用哈希函数,还要看数据的特点。
xili
2005-12-06
打赏
举报
回复
stl的有个算法就是做这个的
rockefeller8
2005-12-06
打赏
举报
回复
上面改一下:“如果想找第1大的......”,原因笔误!
rockefeller8
2005-12-06
打赏
举报
回复
楼上的“回复人: foxdeng(江洋大刀) ( ) 信誉:100有意思,你不进行排序,怎么知道是第k大?你跟别人之间不互通年龄,能确定彼此的大小关系吗?”
简单举个例子:如果想找第K大的,也来先逐个排序,然后再给出最大的那个元素,是不是效率太低呀?本题的目的只是找到第K大,不需要其后的信息。至于什么样的算法最快,要依据数据的特点来定,可以对数据进行先期的处理,使得具备某种规律,然后再定算法。
foreversoft
2005-12-06
打赏
举报
回复
装入datatable 利用 select方法里的 sort 不是蛮好
lujun-cc
2005-12-06
打赏
举报
回复
楼主换个思路想:读取N个数到一个容纳K个数的缓冲区,该缓冲区按从大到小排列,那么读完这N个数之后,缓冲区中最后一个就是楼主要的数!
lxb365
2005-12-06
打赏
举报
回复
这个问题是用快速排序思想解决的典型问题,也就是用递归的办法。
codearts
2005-12-06
打赏
举报
回复
>在N个元素中查找第k大的元素,有什么方法最快?
假如只查找一次,想必直接一个一个地找是比较快的, 时间复杂度:O(n),排序怎么着也得:o(log2 N)
jordan1
2005-12-06
打赏
举报
回复
学习
vc_asm
2005-12-06
打赏
举报
回复
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我建议:n值小,用选择法选出第n大值比较快,n值大,用选择法选出第(N-n)小值比较快,至于n不大也不小,那么。。。。你们看着办吧,也许修改一下堆排序算法会比较适合,或者修改一下快速排序算法吧,只要你有时间,觉的值的花这个精力
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
vc_asm
2005-12-06
打赏
举报
回复
我建议:n值小,用选择法选出第n大值比较快,n值大,用选择法选出第(N-n)小值比较快,至于n不大也不小,那么。。。。你们看着办吧,也许修改一下堆排序算法会比较适合
DesertStorm
2005-12-06
打赏
举报
回复
azs大侠,
您的算法要搬运数据的次数算了吗?
azs
2005-12-06
打赏
举报
回复
有错误,整理一下
1、取前k个元素排好序,置于一个缓冲区dst[k]内
2、for(i=k; i<n; i++)
{
用src[i]为值在dst[]内二分查找,大于最小值就插入,挤出原来的最小值
保持dst[]内只有k个值
}
3、dst[k-1]即为所求
算法复杂度:
最差情况:O((n-k)*log(k)*k+k*k )
平均情况:自己算吧
最好情况:自己算吧
空间复杂度为 k
如果2k>n,就按第(n-k)小值方向查找(挤出大值)
令k = n-k;
1、取前k个元素排好序,置于一个缓冲区dst[k]内
2、for(i=k; i<n; i++)
{
用src[i]为值在dst[]内二分查找,小于最大值就插入,挤出原来的最大值
保持dst[]内只有k个值
}
3、dst[0]即为所求
azs
2005-12-06
打赏
举报
回复
空间复杂度为 k 或 n-k
azs
2005-12-06
打赏
举报
回复
1、取前k个元素排好序,置于一个缓冲区dst[k]内
2、for(i=k; i<n; i++)
{
用src[k]为值在dst[]内二分查找,大于最小值就插入,挤出原来的最小值
保持dst[]内只有k个值
}
3、dst[k-1]即为所求
算法复杂度:
最差情况:O((n-k)*log(k)*k+k*k )
平均情况:自己算吧
由此我们可知,k很重要,因此,如果2k>n时,就应该按第(n-k)小值来查找(挤出大值)
DesertStorm
2005-12-06
打赏
举报
回复
恩,应该是堆的方法没错了。
最好的情况下,你选择建堆的基数正好是第K大的数,那么N次比较就搞定。还有什么方法能比这个快??
azs
2005-12-06
打赏
举报
回复
楼上的别挺了!
这似乎不是查找问题吧!!!!
除非已经知道了第K元素的值,这才叫查找!
如果你确定了第K元素的值,似乎也就解决了楼主的问题!
楼主,这样理解对不对?
加载更多回复(18)
android拍照!一年后斩获腾讯T3,跳槽薪资翻倍_腾讯t3工资(1).docx
技术交流、职场规划、大厂内推、面试辅导、更多学习资源(大厂面试解析、实战项目源码、进阶学习笔记、最新讲解视频、学习路线大纲)看我
Python100-master (3)
数据库课程设计 Python100-master (3)
torch-1.8.0-cp36-arm64.whl
arm 平台 python 安装包
互联网上网服务营业场所安全管理考试习题和答案.doc
互联网上网服务营业场所安全管理考试习题和答案.doc
c语言Turbo C下写的俄罗斯方块.7z
C语言项目源码
C语言
70,020
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章