方法1:
排序后直接选出,这样时间开销为O(NlogN)
方法2:
先用选第k大元素的方法选出第k大元素(具体可以参考选第k大元素的那篇BLOG),按Knuth的说法,时间开销是O(n),这样的话,如果我们找到第n-m大的元素,设其为a,然后顺序扫描一遍原序列,即可以得到最大的m个数,这样做的前提是序列中没有重复元素。时间开销为O(n)
方法3:
构建一个m元最小堆,然后依次比较后续元素与堆顶元素的大小,如果小,则舍弃;如果大,则修改堆顶元素为新元素,然后调整堆结构。
这样做的时间开销为O(mlogm+(n-m)logm),实际当中,(n-m)logm这一项的系数应该会比(n-m)小很多。
本文探讨了在不重复元素序列中选择最大m个数的不同算法策略,包括直接排序、使用Knuth方法选出第k大元素并顺序扫描,以及构建m元最小堆进行比较筛选。详细分析了每种方法的时间复杂度,并对比了它们在实际应用中的效率。

4305

被折叠的 条评论
为什么被折叠?



