标签:style color os sp on 数据 问题 bs size
除了各种树表之外,还可以采用散列技术来表示并实现动态查找表。“散列”既是一种存储方式,又是一种查找方法。这种查找方法称为散列查找。按散列存储方式构造的存储结构称为散列表。散列技术的核心是散列函数。散列函数是一种将键值映射为散列表中的存储位置的函数。对任意给定的动态查找表T,如果选定了某个“理想的”散列函数H及相应的散列表L,则对T中的每个数据元素X,函数值 H(X.key)就是X在散列表L中的存储位置。插入(或建表)时数据元素X将被安置在该位置上,并且查找X时也到该位置上去查找。
由散列函数决定的数据元素在散列表中的存储位置称为散列地址。因此,散列的基本思想是通过由散列函数决定的键值(X.key)与散列地址(H(X.key))之间的对应关系来实现存储组织和查找运算。
在理想的情况下,散列函数是一个一一对应,即每个键值对应于一个散列地址,且不同的键值对应不同的散列地址。但在实际应用中,这种情况很少出现。在大多数情况下,出现“同义词”并发生“冲突”是不可避免的。
设有散列函数H和键值k1、k2,若k1<>k2且H(k1)=H(k2),则称k1、k2是(相对于H的)同义词。假如动态查找表中有两个数据元素X1、X2存入同一个散列表,而且它们的键值是同义词,这种情况称为冲突。
当然,我们希望同义词尽量少以便减少冲突。另一方面,由于冲突的不可避免性,又必须考虑在冲突发生时的处理办法。因此,采用散列技术时需要考虑的两个问题是:
①如何构造(选择)"均匀的"散列函数?
②用什么方法解决冲突?
当然,还需考虑散列表本身的组织方法。下面分别加以讨论。
在开散列表中,所有键值为同义词的数据元素存在同一个同义词子表中,而地址向量中的元素是些同义词子表的表头指针。这就是开散列表解决冲突的方法。这一方法有时称为“拉链法”。具体的散列函数、散列表和处理冲突的方法这三个密相关的部分或方面确定了动态查找表的一个具体的散列存储结构。在此基础之上,可以进一步考虑动态查找表基本运算的实现。
需要补充说明的是,线性探测法和二次探测法在本书中是作为闭散列表的解决冲突的方法而提出的。但在某些教科书上,这两种方法又称为"开放定址法"。注意不要将这种"开放"(其含义为散列地址对一切数据元素开放)与本书的"开散列表"(其含义为散列表的存储空间是开放的)相混淆。
标签:style color os sp on 数据 问题 bs size
原文地址:http://blog.csdn.net/u014488381/article/details/42012249