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

标签 algorithm sorting language-agnostic counting

我的算法课有问题。问题状态:

Assume you are given an array of n integers in the range{1,...,logn**logn}. Show how to sort this array in time O(nloglogn).

这是一个每周的作业,这周我们主要做堆排序和计数排序。嗯,乍一看我看到有一个范围,所以我尝试计数排序....但是范围太大了。计数排序是 O(n+k),其中 k 是范围。这里的 logn**logn 比要求的 nloglogn 大。所以我感到迷茫。 所以,我们肯定不能使用比较排序,因为它限制在 O(n logn) 以下。谁能帮忙?

最佳答案

假设 n 是一个整数,使得存在一个整数 x 使得 a = logx(n) 和 b = logx(a) = logx(logx(n)) 是整数,然后使用 n 作为基数,时间复杂度为 O(n b) = O(n log(log(n))。计算一下:

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

关于algorithm - 如何在 O(nloglogn) 时间复杂度内对 range[1, logn**logn] 中的 n 个元素进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58155752/

相关文章:

c++ - 将一个值限制在一个范围内(某种程度上)

javascript - 查找相加为一个数的子集的最快算法是什么?

java - 如何实现动态选择?

python - 按相似性对行和列进行排序的算法

javascript - 在 Javascript 对象数组中查找属性名称

language-agnostic - 将0转换为1,反之亦然

language-agnostic - Code Golf : Diamond Pattern

language-agnostic - 语言内语义差异

c++ - Union-find 方法性能,迭代与递归

PHP - 通过维护原始数组键按子数组值对数组进行排序