学习Ruby的艰辛之路Ex39-理解bucket

学习Ruby的艰辛之路Ex39-理解bucket,ruby,data-structures,hash,buckets,Ruby,Data Structures,Hash,Buckets,谁能简单地给我解释一下桶的概念吗。我知道一个Dict是一个数组,但我一辈子都无法理解第一块代码,也无法在网上找到任何解释num_bucket的东西。如果你能逐行解释,那就太好了 module Dict def Dict.new(num_buckets=256) # Initializes a Dict with the given number of buckets. aDict = [] (0...num_buckets).each do |i| aDict.push(

谁能简单地给我解释一下桶的概念吗。我知道一个Dict是一个数组,但我一辈子都无法理解第一块代码,也无法在网上找到任何解释
num_bucket
的东西。如果你能逐行解释,那就太好了

module Dict
  def Dict.new(num_buckets=256)
  # Initializes a Dict with the given number of buckets.
  aDict = []
  (0...num_buckets).each do |i|
    aDict.push([])
  end

  return aDict
end

该代码旨在实现一个名为的数据结构。它是Ruby内置的
Hash
类的数据结构

哈希表使用键的哈希作为索引。由于可能的索引数量有限,因此会发生冲突(即不同的键具有相同的哈希)。是一种常见的冲突解决方法。钥匙被插入桶中
num_bucket
这里是bucket的数量。具有相同哈希的不同密钥位于同一个存储桶中

一个独立于以下链接的图像:


创建和初始化
aDict
本可以编写,
aDict=Array.new(num_bucket){[]}
,在这种情况下,
返回就不需要了。余,没有计算机科学背景,这是我不知道的。有趣。当水桶装满时会发生什么?(bucket会有bucket吗?)我不确定OP是否理解模块不会被混合到类中,或者模块方法是如何使用的(例如,
Dict.new(512)
,我猜)。谢谢,这非常有用@CarySwoveland通过这个单独的链接实现,一个bucket永远不会真正满,因为每个bucket都是一个链表。但是,如果密钥太多,哈希表的性能会变差,然后会发生重灰化,例如512个bucket变为1024个bucket,每个密钥都会根据新的bucket数计算出新的哈希值。使用另一种常见的开放寻址实现,bucket数组可能已满,因此在此之前必须进行重新灰化。