每个大小为k的问题n / k间隔排序

时间:2011-07-09 07:10:08

标签: algorithm sorting data-structures

给定的是一个大小为 n 的数组,它被分成大小为 k n / k 区间。每个区间中的值大于其左侧区间中的值,小于右侧区间中的值。我希望在最短的时间内对这些值进行排序。

我想到的天真解决方案只是对每个区间中的所有值进行排序,这些值将“花费” O(k log k),所有 n的总成本/ k O(n log k)的间隔。我想知道是否有更高效的东西。

现在我知道在每个区间我只有 log log k 不同的值,我需要提出一个更快的算法。我很乐意帮助你。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个非常难看的答案:

1. Take the first interval;
2. Since logK should be small, we allocate logK binary tree nodes, and we place the first element in the middle;
3. For the rest of the elements, we use method similar to binary search to search if it is already included, or we add this element;
4. Produce a sorted list with all the values in the interval;
5. Use Counting Sort with this list on the interval;
6. Do this for all the intervals.

用于2,3的时间是O(K * logloglogK),因为搜索最多需要logloglogK(登录loglogK元素)并重复K次。 4最多使用O(loglogK)时间遍历所有带有值的节点。 5需要O(K)时间,类似于计数排序。所以总时间应该是O(nlogloglogK)。

任何问题都欢迎,因为我真的很困,不能保证我正在思考。

答案 1 :(得分:0)

您可以在每个花费O(k)的时间间隔上使用counting sortbucket sort 对于每一个,总费用为O(n/k * k) = O(n)

然后将每个间隔合并为O(n)总计。您的算法将是O(n) + O(n) = O(n)算法。

注意:如果您可以利用并行性,则可以并行对所有间隔进行排序,总成本为O(k)。虽然您的算法仍然是O(n)(因为合并),但它会有较小的常数因子。