Hash 内部散列和外部散列的区别

Hash 内部散列和外部散列的区别,hash,hashmap,hashtable,Hash,Hashmap,Hashtable,来自《数据库系统基础》一书: 内部哈希 对于内部文件,哈希通常通过使用 记录的数组。假设数组索引范围为0到M–1,如下所示: 如图17.8(a)所示;然后我们有M个插槽,其地址对应于 数组索引。我们选择一个哈希函数,将哈希字段值转换为 介于0和M之间的整数− 1.一个常见的散列函数是h(K)=K mod M函数,它返回divi之后整数散列字段值K的剩余部分- 用M表示;然后将该值用于记录地址。[……] 当要插入的记录的哈希字段值为哈希值时,会发生冲突 发送到已包含其他记录的地址 外部散列 磁盘

来自《数据库系统基础》一书:

内部哈希

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

当要插入的记录的哈希字段值为哈希值时,会发生冲突 发送到已包含其他记录的地址


外部散列

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

我有以下问题:
1) 记录总是记录在块内,因此内部哈希是否返回块地址和记录在块内的位置?
2) 为什么外部散列的冲突问题不那么严重?我的意思是,假设每个块可以存储10条记录;我推测我将存储的文件包含100条记录,然后,使用外部散列,我可能分配11-12个存储桶(我假设一个存储桶=1个块),因此散列函数将向存储桶返回10-12个地址

如果我使用内部哈希,因为哈希函数返回一个直接地址,我会使用一个返回大约100-120个地址的函数。
那么有什么区别呢?通过这种方式,我认为使用这两种方法的冲突概率是相同的。

据我所知,您可以将“外部哈希”视为“开放哈希”。在开放哈希中,我们要做的是,哈希表中的每个成员都指向一个可以存储多个键的唯一列表。因此,当发生冲突时,键被输入到哈希表元素所指向的列表中。这样就减少了冲突的可能性(这取决于列表的大小)。我发现这张幻灯片非常有用,请看一看(幻灯片编号30和32)

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

< P>当书作者考虑内部散列文件时,他们会想到在强>主内存>中对文件定义的哈希值。他们只考虑将元素分配给数组,当他们详细阐述内部散列时。此外,在编写内部哈希时,他们不会将记录放入块中,并且可能无意比较这两种类型的哈希。我们对磁盘存储感兴趣的散列是外部散列。这应该是两个问题的答案。

请说出这本书的名字。1) 实现可能会选择,甚至执行二次散列2)在我看来,你是对的。我看不出有什么不同。我加了书名。“实现可以选择,甚至可以执行二次哈希”是什么意思?这是对“记录总是记录在块内,因此内部哈希是否返回块地址和记录在块内的位置?”哈希表的实现可以选择只计算块地址并在块内执行线性搜索,也可以在块内计算地址。如果我清楚地理解,这里的内部表示内存/RAM中的某个内容,而外部表示磁盘/辅助存储中的某个内容。