查找:静态查找(顺序查找、折半查找、分块查找)+动态查找(二叉排序树、平衡二叉树、B-树查找)
一、静态查找:不改变原结构的顺序。
1、顺序查找
逐个的与关键字进行比较。若找到相等的,则查找成功;反之,失败。
更适合顺序存储结构和链式存储结构的查找表
2、折半查找
给定的序列是一个有序序列。
把序列分成左中右,左<中<右;
把给定值与中间值进行比较,确定下次查找是在左还是右;
继续,知道成功或者失败。
3、分块查找
顺序查找和二分法查找的折中。先分块,在块中顺序查找。
块间有序,块内无序。
二、动态查找
在查找的同时,会改变表的结构。
比如在查找的过程中同时插入查找表中不存在的数据,或者从查找表中删除已经存在的某个数据
1、二叉排序树
左子树非空,则左子树上所有节点值都小于根节点的值;
右子树非空,则右子树上所有节点值都大于根节点的值;
左右子树本身就是两棵二叉排序树。
2、平衡二叉树
或者一棵空树
或者树中任一节点左右子树深度相差不超过1
三、hash表
散列函数:一个把查找表中的关键字映射成该关键字对应的地址的函数。Hash(key)=Addr.
冲突:散列函数可能会把两个或者两个以上的不同关键字映射到同一地址,即为冲突。这些发生碰撞的不同关键字成为同义词。
散列表:根据关键字而直接进行访问的数据结构。
建立了关键字和存储地址之间的直接映射关系。
四、Hash函数:
hash函数的方法:
1、直接地址法
H(key)=a*key+b;
2、除留余数法
H(key)=key%p;
3、数字分析法
冲突解决发方法:
拉链法
开放地址法(线性探测、平方探测、再散列法)
hash表的查找效率取决于三个隐私:散列函数、处理冲突的方法和填装因子
填装因子即为一个表的填装程度,为表中记录数n/散列表长度m。
越大,则发生冲突的可能性越大