ASL = ∑ p(i)c(i)(i=1,2,3,…,n)
二分(折半)查找算法的ASL:如图所示,时间复杂度为O(log2(n))
html
哈希表ASL:哈希表(Hash Table)也叫散列表,是依据关键码值(Key Value)而直接进行訪问的数据结构。它经过把关键码值映射到哈希表中的一个位置来访问记录,以加快查找的速度。这个映射函数就作散列函数。存放记录的数组叫作散列表。前端
哈希表存储的是键值对,其查找的时间复杂度与元素数量多少无关。哈希表在查找元素时是经过计算哈希码值来定位元素的位置从而直接訪问元素的,所以,哈希表查找的时间复杂度为O(1)。算法
哈希冲突的处理方法数组
一、开放定址法——线性探测法数据结构
线性探测法的地址增量di = 1, 2, ... , m-1,当中,i为探测次数。该方法一次探测下一个地址。知道有空的地址后插入。若整个空间都找不到空余的地址,则产生溢出。函数
线性探测法容易产生“冲突”现象。当表中的第i、i+一、i+2的位置上已经存储某些keyword,则下一次哈希地址为i、i+一、i+二、i+3的keyword都将企图填入到i+3的位置上,这样的多个哈希地址不一样的keyword争夺同一个后继哈希地址的现象称为“冲突”。学习
二、开放地址法——二次探测法.net
二次探測法的地址增量序列为 di = 12, -12, 22。 -22,… 。 q2, -q2 (q <= m/2)。二次探測能有效避免“汇集”现象,但是不能够探測到哈希表上所有的存储单元,但是至少能够探測到一半。
指针
三、链地址法——拉链法code
其基本思路是:将所有具备一样哈希地址的而不一样keyword的数据元素链接到同一个单链表中。假设选定的哈希表长度为m,则可将哈希表定义为一个有m个头指针组成的指针数组T[0..m-1]。凡是哈希地址为i的数据元素,均以节点的形式插入到T[i]为头指针的单链表中。并且新的元素插入到链表的前端,这不只因为方便。还因为经常发生这种事实:新近插入的元素最优可能不久又被訪问。
链地址法特色:
(1)拉链法处理冲突简单。且无堆积现象,即非同义词决不会发生冲突,所以平均查找长度较短;
(2)由于拉链法中各链表上的结点空间是动态申请的。故它更适合于造表前没法肯定表长的状况。
(3)开放定址法为下降冲突。要求装填因子α较小。故当结点规模较大时会浪费很是多空间。而拉链法中可取α≥1,且结点较大时,拉链法中添加的指针域可忽略不计,所以节省空间;
(4)在用拉链法构造的散列表中,删除结点的操做易于实现。仅仅要简单地删去链表上对应的结点就能够。而对开放地址法构造的散列表,删除结点不能简单地将被删结点的空间置为空,不然将截断在它以后填人散列表的同义词结点的查找路径。这是因为各类开放地址法中,空地址单元(即开放地址)都是查找失败的条件。
所以在用开放地址法处理冲突的散列表上运行删除操做。仅仅能在被删结点上作删除标记,而不能真正删除结点。
4、哈希表的装填因子α
装填因子(α) = (哈希表中的记录数) / (哈希表的长度)
装填因子是哈希表装满程度的标记因子。值越大。填入表中的数据元素越多,产生冲突的可能性越大。
给定关键字序列11,78,10,1,3,2,4,21,试分别用顺序查找、折半查找、散列查找(用线性探查法和链地址法)来实现查找。
请画出他们的对应存储形式(顺序查找的顺序表和两种散列查找的散列表),并求出每一种查找的成功平均查找长度。其中,散列表H(k)= k%11
课堂上作的答案如图所示:
须要改正的内容是线性探查法部分
关于这个问题,让我对Hash表查找有了更清楚的认识。
首先,咱们是在记录的存储地址中查找的,是要在存储地址和关键字序列创建一个肯定的对应关系,这样经过一次存取就能获得所查元素的查找方法。
其次,冲突也是有顺序的,当关键值序列一个一个往哈希序列中放的时候,冲突要一个一个解决,而不是把能重复的抛在一边,最后填完了全部出现的H(k)再去解决冲突。
第一次写课堂错误改正博客,感受有点开心???哈哈,但愿是最后一次啦!不过认识的更加深入啦,也算是好事呀!