【问题标题】:Sort n numbers between [0,n^2 - 1] in O(n)? [duplicate]在 O(n) 中对 [0,n^2 - 1] 之间的 n 个数字进行排序? [复制]
【发布时间】:2012-08-20 17:19:18
【问题描述】:

可能重复:
An array of length N can contain values 1,2,3 … N^2. Is it possible to sort in O(n) time?

给定 n 范围内的 [0,n^2 -1] 数字,我们如何在 O(n) 运行时对它们进行排序?

我感觉解决方案涉及 radix sort ,但我仍然缺少一些东西。

n 数字是整数。

有什么想法吗?

备注:不是作业!

问候

【问题讨论】:

  • 没有空间限制吗?
  • 我听说这被称为一些东西,包括桶排序和数学排序。您基本上只需分配一个与您的范围一样大的数组,将整个事物初始化为零,然后遍历未排序的集合,并在集合中的数字索引处增加数组中的值。您也可以将其扩展到稍微复杂的结构,但重要的是要注意它不能很好地扩展 - 它仅适用于数字类型并且可能需要分配巨大的数组。例如,“排序”[0,10^8-1] 范围内的 10000 个整数将需要大约 200MB 的 RAM。
  • @biziclop:与空间无关,只是 O(n) 运行时。
  • @Wug 这就是我正在考虑的解决方案,但这是否也意味着您必须搜索数组以收集结果,即 O(n^2)?
  • 另一个问题:你怎么知道它是可能的?

标签: algorithm sorting radix-sort


【解决方案1】:

实际时间将取决于您拥有的数据分布,但我会执行以下操作:

  • 制作 n 个桶。
  • 遍历每个数字并将值为 i 的元素放入存储桶 sqrt(i)。
  • 遍历每个桶,并对桶中的每个元素执行基数排序。

【讨论】:

  • 每个桶的范围为 N 阶 (sqrt(N^2-1))。基数排序需要时间 O(R N),其中 R 是在这种情况下为 lg N 的位数。在最坏的情况下,所有元素最终都在同一个桶中,所以最后一步仍然需要 O(N lg N)
  • 同意,最坏的情况仍然很糟糕。尽管如此,许多流行的算法(例如快速排序)在最坏的情况下仍然很糟糕,这就是为什么它在很大程度上取决于您的数据分布。如果范围内的数据是均匀分布的,那么每个bucket中只有一个元素,排序在O(n)内完成。
【解决方案2】:

我认为你运气不好。 基数排序是 O(k*n),其中 k 是位数。 在您的情况下,k = log(n^2),导致 O(n*log(n))。

【讨论】:

  • 存在O(n)算法,见stackoverflow.com/questions/4238460/…
  • @sdcwc - 如果您有 O(n) 解决方案,请将其作为答案发布,而不仅仅是在评论中声明其存在。关于您的特定链接,我相信如果最大位数限制为常数(例如 32 位或 64 位整数),则只有 O(n) 。对吗?
  • 在 RAM 模型中,对字长整数的操作是 O(1)。例如,二进制搜索是 O(log n) [不是 O(log^2 n) 如果你计算位操作]。我投票决定以重复的形式关闭。
  • 不应该writing down k as a base N numberO(logN) 操作吗?
  • @biziclop:这有点复杂。在 RAM 模型中,它是 O(1)。例如,二分搜索中的每一步都会计算(L+R)/2,但在分析中,假定加法是在O(1) 时间内完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2011-05-24
  • 2021-03-12
  • 2012-09-26
  • 1970-01-01
相关资源
最近更新 更多