如何在3n + o(n)比较中完成?
我试图获取一个大小为7的数组(a [6])并遍历给定的数组。然后按照排序顺序将元素插入到[]中(在第一个7之后的每个插入的6log(6)比较和之前的o(6))。所以总比较= n-7(7log(7))+ 6( 6 + 1)/ 2比我想要的要大。有人可以描述一种算法来解决这个问题吗?
答案 0 :(得分:2)
让我们遍历输入数组A
并在每次迭代时维护包含7个最小元素的有序数组smallest
:
smallest = [INF, INF, INF, INF, INF, INF, INF]
for each Number in A
find the insert position of the Number (if any) in the smallest array with binary
search (3 comparisons)
insert to the smallest if needed (0 comparisons)
最后,我们有7个最小元素,比较总数为3*n
。
如果我们没有INF
模拟元素,我们可以先获取7个元素并对它们进行排序(这种类型为O(1)
),然后遍历数组的剩余部分。在这种情况下,比较次数等于(n-7)*3 + O(1) = 3*n + O(1)
答案 1 :(得分:0)
您可以使用QuickSelect算法(https://en.wikipedia.org/wiki/Quickselect)。平均运行时间为O(n)。
- 无,也没有时间限制,但比较次数应在3n + o(n)之内。
- 它可以使用任何空间和时间。
您还提到,只要您满足比较要求的数量,就没有时间要求。有一些排序算法可以进行零元素比较。如果您的数据是整数,则可以使用基数排序(https://en.wikipedia.org/wiki/Radix_sort)。