内部哈希与外部哈希之间的区别

时间:2014-05-08 16:34:07

标签: hash hashmap hashtable

从“数据库系统基础”一书中可以看出:

内部哈希

  

对于内部文件,散列通常通过使用实现为哈希表   一组记录。假设数组索引范围从0到M-1,如   如图17.8(a)所示;然后我们有M个插槽,其地址对应于   数组索引。我们选择一个将哈希字段值转换为的哈希函数   0到M-1之间的整数。一个常见的哈希函数是h(K)= K mod   M函数,返回divi后整数哈希字段值K的余数   M;然后将该值用于记录地址。 [...]

     

当正在插入的记录的哈希字段值哈希时发生冲突   到已包含不同记录的地址。


外部哈希

  

哈希磁盘文件称为外部哈希。适合磁盘的特性   存储,目标地址空间由桶组成,每个桶都有多个   记录。存储桶是一个磁盘块或一组连续的磁盘块。该   散列函数将一个键映射到一个相对的桶号,而不是分配一个   桶的绝对块地址。文件头中维护的表会转换   将桶号放入相应的磁盘块地址中,如图所示   图17.9。   存储桶的碰撞问题不那么严重,因为尽可能多的记录   在存储桶中可以散列到同一个存储桶而不会导致问题。

我有以下问题:
1)记录总是记录在一个块内,内部哈希也会返回块地址和块内记录的位置吗?
2)为什么外部哈希的碰撞问题不那么严重?我的意思是,假设每个块可以存储10条记录;我推测我将存储的文件包含100条记录,然后,使用外部哈希,我可能分配11-12个桶(我假设一个桶= 1块),因此哈希函数将返回10-12地址到桶。
如果我使用内部哈希,因为哈希函数返回一个直接地址,我会使用一个函数返回给我大约100-120个地址。
那么有什么区别?通过这种方式,我认为使用这两种方法具有相同的碰撞概率。

3 个答案:

答案 0 :(得分:0)

正如我所理解的那样,你可以看看外部哈希'作为'打开哈希'。在开放哈希中,我们所做的是,哈希表中的每个成员都指向一个可以存储多个键的唯一列表。因此,当发生冲突时,将密钥输入到散列表元素指向的列表中。这样,碰撞的可能性就会降低(取决于列表的大小)。我发现这张幻灯片非常实用,看看(幻灯片编号30和32) - http://www.slideshare.net/gourab87/chapter13-8045092

答案 1 :(得分:0)

内部散列是一个包含散列键地址的数组。因此,每个数组索引只能包含一个哈希键的地址,因此如果另一个哈希键分配给该数组的相同索引,则会导致冲突。另一方面,外部散列主要是M的桶。每个桶可以占用多个散列密钥。因此,当铲斗装满时会发生碰撞。

答案 2 :(得分:0)

当本书的作者考虑内部哈希文件时,他们会考虑在主存储器中的文件上定义的哈希。他们在详细说明内部哈希时只考虑将元素分配给数组。此外,在编写内部哈希时,它们不会将记录放入块中,并且可能无意比较这两种哈希。我们对磁盘存储感兴趣的哈希是外部哈希。这应该是两个问题的答案。