algorithm - 对 [0,2k] 之间的一系列 n 个数字进行排序,每对之间存在 : |Ai-Aj|>=k/n

标签 algorithm sorting big-o bucket-sort

A1,A2,...,An[0,2k] 之间的实数(k 为常量)。已知对于任何一对 Ai,AJ 然后 |Ai-Aj|>=k/n,

描述一种在O(n) 运行时最坏情况下对数字进行排序的算法。

我知道答案应该是桶排序。不明白为什么,如果是这样,我该如何选择正确数量的桶? |Ai-Aj|>=k/n 实际上有什么帮助?

最佳答案

条件 |Ai - Aj| ≥ k/n 表示如果将范围 [0, 2k] 分成 2n 个不同的桶(每个桶的大小为 2k/2n = k/n),那么每个范围内最多只能有一个数字(除非可能数字位于桶的端点。)如果您更紧密地创建桶(例如,通过创建 3n 个桶),那么每个桶的大小都小于 k/n,因此最多可以包含一个数字。

然后您可以使用桶排序算法对数字进行排序:

  • 创建一个包含 3n 个桶的数组,每个桶代表范围 [(2k/3n)i, (2k/3n)(i + 1))
  • 对于每个数字:
    • 将该数字除以 (2k/3n) 以确定将其放入哪个桶中。
    • 将数字放入该桶中。
  • 对于每个桶:
    • 如果该桶不为空,则将该桶中的数字写入结果数组。

第一步需要 O(n) 时间,因为您要创建一个大小为 3n 的数组。下一步需要时间 O(n),因为您访问每个 O(n) 数字一次并在每一步做 O(1) 工作。最后一步也需要 O(n) 时间,因为您总共访问了 3n 个桶。

希望这对您有所帮助!

关于algorithm - 对 [0,2k] 之间的一系列 n 个数字进行排序,每对之间存在 : |Ai-Aj|>=k/n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17476561/

相关文章:

string - 在线性时间内找到两个序列之间的第一个元素匹配?

javascript - 验证用户 ID 的线性同余生成器的唯一性

algorithm - 标准难题的解决方案

Ruby:排序哈希数组,即使键可能不存在

php - 算法复杂度——双星是什么意思

java - 链表面试题

algorithm - 根据许多不完整的有序集恢复原始顺序

java - 重写 getColumnClass 方法后,jTable 仍然错误地对数字进行排序

algorithm - 具有不同最坏情况上限、最坏情况下限和最佳情况下限的算法示例?

performance - 这种 Big-Theta 符号的概括是否正确?