【发布时间】:2011-01-26 10:33:36
【问题描述】:
在这里忍耐一下。
几个月前,我记得我的算法老师和我们讨论了桶排序的实现(在我的算法书中称为分布排序)以及它是如何工作的。基本上,我们不是从表面上取一个数字,而是通过二进制表示进行比较,如下所示:
// 32 bit integers.
Input: 9 4
4: 00000000 00000000 00000000 00000110
9: 00000000 00000000 00000000 00001001
// Etc.
然后从右到左开始比较。
// First step.
4: 0
9: 1
Output: 9 4
// Second step
4: 1
9: 0
Output: 4 9 // Technically a stable algorithm, but we cannot observe that here.
// Third step
4: 1
9: 0
Output: 4 9
// Fourth step
4: 0
9: 1
Output: 9 4
就是这样;其他 28 次迭代都为零,因此输出不会再改变。现在,像这样比较一大堆字符串就可以了
// strings
Input: "Christian" "Denis"
Christian: C h r i s t i a n
Denis: D e n i s
// First step.
Christian: n
Denis: s
Output: Christian, Denis
// Second step
Christian: a
Denis: i
Output: Denis, Christian
// ...
等等。
我的问题是,比较有符号字符、字节数字是否比比较整数更快?
如果我不得不假设,一个 1 字节的字符比一个 4 字节的整数要快。这个对吗?我可以对 wchar_t 或 UTF-16/32 格式做出相同的假设吗?
【问题讨论】:
-
这听起来更像基数排序而不是桶排序,并且使用基数 2(基数 2)不是一个好主意。
-
我喜欢你的导师如何将基本的、恒定的时间比较变成线性比较。我必须承认,我从未考虑过这样做。
-
真的吗?我还没有真正见过基数排序——我的教授告诉我们他不会和我们一起做那个,因为它们太相似了。第一个例子和他给我们的几乎一模一样。