Algorithm 是否可以编写通用桶排序?

Algorithm 是否可以编写通用桶排序?,algorithm,sorting,bucket-sort,Algorithm,Sorting,Bucket Sort,众所周知,bucket排序算法非常有效:它的运行时间大约为O(N+m),其中N是要排序的项目数,m是使用fpr排序的数组大小。问题是它只适用于有限的一组键:整数,它填充到数组的大小中 问题:是否有一些方法可以将其用于任意类型的密钥? 例如,如果我们有一些任意键,我们可以使用它的hashcode作为bucket索引。当然,我们需要保留规则:如果key1>key2,那么hashcode1>hashcode2等等 有可能实施这一点吗 例如,如果我们需要对字符串进行排序,那么很容易获得根据其字符表示构建

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

问题:是否有一些方法可以将其用于任意类型的密钥?

例如,如果我们有一些任意键,我们可以使用它的hashcode作为bucket索引。当然,我们需要保留规则:如果key1>key2,那么hashcode1>hashcode2等等

有可能实施这一点吗


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

您给出的运行时-O(n+M)-并且您说该算法只对整数有效,这一事实让我认为您指的是bucket sort,而不是bucket sort。如果你想知道是否总是有可能找到一种方法给对象提供任意的索引,比如散列码,这样它们就可以进行计数排序,那么答案是否定的,这样做并不总是可能的

以字符串为例。假设我们有一些从字符串到整数的映射,如果str1 k=代码(“b”)-代码(“”)-1

这是代码(“”)和代码(“b”)之间的整数数,互斥

接下来,考虑字符串“a”、“aa”、“aaa”、“aaaa”等,直到我们得到其中的k+1。注意

“a”<“aa”<“aaa”<“aaaa”<“aaaa”<“b”

这意味着我们应该

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


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

如果存在函数
f(k)->a[0..m]
(这样可以保持顺序)。一个问题是bucket排序不如m>>N理想。更实际的是需要相反的规则:如果hashcode(k1)>hashcode(k2),那么k1>k2,尽管这意味着您需要在bucket中进行二次排序。