在N个元素中查找第k大的元素,有什么方法最快?

lwjwj1314 2005-12-05 01:53:52
re
...全文
2229 38 打赏 收藏 转发到动态 举报
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)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧