一、概念
查找表
查找表是一个集合
静态查找表:查找完没变化
动态查找表:进行插入删除操作
主关键字
类似主键能唯一确定一个元素
平均查找长度ASL
average search length
评价查找算法的指标
查找目的
1、查询某个“特定的”数据元素是否在查找表中;
2、检索某个“特定的”数据元素的各种属性;
3、在查找表中插入一个数据元素;
4、删除查找表中的某个数据元素
二、线性表的查找
1.顺序查找(线性查找)
按照顺序一个一个查找,每次查找要比较两次,一次比较值,一次比较是否越界
可以在数组最前面加一个哨兵,优化
这样每次循环只需要比较一次
特点
优点:算法简单,逻辑次序无要求,且不同存储结构均适用。
缺点:ASL太长,时间效率太低。
2.折半查找(二分查找)
找一次缩小一半区域 但是要求有序
循环算法
递归算法
判定树
把表中的元素,根据需要查找的次数,化成二叉树
特点
优点:效率比顺序查找高。
缺点:只适用于有序表,且限于顺序存储结构(对线性链表无效)
3.分块查找(索引顺序查找)
把所有元素分块,加索引
性能分析
特点
优点:插入和删除比较容易,无需进行大量移动。
缺点:要增加一个索引表的存储空间并对初始索引表进行排序运算。
适用情况:如果线性表既要快速查找又经常动态变化,则可采用分块查找
三、树表的查找
二叉排序树
定义
左子树小于根节点,右子树大于根节点
中序遍历二叉排序树 是一个递增有序序列
查找值小于根节点,查找左子树
大于根节点,查找右子树
存储
算法
插入
插入值跟根节点比较,小往左走,大往右走
生成二叉树,就是将节点依次插入,该过程就是把一个无序序列变成有序序列
删除
1.删除叶子节点,直接删除就可以
2.要删除的节点只有左子树或者只有右子树,用孩子替换其位置就行
3.删除的节点由左右孩子,
以其中序前趋值替换之(值替换),然后再删除该前趋结点。前趋是左子树中最大的结点。
也可以用其后继替换之,然后再删除该后继结点。后继是右子树中最小的结点。
平衡二叉树
让不平衡的二叉树保持均衡,提高查找效率
定义
首先要是二叉排序树,左右子树高度差小于1
调整方法
首先降低高度,把中间值变成节点
LL型
RR型
LR型
RL型
还有B树以后学
四、散列表的查找
又叫哈希表
概念
利用要存数据的某种规律确定存储位置
散列方法
散列函数
散列方法中使用的转换函数
散列表
按照上述方法构成的表
冲突
两个不同的元素,经过散列函数计算,存在一个地址
同义词
具有相同函数值的多个关键字
如何构造好的散列函数?
(a)所选函数尽可能简单,以便提高转换速度,
(b)所选函数对关键码计算出的地址,应在散列地址集中致均匀分布,以减少空间浪费。
构造需要考虑的因素
执行速度(即计算散列函数所需时间);
关键字的长度;:
散列表的大小;
关键字的分布情况;
查找频率。
例子
特点
查找效率很高,但是空间效率低
散列函数构造方法
直接定址法
除留余数法
关键是如何选取被除数

解决冲突方法
开放定址法
探测方法
一旦发生冲突,寻找下一个地址,找到空地址存入
二次探测法
伪随机探测法
链地址法
思想
相同散列地址的记录链成一单链表
m个散列地址就设m个单链表,
然后用一个数组将m个单链表的表头指针
步骤
特点
非同义词不会冲突,无“聚集”现象
链表上结点空间动态申请,更适合子表长不确定的情况