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

How to sort n elements in range[1, logn**logn] within O(nloglogn) time complexity?

提问人:Love Cute Shiba 提问时间:9/29/2019 最后编辑:melpomeneLove Cute Shiba 更新时间:9/30/2019 访问量:640

问:

我的算法课上有问题。该问题指出:

假设给定一个 n个整数数组,其范围为 {1,...,logn**logn}。显示如何在时间 O(nloglogn) 中对这个数组进行排序。

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

算法 排序与 语言无关的 计数

评论

0赞 conditionalMethod 9/29/2019
指数是只影响 n 个,还是影响整个 log(n)?
0赞 rcgldr 9/29/2019
跟进@conditionalMethod评论,这个 log(n^(log(n)) (= log(n)^2) 还是 (log(n))^(log(n)) ?如果范围太大而无法对排序进行计数,则可以使用基数排序。
0赞 Love Cute Shiba 9/30/2019
你好。它是 log(n) 的 log(n) 的幂。[日志(n)] ^ [日志(n)]
0赞 Love Cute Shiba 9/30/2019
@rcgldr 嗨。我尝试了基数排序,这最终给了我 O(nlogn loglogn*) 。但不是 O(n*loglogn)。我仍在努力,试图找到出路

答:

0赞 rcgldr 9/30/2019 #1

假设 n 是一个整数,使得存在一个整数 x,使得 a = logx(n) 和 b = logx(a) = logx(logx(n)) 是整数,那么使用 n 作为基数,时间复杂度 O(n b) = O(n log(log(n)) 将需要 b 基数传递。算一算:

x^a = n
x^b = a
a^a = range
n^b = range of radix sort
n^b = (x^a)^b = x^(a b) = x^(a logx(a)) = x^(logx(a^a)) = a^a

n = 65536
x = 2
a = 16
b = 4
2^16 = n
2^4 = 16
a^a = range = 2^64
n^b = range of radix sort = (2^16)^4 = 2^(16 · 4) = 2^64

评论

0赞 Love Cute Shiba 9/30/2019
嗨,我不明白你是如何计算基数的。假设您使用 n 作为基础。所以我们想知道基数,这样--->n^radix = 范围内的最大数量 = logn 的 logn 的幂。
0赞 Love Cute Shiba 9/30/2019
然后我尝试求解基数。取两边的原木。基数 * n = logn * log_base n_(logn)
0赞 Love Cute Shiba 9/30/2019
但我不明白最后如何想出log(log(n))。谢谢
0赞 rcgldr 10/1/2019
@chicago - 我在数学部分展示了这一点。 a = logx(n)。b = logx(logx(n)) = logx(a) = 基数走刀数。然后在数学部分的最后一行,我展示了范围 (max+1-min) = n^b = ... = a^a = logx(n)^logx(n)。因此,当 b = logx(logx(n)) 基数传递时,每个基数传递移动 n 个元素,时间复杂度为 O(n log(log(n)))。