查找表是由同一类型的数据元素构成的集合。
对查找表的操作:
1、查询某个特定的数据元素是否在查找表中。
2、查询某个特定的数据元素的各种属性 。
3、在查找表中插入一个数据元素。
4、在查找表中删除一个数据元素。
查找表的分类
静态查找表:仅作查询和检索操作的查找表。
动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素。
主关键字:可以识别唯一的一个记录的关键字。
次关键字:能识别若干记录的关键字。
查找:根据给定的某个值,在查找表中去确定是否存在一个关键字等于给定值的数据元素。
顺序查找算法是顺序表的查找方法。
在顺序查找算法中,以顺序表或线性表来表示静态查找表。
顺序查找算法:
1、从表中最后一个记录开始。
2、逐个进行记录的关键字和给定值的比较。
3、若某个记录比较相等,则查找成功。
4、若直到第1个记录都比较不等,则查找不成功。
设置”哨兵“的目的是省略对下标越界的检查,提高算法执行速度。
优点:简单、适应面广
缺点:平均查找长度较大,特别是当n很大时,查找效率很低。
折半查找:
折半查找是有序表的查找方法。
折半查找的原理是:
1、先确定待查记录所在的范围(前半部分或后半部分)
2、逐步缩小一半范围直到找(不)到该记录为止。
优点:查找效率比顺序查找高(特别是在静态查找表的长度很长时)
缺点:折半查找只能适用于有序表,并且以顺序存储结构存储。
二叉排序树
空树或者是具有如下特性的二叉树:
1、若它的左子树不空,则左子树上所有结点的值均小于根结点的值。
2、若它的右子树不空,则右子树上所有结点的值均小于根结点的值。
3、它的左、右子树也都分别是二叉排序树。
二叉排序树又称二叉查找树
查找算法:给定值与根结点比较
1、若相等,则查找成功。
2、若小于,则查找左子树。
2、若大于,则查找右子树。
二叉排序树是一种动态查找表,当树中不存在查找的结点时,作插入操作。
新插入的结点一定是叶子结点(只需改动一个结点的指针)
该叶子结点是查找不成功时路径上访问的最后一个结点左孩子或者右孩子(新结点值小于或大于该结点值)
二叉排序树的删除
1、被删除结点是叶子结点。
直接删除结点,并让其父结点指向该结点的指针变为空。
2、被删除结点只有左子树或右子树。
删除结点时,让其父结点指向该结点的指针指向其左子树(或右子树),即用孩子结点替代被删除结点即可。
3、被删除结点既有左子树,又有右子树。
以中序遍历时的直接前驱替代被删除结点,然后再删除该直接前驱。
特点:
1、一个无序序列可以通过构造一棵二叉排序树而变成有序序列(通过中序遍历)
2、插入新记录时,只需改变一个结点的指针,相当于在有序序列中插入一个记录而不需要移动其它记录。
3、二叉排序树既拥有类似折半查找的特性,又采用了链表作存储结构。
4、但当插入记录的次序不当时(如升序或降序),增加了查找时间。
平衡二叉树(AVL树)是二叉排序(查找)树的另一种形式。
平衡因子:一个结点左子树的高度减去右子树的高度所得的差值。
AVL树任一结点的平衡因子只能取-1,0,1。
每插入一个新结点时,AVL树中相关结点的平衡状态可能发生改变。
所以在插入一个新结点后,需要从插入位置沿通向根的路径回溯,检查各结点的平衡因子。
如果在某一结点发现高度不平衡,停止回溯。
从发生不平衡的结点其,沿刚才回溯的路径取直接下两层的结点。
平衡化旋转(处理)有两类:
1、单向旋转
2、双向旋转
哈希表(散列表)是一种直接计算记录存放地址的方法,它在关键码与存储位置之间直接建立了映象。
哈希查找是利用哈希函数进行查找的过程。
不同的记录,其关键字通过哈希函数的计算,可能得到相同的地址。
把不同的记录映射到同一个散列地址上,这种现象成为冲突。
哈希函数的要求:
哈希函数应该是简单的,能在较短的时间内计算出结果。
哈希函数的定义域必须包括需要存储的全部关键字。
哈希函数计算出来的地址应该能均匀分布在整个地址空间中。
除留取余法:取关键字被某个不大于哈希表长m的数p除后所得余数为哈希地址。(p为不大于m的素数)
除留取余法是一种最简单、最常用的构造哈希函数的方法。
处理冲突的实际含义:为产生冲突的地址寻找下一个哈希地址。
1、开放定址法
线性探测再散列:
二次探测再散列:
优点:只要哈希表有空位置,总能找到一个不发生冲突的地址。
缺点:容易产生“二次聚集”,即在处理同义词的冲突过程中,又添加了非同义词的冲突,对查找不利。
再哈希法:
构造若干个哈希函数,当发生冲突时,计算下一个哈希地址,直到冲突不再发生。
特点:不易产生聚集,但增加计算时间。
给定关键字集合,逐步生成哈希表时,用表头插入方法较好。
决定哈希表查找的ASL的因素:
1、选用的哈希函数
2、选用的处理冲突的方法
3、哈希表的装填因子(哈希表中填入的记录数与哈希表的长度的比值)
装填因子越小,发生冲突的可能性就越小。
装填因子越大,发生冲突的可能性就越大。