数据结构~哈希

个人学习笔记,仅供自己查阅


哈希表

什么是哈希表?

  在前面讨论的各种结构(线性表、树等)中,记录在结构中的相对位置是随机的,和记录的关键字之间不存在确定的关系,因此,在结构中查找记录时需进行一系列和关键字的比较。这一类查找方法建立在“比较”的基础上。

  在顺序查找时,比较的结果为“=”与“!=”;在折半查找、二叉排序树查找和B-树查找时,比较的结果为“<”、“=”和“>” 3种可能。查找的效率依赖于查找过程中所进行的比较次数。

  理想的情况是希望不经过任何比较,一次存取便能得到所查记录,那就必须在记录的存储位置和它的关键字之间建立一个确定的对应关系 f,使每个关键字和结构中一个唯一的存储位置相对应。在查找时,只要根据这个对应关系 f 找到给定值K 的像 f(K)。若结构中存在关键字和K相等的记录,则必定在 f(K) 的存储位置上,由此,不需要进行比较可直接取得所查记录。在此,我们称这个对应关系 f 为哈希(Hash)函数,按这个思想建立的表为哈希表。

  • 哈希函数是一个映像,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表长允许范围之内即可;
  • 对不同的关键字可能得到同一哈希地址,即 key1 != key2,而 f(key1) = f(key2),这种现象称 冲突(collision)。

  在一般情况下,冲突只能尽可能地减少,但不能完全避免。因此,在建造哈希表时不仅要设定一个“好”的哈希函数,而且要设定一种处理冲突的方法。

  根据设定的哈希函数 $H(key)$ 和 处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像” 作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或散列,所得存储位置称为哈希地址或散列地址。

猜你喜欢

转载自www.cnblogs.com/barbarian/p/8906101.html