社区
C语言
帖子详情
在N个元素中查找第k大的元素,有什么方法最快?
lwjwj1314
2005-12-05 01:53:52
re
...全文
2237
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)
在N个乱序数字
中
查找
第k大的数字
在N个乱序数字
中
查找
第k大的数字 在N个乱序数字
中
查找
第k大的数字,时间复杂度可以减小至 O(N*logN) O(N) O(1) O(2) 答案:B 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组
中
S找出从大到小顺序的第(前)k个数的问题。 注意:题
中
只需得到最大的K个数,而不需要对后面N-K个数排序
查找
数组
中
第K大
元素
前面几篇讨论了一些常用排序算法,在此基础上刚好可以讨论一下本篇的主题。在N
个
元素
中
查找
第K大
元素
,一般比较简单的
方法
就是先快速排序,然后直接返回array[N - K]或者利用扫描法,每一次扫描都找到当前数组
中
最大的
元素
,这个其实就是部分冒泡排序。前一种算法的时间复杂度是O(NlogN),后一种算法的时间复杂度是K*N。当然,这里我们不打算具体讨论以上两种方案,接下来看看其他
方法
。
在N个数
中
查找
第K大的数字(Top K问题)
在N个乱序数字
中
查找
第k大的数字,时间复杂度可以减小至 O(N*logN) O(N) O(1) O(2) 答案:B 所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组
中
S找出从大到小顺序的第(前)k个数的问题。 注意:题
中
只需得到最大的K个数,而不需要对后面N-K个数排序 可能存在的条件限制: 要求 时间 和 空间消耗最小、海量数据、待排序的数据可能是...
【算法】在N个乱序数字
中
查找
第K大的数字
目录 1. 结论 2. 经典的几种解法 2.1 解法一:O(n*k) 2.2 解法二:O(n*logk) 2.3 解法三:O(n) 2.4 解法四:O(n*logn+k) 2.5 解法五:O(n*logn) 2.6 解法六:O(4*n+k*logn) 2.7 解法七:O(n) Reference 1. 结论 在N个乱序数字
中
查找
第k大的数字,时间复杂度可以减小至O(N)。 ...
Python实现
查找
第K小
元素
(上)--快排思想
今天抽时间实现的是
查找
第KKK小
元素
算法。 问题描述:给定线性序集
中
nnn
个
元素
和一个整数k(1<=k<=n)k (1<=k<=n)k(1<=k<=n),要求找出这nnn
个
元素
中
第kkk小的
元素
。 对于这个问题,一般可以直接想到的
方法
就是,先对这nnn个数字进行排序,然后直接选取第k
个
元素
,排序算法可以用我们之前实现过的归并排序或者快速排序,这样实现的算法时间复...
C语言
70,026
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章