在 O(n) 时间内找到数组中的 10 个最大整数

Posted

技术标签:

【中文标题】在 O(n) 时间内找到数组中的 10 个最大整数【英文标题】:finding 10 largest integers in an array in O(n) time 【发布时间】:2016-09-13 03:54:57 【问题描述】:

令 S 是一组存储在数组中的 n 个整数(不一定是排序的)。设计一个算法来找到 S 中的 10 个最大整数(通过创建一个长度为 10 的单独数组来存储这些整数)。您的算法必须在 O(n) 时间内完成。

我想我可以通过使用计数排序然后将最后 10 个元素添加到新数组中来回答这个问题。但显然这是错误的。有谁知道更好的方法吗?

【问题讨论】:

在新数组中添加前 10 个数字。然后只需扫描剩余的元素并不断更新新数组。 简单,谢谢! 等待我不确定这个工作? 可能是en.wikipedia.org/wiki/Quickselect? 【参考方案1】:

方法一: 您可以使用 FindMax() 算法在 O(N) 中找到最大数,如果您使用了 10 次:

10 * O(N) =O(N)

每次找到 max num 时将其放入新数组中,下次使用 FindMax(); 时将忽略它

方法二:

您可以使用 Bubble 10 次:

1) Modify Bubble Sort to run the outer loop at most 10 times.
2) Save the last 10 elements of the array obtained in step 1 to the new array.

10 * O(N) =O(N)

方法三:

你可以使用MAX Heap:

1) Build a Max Heap in O(n)
2) Use Extract Max 10 times to get 10 maximum elements from the Max Heap 10
* O(logn)

 O(N) + 10 * O(logN) = O(N)

【讨论】:

【参考方案2】:

访问:

http://www.geeksforgeeks.org/k-largestor-smallest-elements-in-an-array/

他们为此提到了六种方法。

【讨论】:

【参考方案3】:

使用order statistic 算法查找第 10 大元素。 接下来,遍历数组以查找小于/等于它的所有元素。

时间复杂度:O(n) 用于顺序统计 + O(n) 用于迭代数组一次 => O(n)

【讨论】:

这种情况下最坏的情况几乎是 O(N^2) @OneManCrew 在最坏的情况下是 O(n)。 cse.ust.hk/~dekai/271/notes/L05/L05.pdf【参考方案4】:

将它们插入平衡二叉树中。 O(N) + O(lg2 N)。

【讨论】:

以上是关于在 O(n) 时间内找到数组中的 10 个最大整数的主要内容,如果未能解决你的问题,请参考以下文章

查找O(n)时间中的n个最大条目

Python 给定一个包含 N 个整数的数组 A,返回在 O(n) 时间复杂度内不会出现在 A 中的最小正整数(大于 0)

谷歌面试:在给定的整数数组中找到所有连续的子序列,其总和在给定范围内。我们能比 O(n^2) 做得更好吗?

java - 如何使用PriorityQueue集合从Java中的给定数组在O(n)时间内构建最大堆?

我们如何在 O(n) 时间和 O(1) 空间复杂度内找到数组中的重复数字

如何在未排序数组的情况下找到未排序数组中的第k个最小整数?