给定的是一个大小为 n 的数组,它被分成大小为 k 的 n / k 区间。每个区间中的值大于其左侧区间中的值,小于右侧区间中的值。我希望在最短的时间内对这些值进行排序。
我想到的天真解决方案只是对每个区间中的所有值进行排序,这些值将“花费” O(k log k),所有 n的总成本/ k O(n log k)的间隔。我想知道是否有更高效的东西。
现在我知道在每个区间我只有 log log k 不同的值,我需要提出一个更快的算法。我很乐意帮助你。
谢谢!
答案 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 sort或bucket sort
对于每一个,总费用为O(n/k * k) = O(n)
然后将每个间隔合并为O(n)
总计。您的算法将是O(n) + O(n) = O(n)
算法。
注意:如果您可以利用并行性,则可以并行对所有间隔进行排序,总成本为O(k)
。虽然您的算法仍然是O(n)
(因为合并),但它会有较小的常数因子。