【问题标题】:How to sort n elements in range[1, logn**logn] within O(nloglogn) time complexity?如何在 O(nloglogn) 时间复杂度内对 range[1, logn**logn] 中的 n 个元素进行排序?
【发布时间】:2020-01-29 00:45:43
【问题描述】:

我的算法课有问题。问题说明:

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

这是一个每周作业,这周我们主要学习堆排序和计数排序。乍一看,我看到有一个范围,所以我尝试计数排序....但是范围太大了。计数排序是 O(n+k),其中 k 是范围。这里 logn**logn 大于所需的 nloglogn。所以我觉得很失落。 所以,我们肯定不能使用比较排序,因为它的界限在 O(n logn) 以下。有人可以帮忙吗?

【问题讨论】:

  • 指数是只影响n,还是影响整个log(n)?
  • 跟进@conditionalMethod 评论,这是 log(n^(log(n)) (= log(n)^2) 还是 (log(n))^(log(n)) ? 如果计数排序范围太大,可以使用基数排序。
  • 嗨。它是 log(n) 的 log(n) 次幂。 [log(n)] ^ [log(n)]
  • @rcgldr 你好。我尝试了基数排序,这最终给了我 O(nlognloglogn*) 。但不是 O(n*loglogn)。我还在努力,试图找到出路

标签: algorithm sorting language-agnostic counting


【解决方案1】:

假设 n 是一个整数使得存在一个整数 x 使得 a = logx(n) 和 b = logx(a) = logx(logx(n)) 是整数,然后使用 n 作为基数,它需要 b 基数传递的时间复杂度 O(nb) = 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

【讨论】:

  • 嗨,我不明白你是如何计算基数的。假设您使用 n 作为基础。所以我们想知道基数这样---> n^radix = 范围内的最大数 = logn 的 logn 次方。
  • 然后我尝试解决基数。记录双方。基数 * n = logn * log_base n_(logn)
  • 但我不知道最后如何想出 log(log(n)) 。谢谢
  • @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)))。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-23
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多