如何在O(nloglogn)时间复杂度内对范围[1,logn ** logn]中的n个元素进行排序?

问题描述 投票:1回答:1

我在算法课上遇到问题。问题指出:

假定给定一个由n个整数组成的数组,范围为{1,...,logn ** logn}。显示如何在时间O(nloglogn)排序此数组。

这是每周一次的作业,本周我们主要处理堆排序和计数排序。乍一看,我看到有一个范围,所以我尝试对排序进行计数....但是范围太大。计数排序为O(n + k),其中k为范围。这里logn ** logn大于所需的nloglogn。所以我感到迷茫。因此,可以肯定地说,我们不能使用比较排序,因为它被限制在O(n logn)以下。谁能帮忙?

algorithm sorting language-agnostic counting
1个回答
0
投票

为了使时间复杂度为O(n log(log(n(n))),基数基数必须为n。

使用log2(),n = 2 ^ 16 = 65536,log2(n)= 16,范围是1到16 ^ 16 = 2 ^ 64。使用基数排序基数= n = 2 ^ 16 = 65536,基数排序需要log2(log2(2 ^ 16))= 4遍。]

使用log3(),n = 3 ^ 9 = 19683,范围是1到9 ^ 9 = 3 ^ 18。使用基数排序基= n = 3 ^ 9,需要进行log3(log3(3 ^ 9))= 2遍以进行基数排序。

© www.soinside.com 2019 - 2024. All rights reserved.