Hash:
散列表,把任意长度的输入,通过散列算法,变成固定长度输出,该输出结果就是散列值。这种转换是一种压缩映射,散列表的空间通常小于输入的空间,不同的输入可能会散列成相同的输出,所以不能从散列表来唯一的确定输入值,导致hash冲突。
Hash冲突:
根据key(键值)经过一个函数得到的结果作为地址去存放当前的key-value键值对,但是却发现算出来的地址已经被占用了
解决hash冲突:
- 开放定址法-当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi。
- 在hash法-这种方法就是同时构造多个不同的哈希函数: Hi=RH1(key) i=1,2,…,k。当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。
- 链地址法(java采用此种方法)-将所有哈希地址为i的元素构成一个称为同义词链的单链表,并将单链表的头指针存在哈希表的第i个单元中,因而查找、插入和删除主要在同义词链中进行。链地址法适用于经常进行插入和删除的情况。
- 建立公共溢出区-将哈希表分为基本表和溢出表两部分,凡是和基本表发生冲突的元素,一律填入溢出表。