如我们所知,桶排序算法是非常有效的:它的运行时间约为O(N + m),其中N是要排序的项目数,m是使用fpr排序的数组大小。问题是它只适用于有限的一组键:整数,它填充了数组的大小。
问题:是否有一些方法可以将其用于任意类型的密钥?
例如,如果我们有一些任意的键,我们可以使用它的哈希码作为桶索引。当然,我们需要保留这个规则:如果key1 > key2,那么hashcode1 > hashcode2等等
这是可能的吗?
例如,如果我们需要对字符串进行排序,就很容易从其字符表示形式中获得字符串的桶索引。
发布于 2015-08-27 22:17:27
您给出的运行时-- O(n + M) --以及您说的算法只适用于整数的事实使我认为您指的是计数排序而不是桶排序。如果您想知道是否总是能够找到一种方法来为对象提供任意的索引,比如哈希代码,使它们能够计数排序,那么答案是否定的,这并不总是能够做到的。
以字符串为例。假设我们有从字符串到整数的映射,如果str1 < str2,那么代码(Str1)<代码(Str2)。现在,取字符串"“和"b”,确定代码(“”)和代码(“b”)。我们知道代码(“”)<代码(“b”)。现在,定义
K=代码(B)-代码(“”)-1
这是代码(“”)和代码(“b”)之间的整数数,排它。
接下来,考虑字符串"a“、"aa”、"aaa“、”aaa“等,直到我们得到它们中的k+1。请注意
“< "a”< "aa“< "aaa”< "aaaa“<”aaaa“<…< "b”。
这意味着我们应该
代码(“aaa”)<代码(“aaa”)<<.<代码(“b”)
问题是:代码(“”)和代码(“b”)之间只有k个不同的整数值,但是有一些k+1字符串需要填补这些空白。这将迫使两个字符串发生冲突,并具有相同的数字代码,从而导致排序失败。
这是一个问题的原因是,整数不具有与许多其他结构相同的订单类型,例如字符串、整数对、实数等等。
https://stackoverflow.com/questions/24395174
复制相似问题