Data structures 线性散列计算?

Data structures 线性散列计算?,data-structures,hash,hashtable,Data Structures,Hash,Hashtable,我目前正在准备考试,遇到了这个问题: (5d)假设我们使用线性散列,从一个空表开始,该表有两个bucket(M=2),split=0,负载因子为0.9。解释添加以下散列(按顺序)时的步骤: 5,7,12,11,9 对此提供的答案是: *--5-(0,1) *-5,7- 拆分-*-5,7-(0,1,2) -12*-5,7--- 拆分-12-5-*-7-(0,1,2,3) 拆分=M,M=2*M,拆分=0 *-12-5--7- *-12-5--7,11- 拆分-*-5--7,11-12-(0

我目前正在准备考试,遇到了这个问题:

(5d)假设我们使用线性散列,从一个空表开始,该表有两个bucket(M=2),split=0,负载因子为0.9。解释添加以下散列(按顺序)时的步骤:

5,7,12,11,9

对此提供的答案是:

*--5-(0,1)
*-5,7-

  • 拆分-*-5,7-(0,1,2)
-12*-5,7---

  • 拆分-12-5-*-7-(0,1,2,3)
  • 拆分=M,M=2*M,拆分=0
*-12-5--7-
*-12-5--7,11-

  • 拆分-*-5--7,11-12-(0,1,2,3,4)
-*-5,9--7,11-12-

  • 拆分--9*-7,11-12-5-(0,1,2,3,4,5)
这个答案对我来说没有任何意义,讲师也没有经历过


如何解决这个问题?

我编辑了您的问题,因为在执行每个操作时,答案看起来像是哈希表状态的描述列表。你的教授有没有研究过线性散列?该模型精确地提到了一个负载系数,但它位于。它是发生受控拆分时的积分。我还发现了以下描述:

让l表示线性散列方案的负载因子,即l=s/b,其中s是记录总数,b是使用的存储桶数

张等人(PDF)

  • 线性散列算法以确定的顺序执行拆分,而不是在溢出的存储桶处进行拆分。拆分按线性顺序执行(首先是铲斗0,然后是铲斗1,然后是2,…),当任何铲斗溢出时执行拆分。如果溢出的桶不是拆分的桶(这是常见的情况),则会使用诸如链接之类的溢出技术,但常见的情况是需要很少的溢出桶
剪断

  • 您可以在“加载”(即存储的字节数/(num bucket*bucket size))(即数据结构的利用率)跨越某个水印时进行拆分,而不是在每次冲突时进行拆分。这称为受控拆分;前面描述的方法称为不受控拆分
Witold Litwin,摘要:Steve Gribble和Armando Fox,在线Berkley.edu于6月16日检索

因此,基本上,负载系数是一种可预测地控制何时发生分裂的方法。线性散列的一个实现似乎被称为“非受控拆分”,它添加一个新的bucket,并在发生冲突时执行拆分。使用0.9的负载系数,只有当90%的表存储桶已满时才会发生拆分,或者更确切地说,根据存储桶均匀分配到的预测,存储桶已满

基于这一点和我刚刚读到的维基百科文章,设置如下:

  • 表最初为空,有两个存储桶(N=2)
    -
    (编号为0和1)
    • N代表N桶的数量对我来说比M更有意义,所以我在回答中使用了它
    • 显然,即使在表中添加了新的桶,N也不会改变
  • 我们的生长因子(L代表桶Level)为0。每当表中的每个桶被拆分一次时,它就会增加,这与表的大小翻了一番的时间一致
  • 步骤指针S(也称为拆分指针)指向第0个存储桶。它指示下一个将应用拆分的存储桶
下面是我在上面链接的维基百科文章描述。现在我们需要讨论散列和桶分配

  • 对于期望具有正态分布的整数,一个合适的哈希函数就是只使用整数本身。对于一个输入整数I,我们的散列H(I)就是I。我认为这跟在答案键后面,这很好,因为在不知道H的情况下问题是无法回答的
  • 要确定将整数I添加到哪个bucket,将使用两个函数值中的一个,这取决于赋值是指向S之前还是之后。
    • 首先,计算H(I)
      mod
      (nx2l),这实际上就是I
      mod
      (nx2l)。为了简洁起见,我将在下面称之为B(I)(也用于Bucket)。称之为分配地址A
    • 如果A大于或等于S,我们将输入I分配给地址A,然后继续
    • 如果A(B(I))小于S,我们实际上使用了一个不同的散列函数,我将调用B'(I),它被计算为I
      mod
      (nx2l+1),给我们一个A'的实际分配地址
    • 我认为这样做的理由是,即使桶在一路上被拆分,也要将赋值更多地保留给桶,但我没有数学证明它的重要性
我认为上面答案符号中的*表示拆分指针s的位置。在我对下面问题的其余部分的符号中:

  • -
    表示一个空桶,
    i
    表示其中包含整数
    i
    的桶,
    i,j
    表示其中包含
    i
    j
    的桶
  • 所以答案键“--5-(0,1)”的第一步是说bucket 0是空的,bucket 1中有5。为了清晰起见,我将其改写为
    -5
我想你的答案是这样的:

  • 将5添加到表中。
    • 线性散列算法将其放入第二个存储桶(索引1),因为:
    • B(5)=5
      mod
      (2x20)=5
      mod
      (2x1)=5
      mod
      2=1
    • 1大于S,S仍然为0,因此我们使用1作为地址
    • 表中现在有
      -5
      (第0个桶为空,第1个桶中有5个
    • N、 L和S不变
  • 将7添加到表中

    • B(7)=7
      mod
      2=1,所以7是ad