社区
C语言
帖子详情
在N个元素中查找第k大的元素,有什么方法最快?
lwjwj1314
2005-12-05 01:53:52
re
...全文
2358
38
打赏
收藏
在N个元素中查找第k大的元素,有什么方法最快?
re
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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)
查找
数组里面第k大
元素
int kthLargestElement1(int k, vector &nums) { // write your code here int L = 0; int R = nums.size() - 1; int low = L; int high = R; while (L { low = L;
在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个大的
元素
首先,我们应该设定产生随机数的序列存储在数组
中
,然后我们应该最容易想到的是排序对吧,做一个降序排序,就很容易找到第k个大的
元素
。但是用排序算法的话,时间复杂度
最快
的也是快速排序O(logn),如果我们使用分治算法求得话,会得到一个线性的时间复杂度O(n)。分治算法是将一个问题分成若干个子问题去实现。分治算法是离不开递归算法的。 怎么实现? 我们可以在数组
中
产生一个随机的下标,让他作为...
寻找数组
中
第k大的
元素
这算是一道相当经典的算法题了: 在长度为N的乱序数组
中
寻找第k(n>=k)大的
元素
。 (1)最简单直接的
方法
:先排序再找 最简单直接的想法是首先进行排序。假设
元素
的数量不大,比如才几千个,那就可以先进行排序,比如用快排或堆排,平均时间复杂度为O(N*logN),然后取出前k个,于是总时间复杂度为O(NlogN)+O(k)=O(NlogN)。当然这种做法是浪费了不少的时间的,因为题目只要...
寻找无序数组
中
的第K大
元素
分析:
方法
一:排序法,先把这个无序数组进行排序,假设按照从小到大排,则第k
个
元素
就是数组
中
的第k大
元素
。 排序的时间复杂度
最快
为o(nlogn) 下面用快速排序实现: #include<iostream> template<typename T> T partition(T* arr,int low,int high) { int tmp=arr[low]; whil...
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章