1.基本概念
查找表:一种数据结构
静态查找表:对查找表没有修改操作;动态查找表:有
关键字:记录中某个数据项的值,用来识别某个记录
主关键字:唯一标识数据元素;次关键字:可以识别多个数据元素
评价指标:关键字的平均比较字数=平均搜索长度ASL
2.线性表的查找
①顺序查找(次序查找)
查找成功时:设概率相等-(1+2+……n)/n=(1+n)/2
查找不成功时:n+1
查找概率相等时,ASL相同;
查找概率不等时,如果从前向后查找,则按查找概率由大到小排列的有序表其ASL要比无序表ASL小。
②折半查找-适用于顺序结构的有序表
若k=R[mid].key,查找成功
若k<R[mid].key,high=mid-1;
若k>R[mid].key,low=mid+1;
直至low>high,查找失败
时间复杂度O(log2 n)高于顺序查找
3.树表的查找
二叉排序树:空树或者满足左子树值<根节点<右子树,左右子树本身也是一棵二叉排序树
中序遍历二叉树-得到一个关键字的递增序列
查找:=关键字,成功;<关键字,查其左结点;>关键字,查其右结点
插入:若树为空,插入的为根节点;否则继续在左右子树上查找;树中已有不再插入,树中没有,直至找到为空
生成:不同插入次序会生成不同形态的二叉排序树
删除:将因删除结点而断开的二叉树重新连接起来,防止重新连接的树的高度增加
最后一种情况是左右子树都不缺
平均查找长度:
提高查找效率-AVL树-平衡二叉树-所有结点的左右子树深度之差的绝对值<=1
平衡因子:该结点左子树和右子树的高度差。任意结点的平衡因子只能取-1,0,1
插入:需要调整平衡=平衡旋转
旋转:
转载:AVL旋转操作-
http://blog.csdn.net/collonn/article/details/20128205
平衡的扩充二叉树-红黑树,插入删除为O(log2 n)
根节点黑色,不允许两个红色的连一起,红色结点的两个子结点为黑色;深度特征:对于每个结点,从该结点到其所有子孙叶结点的路径中所包含的黑色结点数量必须相同
4.哈希表的查找
记录存储位置和关键字之间的对应关系Loc(i)=H(keyi)-查找速度极快O(1),效率与元素个数无关。
冲突不可避免-构造好的哈希函数和制定一个好的冲突解决方案
哈希函数构造方法:
① 直接定址法-Hash(key)=a*key+b
② 数字分析法
③ 平方取中法
④ 折叠法
⑤ (优)除留余数法-最常用-Hash(key)=key mod p (p为一整数)p<=m且为质数(m为表长)
⑥ 随机数法
冲突解决方案:-可用于建立哈希表
① 开放地址法-有冲突就寻找下一个空的哈希地址
线性探测法
Hi=(Hash(key)+di)mod m(1<=i<m,di为增量序列,di=i;1,2,……m-1),算出得到Hi值为空,则放入
二次探测法
Hi=(Hash(key)±di)mod m
其中:m为哈希表长度,m要求是某个4k+3的质数;
di为增量序列 1^2,-1^2,2^2,-2^2,…,q^2
伪随机探测法
Hi=(Hash(key)+di)mod m ( 1≤i < m )
其中:m为哈希表长度
di 为随机数
② (优)链地址法-相同哈希地址的记录链成一单链表,m个哈希地址就设m个单链表,然后用用一个数组将m个单链表的表头指针存储起来,形成一个动态的结构
ASL与装填因子 有关
ACM:判断两片雪花是否相同
采用一种折中的方案,取一个自定义的素数,尽可能大,但不又超大,如99991,即定义一个99991个空间的数组,将各雪花总长度与99991取模,作为该雪花的存放组,而每一个组采用升序链表存储。该方法即采用哈希查找方法,哈希函数为H(Key)=K%99991。