数据结构与算法(十八)散列表的查找

散列表:记录的存储位置关键字之间存在对应关系--hash函数(哈希=散列)

        Loc(i)=H(keyi)

        特点:查找效率高(直接访问对应的位置),空间效率低

概念:

        散列方法(杂凑法):选取某个函数,依该函数按关键字计算元素的存储位置,并按此存放;

                查找时,由同一个函数对给定值k计算地址,将k与地址单元元素关键码进行比对,确定是否成功

        散列函数(杂凑函数):散列方法中使用的转换函数

        冲突:key1≠key2,但是H(key1)=H(Key2)<不同关键码映射到一个散列地址>

        同义词:具有相同函数值的多个关键字

使用散列表的关键:

        1.构造好的散列函数

                a.选择的散列函数尽可能简单,以便于提高转换速度

                b.所选函数对关键码计算出的地址,应在散列地址集中均匀分布,以减少空间浪费

        2.制定好的解决冲突的方案

                如果从散列函数计算出的地址查不到关键码,应当依据解决规则,有规律的查询其他相关单元。

需要考虑的因素

        1.执行速度

        2.关键字长度

        3.散列表大小

        4.关键字的分布情况

        5.查找频率

要求:

        1.地址空间尽量小        2.要均匀

构造散列函数的方法:

                1.直接定址法        2.数字分析法        3.平方取中法

                4.折叠法        5.除留余数法        6.随机数法

        直接定址法:

                Hash(key) = a·key + b(a,b为常数)

                优点:不会产生冲突,但要占用连续地址空间,空间效率低

        除留余数法:

                Hash(key) = key mod p        (p为一个整数)

                关键:取合适的p        通常设 p≤m且为质数(m为表长)

解决冲突的方法:

             1.开放定址法        2.链表地址法(拉链法)        3.再散列法(双散列函数)

              4.建立公共溢出区

        开放定址法

                有冲突时去寻找下一个空的散列地址,只要散列地址足够大,就能找到空的散列地址将数据元素存入

                H_{i}=(Hash(key)+d_{i}) mod m        d_{i}为增量序列

                常用方法:      线性探测法:d_{i}为1,2...m -1线性序列

                                        二次探测法:d_{i}为1^2 ,-1^2 , 2^2 ,-2^2 ...q^2二次序列

                                        伪随机探测法:d_{i}为伪随机数 

        链地址法:

                将相同散列地址的记录链成一个单列表

                优点:非同义词不会冲突,无“聚集”现象        链表上动态申请,更适合于表长度不确定的情况

查找:

数据结构与算法(十八)散列表的查找_第1张图片

        线性探测法

数据结构与算法(十八)散列表的查找_第2张图片

         拉链法

数据结构与算法(十八)散列表的查找_第3张图片

 散列表的ASL取决于:1.散列函数        2.处理冲突的方法        3.装填因子α

                α=表中填入的记录数/哈希表的长度

        α越大,表中记录数越多,说明表装的越满,冲突发生的概率越大,查找时次数就越多

数据结构与算法(十八)散列表的查找_第4张图片

         散列表技术具有很好的平均性能,优于一些传统技术

        链地址法优于开地址法

        除留余数法作为散列函数优于其他类型函数

你可能感兴趣的:(学习笔记,数据结构,算法,机器学习)