原文引用 大专栏 https://www.dazhuanlan.com/2019/08/26/5d634caaa6a11/
直接寻址表
直接寻址表(direct-address table)是对普通数组概念的推广,直接通过key访问表中的元素,当key的全域U比较小时,直接寻址是一种简单而有效的技术。
散列表
直接寻址表的缺点很明显:当key的全域U很大时,表的大小|U|就会占用很大存储空间。
散列(hash)的原意是随机混杂和拼凑,在计算机科学中是一种极其有效和实用的技术,此技术通过散列函数,将任意长度的输入,转换为固定长度的输出(散列值)。这种转换是一种压缩映射(输出空间远小于输入空间)。
散列表(hash table)是借助散列技术实现字典操作(INSERT,SEARCH,DELETE)的一种数据结构,用散列表替代直接数组寻址(通过散列函数将key映射到存储位置,即槽(slot)),使得可以在$O(1)$时间内访问表中的任意位置。
冲突
冲突(collision):指两个key映射到同一个slot上的情况
解决冲突:有两种方法可以用来解决冲突,一种是链接法(chaining),另一种是开放寻址法(open addressing)
散列函数
- 除法散列函数(启发式方法)
$h(k) = k mod m$ - 乘法散列函数(启发式方法)
$h(k) = lfloor m(kA mod 1)rfloor $ - 全域散列函数(随机化技术)
随机选择散列函数,使之独立于存储的关键字
链接法
在链接法中,散列到同一个slot上的元素都存储到一个链表中,并将链表表头存储到slot中
开放寻址法
在开放寻址法中,所有的元素都存储在散列表里,每个表项要么为NIL要么包含动态集合的一个元素,当查找某元素时,会探查所有表项,直到找到目标元素或最终查明目标元素不在表中。在开放寻址法中,散列表可能会被填满。
探查序列(probe sequence):$( h(k,0),h(k, 1),…,h(k, m-1) )$,即$( 0,1,…,m-1 )$的一个排列。