【问题标题】:Is it possible to write generic bucket sort?是否可以编写通用桶排序?
【发布时间】:2014-06-24 19:54:36
【问题描述】:

众所周知,桶排序算法非常高效:它的运行时间约为 O(N + m),其中 N 是要排序的项目数,m 是使用 fpr 排序的数组大小。问题是它只适用于有限的一组键:整数,它们填充到我们数组的大小中。

问题:有没有办法将它用于任意类型的密钥?

例如,如果我们有一些任意键,我们可以使用它的哈希码作为桶索引。当然,我们需要保留规则:if key1 > key2 then hashcode1 > hashcode2 etc

有可能实现吗?

例如,如果我们需要对字符串进行排序,很容易获得从其字符表示构建的字符串的桶索引。

【问题讨论】:

  • 如果有函数f(k) -> a[0..m](这样可以保持排序)。一个问题是桶排序不如 m >> N 那样理想。
  • 要求相反的规则更实用:如果 hashcode(k1) > hashcode(k2) then k1 > k2,但这意味着你需要在桶内进行二次排序。

标签: algorithm sorting bucket-sort


【解决方案1】:

您提供的运行时间 - O(n + M) - 并且您说该算法仅适用于整数这一事实让我认为您指的是 counting sort 而不是桶排序。如果您想知道是否总是有可能找到一种方法来为对象提供任意索引(如哈希码)以便它们可以计数排序,那么答案是,并不总是可以做到这一点。

以字符串为例。假设我们有一些从字符串到整数的映射,这样如果 str1

k = 代码("b") - 代码("") - 1

这是 code("") 和 code("b") 之间的整数个数,互斥。

接下来,考虑字符串“a”、“aa”、“aaa”、“aaaa”等,直到我们有 k + 1 个。请注意

""

这意味着我们应该有

代码(“”)

问题是:code("") 和 code("b") 之间只有 k 个不同的整数值,但是有 k+1 个字符串需要填补这些空白。这将迫使两个字符串发生冲突并具有相同的数字代码,从而导致排序失败。

这是一个问题的原因是整数不具有与许多其他结构相同的order type,例如字符串、整数对、实数等。

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多