散列表(hash table)

原文引用 大专栏  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 )$的一个排列。

猜你喜欢

转载自www.cnblogs.com/JimmyShen/p/11411763.html
今日推荐