从n个数中取出m个最大的最好的算法是什么?

从n个数中取出m个最大的最好的算法是什么?复杂度怎样?

有很多算法,复杂度也不尽相同。以下简单举几个例子:
1. n×m遍扫描
【算法基本描述】n×m遍扫描
【算法思想】每次都扫描一遍数组,取出最大元素,这样扫描m遍就能得到m个最大的数
【算法复杂度】O(nm)

2.排序后取最大m个数
【算法基本描述】对n个数排序,对拍完序后的序列取m个最大的数
【算法复杂度】视排序的复杂度,一般为O(nlogn)或O(n^2)

3.最小堆
【算法基本描述】一遍扫描+最小堆
【算法伪代码】
00-建立一个最小堆(优先队列),最小堆的大小控制在m之内
01-for 每个数:
02-----if 这个数比最小堆的堆顶元素大:
03---------弹出最小堆的最小元素
04---------把这个数插入到最小堆
05-最小堆中的m个元素就是所要求的元素
06-其中最小堆的作用就是保持里面始终有m个最大元素,且m个元素中最小的元素在堆顶。
【算法复杂度】O(nlogm) 遍历O(n) 最小堆O(logm)
【其他】如果要求n个数中取最小的m个,只要把算法反一下即可

总结:当n与m差不多大时,采用复杂度较低的排序是比较可取的,因为简单。当m<<n时,排序是很浪费时间的,因为我们不需要后(n-m)个数,所以可以采用最小堆的方法。
我不敢说我的算法是最好的,但是它一定是一个复杂度较低的算法。
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-10-25
最好算法:时间复杂度 O(N)

在优先级队列中,选择第k个大的元素需要O(N+klogN)的时间
利用快速排序的思想,选择问题可在O(N)的时间内解决

Quickselect(S,k) 表示从S中选出前k大个数:

如果S中的元素个数为1,可以推测出k也是1,因此我们可以返回S中的唯一元素。
在S中任意选取元素v。它是中心点。
正如快速排序所做的那样,划分S-{v}为L和R。
如果k小于等于L中的元素个数,我们正查找的项目一定在集合L中。递归调用Quickselect(L,k)。否则,如果k恰好比L中的项数多1,那么中心点就是第k个最小的元素,把它作为答案返回。否则,第k个最小的元素必定位于R中,并且它是R中第(k-|L|-1)个最小的元素,再一次,我们可以做一个递归调用并返回结果。

与快速排序的两次递归调用相比,Quickselect只做了一次递归调用。快速选择的最坏情况与快速排序的最坏情况相同,是平方的。
平均时间是线性的
第2个回答  2007-10-11
冒泡排序,产生一个从大到小递减的数组Array[n],取m个最大值就是
读出从第0个元素,到第m-1个元素。
第3个回答  2007-10-11
不复杂,
做两层循环,
内循环用来两两比较选出数组中最大的元素
当然,被选出后的元素在下次循环中不参与比较
外循环用来控制选出最大元素的次数

从n个数中取出m个最大的最好的算法是什么?
1. n×m遍扫描 【算法基本描述】n×m遍扫描 【算法思想】每次都扫描一遍数组,取出最大元素,这样扫描m遍就能得到m个最大的数 【算法复杂度】O(nm)2.排序后取最大m个数 【算法基本描述】对n个数排序,对拍完序后的序列取m个最大的数 【算法复杂度】视排序的复杂度,一般为O(nlogn)或O(n...

从n个数中取出m个数字的所有情况,用什么算法解决,哪种效率比较高呢?
(1)递归 a. 首先从n个数中选取编号最大的数,然后在剩下的n-1个数里面选取m-1个数,直到从n-(m-1)个数中选取1个数为止。b. 从n个数中选取编号次小的一个数,继续执行1步,直到当前可选编号最大的数为m。下面是递归方法的实现:\/\/\/ 求从数组a[1..n]中任选m个元素的所有组合。\/\/\/...

排列组合问题的最优解法有什么?
按照一定的顺序排列起来的总数目,用P(n, m)表示。组合是指从n个不同元素中取出m(m≤n)个元素,不考虑顺序的总数目,用C(n, m)表示。它们之间的关系为:P(n, m) = C(n, m) * m!。

排列组合公式计算公式是什么?
从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。排列和组合的算法是不同的,排列有选排列和全排列,可重复排列,不尽...

数学排列组合公式
排列数A(n,m)的具体计算方法是通过阶乘来实现的。当要从n个不同元素中取出m个元素的所有排列时,首先从n个元素中选择第一个元素,有n种选择方式;然后从剩余的n-1个元素中选择第二个元素,有n-1种选择方式;以此类推,直到选择第m个元素,此时剩余n-m+1种选择方式。因此,总的排列数为n×(n...

Cnm是什么公式
Cnm表示从n个不同元素中取出m个元素的组合数。具体公式为:Cnm = n! \/ !),其中n!表示n的阶乘,即n个数的连续乘积。这个公式用于计算组合数学中的组合数,也就是在一定数量的元素中选取固定数量的组合方式数量。这个公式的意义在于,当需要从有限数量的元素中选取一部分时,组合数公式能够帮助我们...

排列组合的公式有哪些?
\/ (n-m)!,其中“!”表示阶乘,即一个数从1乘到那个数的过程。例如,A(4,2)表示从4个不同元素中取出2个元素的排列数,计算过程为A(4,2) = 4! \/ (4-2)! = 4! \/ 2! = (4×3×2×1) \/ (2×1) = 12。组合公式,也称作组合数公式,用于计算从n个不同元素中取出m个元素的...

全排列公式是什么?
全排列是从从N个元素中取出M个元素,并按照一定的规则将取出元素排序,我们称之为从N个元素中取M个元素的一个排列,当M=N时,即从N个元素中取出N个元素的排列。以最常见的全排列为例,用 S(A)表示集合 A 的元素个数。用 1、2、3、 4、5、6、7、8、9 组成数字不重复的九位数。则每一...

排列组合公式及算法数学高考
从n个不同元素中,任取m(m≤n,m与n均为自然数)个不同的元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。二、排列组合公式 A(n,m)=n(n-1...

数学排列组合公式算法
\/[!]。这是计算排列组合的基本公式和算法。解释如下:排列的计算公式:排列是从n个不同元素中取出m个元素进行排序。比如从1到5这五个数中取出三个数进行排序,其排列数为P₅₃,表示从5个数中取3个数的所有可能的排序方式。计算时,从第一个数开始,它可以是任意数,因此有5种选择...

相似回答