Data structures 线性散列计算?
我目前正在准备考试,遇到了这个问题: (5d)假设我们使用线性散列,从一个空表开始,该表有两个bucket(M=2),split=0,负载因子为0.9。解释添加以下散列(按顺序)时的步骤: 5,7,12,11,9 对此提供的答案是: *--5-(0,1)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
*-5,7-
- 拆分-*-5,7-(0,1,2)
- 拆分-12-5-*-7-(0,1,2,3)
- 拆分=M,M=2*M,拆分=0
*-12-5--7,11-
- 拆分-*-5--7,11-12-(0,1,2,3,4)
- 拆分--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))(即数据结构的利用率)跨越某个水印时进行拆分,而不是在每次冲突时进行拆分。这称为受控拆分;前面描述的方法称为不受控拆分
- 表最初为空,有两个存储桶(N=2)
(编号为0和1)-
- N代表N桶的数量对我来说比M更有意义,所以我在回答中使用了它
- 显然,即使在表中添加了新的桶,N也不会改变
- 我们的生长因子(L代表桶Level)为0。每当表中的每个桶被拆分一次时,它就会增加,这与表的大小翻了一番的时间一致
- 步骤指针S(也称为拆分指针)指向第0个存储桶。它指示下一个将应用拆分的存储桶
- 对于期望具有正态分布的整数,一个合适的哈希函数就是只使用整数本身。对于一个输入整数I,我们的散列H(I)就是I。我认为这跟在答案键后面,这很好,因为在不知道H的情况下问题是无法回答的
- 要确定将整数I添加到哪个bucket,将使用两个函数值中的一个,这取决于赋值是指向S之前还是之后。
- 首先,计算H(I)
(nx2l),这实际上就是Imod
(nx2l)。为了简洁起见,我将在下面称之为B(I)(也用于Bucket)。称之为分配地址Amod
- 如果A大于或等于S,我们将输入I分配给地址A,然后继续
- 如果A(B(I))小于S,我们实际上使用了一个不同的散列函数,我将调用B'(I),它被计算为I
(nx2l+1),给我们一个A'的实际分配地址mod
- 我认为这样做的理由是,即使桶在一路上被拆分,也要将赋值更多地保留给桶,但我没有数学证明它的重要性
- 首先,计算H(I)
- 让
表示一个空桶,-
表示其中包含整数i
的桶,i
表示其中包含i,j
和i
的桶j
- 所以答案键“--5-(0,1)”的第一步是说bucket 0是空的,bucket 1中有5。为了清晰起见,我将其改写为
-5
- 线性散列算法将其放入第二个存储桶(索引1),因为:
- B(5)=5
(2x20)=5mod
(2x1)=5mod
2=1mod
- 1大于S,S仍然为0,因此我们使用1作为地址
- 表中现在有
(第0个桶为空,第1个桶中有5个-5
- N、 L和S不变
- B(7)=7
2=1,所以7是admod