【问题标题】:what would be a good hash function for bucket sort?什么是桶排序的好散列函数?
【发布时间】:2015-10-10 03:19:31
【问题描述】:

首先,大多数声称实现了bucket sort 的地方实际上是在实现counting sort。我的问题是关于在Geek ViewpointWikipedia 上实现的bucket sort。我并没有真正得到/喜欢 Geek Viewpoint 上的散列函数,也没有得到 Wikipedia 上的散列函数。有人可以解释一种更简单的方法来为桶排序创建一个好的散列函数吗?一般人可以理解和记住的东西。

【问题讨论】:

  • 例如,维基百科从哪里获得 k 以调用 msbits(array[i], k)
  • 对于这个问题,k决定了桶的数量(即总共有2^k桶)。您可以将其视为哈希函数。但请注意,当size(x) 小于k 时,Wiki 中的表达式(floor(x/2^(size(x)-k))) 并不完全正确。
  • 所以你的意思是n=2^(k-1) 其中nk 都是我在维基百科示例中看到的变量?
  • 是的,n = 2^(k - 1)(或 n = 2^k,取决于您如何计算函数 msbits - 在 Wiki 中计算不正确)。
  • 啊哈,现在我也明白了...所以无论如何,Wiki 上的表达式是不正确的 - size(x) 应该是数字 x 的函数,与您如何存储它无关。

标签: algorithm sorting hash hash-function bucket-sort


【解决方案1】:

我不认为有一个普遍良好的哈希函数,这就是桶排序的问题。如果散列产生大致相等大小的桶,则它是好的,但这显然取决于您正在排序的值的分布。这就是为什么当您对分布有先验知识时,桶排序会如此有效,例如当您必须按身高对人的记录进行排序时。

此外,桶排序的最坏情况不是计数排序,正如 Geekview 链接错误地暗示的那样。最坏的情况(关于时间复杂度)是当所有元素进入同一个桶时。

当然,计数排序一种桶排序,特别是带有哈希h(x) = x的桶排序。计数排序的不同之处在于,一旦您知道您的存储桶将永远保存一个值,您就不需要存储桶来存储元素本身,只需要它们的计数。

【讨论】:

  • 关于你的第一部分,维基百科似乎认为msbits(array[i], k) 会做到这一点,不管具体情况如何。我只是不知道他们从哪里得到 k。
  • @KatedralPillon 不,这只是一个例子。构造一个输入集很容易,其中msbits() 将为每个元素返回相同的值,从而将所有内容放在同一个桶中。
猜你喜欢
  • 2020-08-26
  • 2011-12-03
  • 2012-06-21
  • 2011-05-09
  • 2017-10-15
  • 2011-01-18
  • 2010-10-14
相关资源
最近更新 更多