参考青岛大学–王卓老师
一、查找的基本概念
查找表:是由同一类型的数据元素(或者记录)构成的集合。
主关键字:可唯一标识一个记录的关键字是主关键字。
次关键字:用以识别若干记录的关键字成为次关键字。
查找表分为:静态查找表、动态查找表。
平均查找长度(ASL):关键字的平均比较次数。
二、线性表的查找
1.顺序查找
静态查找表,表内的元素是无序的
改进:
将key作为监视哨放在头部,当数组较长的时候,能够使进行一次的查找所需的平均时间几乎减少一半。
平均查找长度:(n+1)/2
2.折半查找(二分或者对分查找)
仅适用于有序表,相当于二分算法,仅限于顺序存储结构
非递归算法:
递归算法:
将这种性能用树来表示:
平均查找长度:
3.分块查找(索引顺序表查找)
将最大值写入一个索引表儿,将目标值与索引表中这 部分的最大值进行比较,应用于动态的
平均查找长度:对索引表的查找+对块内的查找
三种查找方式比较:
三、树表的查找
动态查找表
1.二叉排序树
左子树小于根节点,右子树大于根节点
对该树进行中序遍历,得到:3,12,24,37,45,53,61,78,90,100
递增有序
与查找的值与根节点比较,小到左子树,大到右子树
算法:利用递归思想进行查找
比较关键词的次数=树的层数
最大次数=树的深度
平均查找长度:与树的形态有关
解决方式:对树进行平衡
插入:
看一下是不是空,若空,则为根节点
非空:树中已经有则不再插入,树中没有,查找直到某个叶子结点的左子树或者右子树为空为止,插入结点为叶子结点的左孩子或者右孩子
生成:
将无序的树进行排序生成有序的,第一个为根结点,其他的往中间插入。
删除:
- 叶子结点直接删除
- 只有左子树或者右子树,则直接去除,将双亲结点的指针域的值指向被删除结点的左子树或者右子树
- 既有左子树,又有右子树,前驱替换:寻找左子树上的最大结点,替换它,将左子树中最大的删掉;后继替换:寻找右子树中最小的结点,替换它,将左子树中的最小删除了
举例:
2.平衡二叉树
平衡因子:左子树的高度-右子树的高度
定义:AVL树,平衡二叉树的平衡因子只能是-1,0,1
原则:降低高度,保持二叉排序树的性质(左子树比根小,右子树比根大)
如果两个点都失衡,则找最小的失衡子树
四、散列表(哈希)的查找
1.基本概念
对应关系–hash函数 H(key)=k
如果 H(key1)= H(key2)则出现冲突,key1和key2称为同义词
地址空间尽量少,排列尽量均匀
2.构造方法
散列函数的构造方法:
- 直接定址法
- 数字分析法
- 平方取中法
- 折叠法
- 除留余数法
- 随机数法
直接定址法(不会冲突):
hash(key)=a*key+b
除留余数法:
hash(key)=key mod p
3.处理冲突的方法
a.开放定址法
同理,伪随机探测法,di是伪随机数
b.链地址法
相同的散列地址的记录链成一个单链表,m个散列地址就设m个单链表
c.再散列法
d.建立一个公共溢出区
4.散链表的查找