一、查找的基本概念
查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值得数据元素(或记录)。
查找表(Search Table)是同一类型的数据元素(或记录)构成的集合。
查找表按照操作方式分为两大类:
静态查找表:只作查找操作的查找表。
顺序表查找、有序表查找、线性索引查找
动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个元素。
二叉排序树、平衡二叉树(AVL树)、多路查找树(B树)
二、顺序表查询
这是最简单的一种,从表中的最后一个记录开始,逐个进行记录的关键字与给定值进行比较,若某个记录的关键字与给定值相等,则查找成功,找到所查的记录;反之,若直到第一个记录,其关键字和给定值比较都不相等,则表明表中没有所查的记录,查找失败。
平均的查找长度为(n+1)/2,最好的长度为1,最差的查找长度为n。时间复杂度o(n)
优化措施:
设置哨兵
设置a[0] 为关键字值,称之为哨兵,当返回值为0则表示未找到。从尾部开始查找。
免去了查找过程中每一次比较后都要判断查找位置是否越界的小技巧。
将查找概率大的记录放到查找表的前面。
三、有序表查找
折半查找(二分法查找)
平均查找长度:log(n+1)-1,通过二分查找树的判断树来推的。二分查找的最坏性能和平均性能非常接近。时间复杂度o(lgn)。
插值查找
这种方法是在二分查找基础上改进的,核心是对mid的取值,公式为:
mid = low + (key - arr[low])*(high-low)/(arr[high]-arr[low])
至于为什么这么改进,因为key小的话,那么我趋向于在表中低地址端去查找,而key大的话那么我们趋向在表的高地址端去查找。
时间复杂度也是 o(lgn)。
斐波那契查找
不是采用二分,而是斐波拉契序列的值去缩小我们的范围。时间复杂度o(lgn)。
四、线性索引查找
稠密索引
分块索引
倒排索引
五、二叉排序树
六、平衡查找树(AVL树)
由于二叉排序树一般都不是平衡的,而二叉排序树的查找性能取决于二叉排序树的形状,所以构造一种平衡的二叉树。左右子树高度相差不到1。所以此树总是平衡的。提高了查找效率。
二叉树上的结点的左子树的深度减去右子树的深度的值称为平衡因子BF。只要二叉树上有一个结点的平衡因子的绝对值大于1,则该二叉树就是不平衡的。
平衡二叉树的构建过程:
总之就是把不平衡消灭在最早的时刻。
查找时间复杂度为O(logn),而插入和删除的时间复杂度也为O(logn)。
红黑树,二叉排序树的另外一种平衡算法。
七、多路查找树(B树)
目的:为了降低对外存设备的访问次数。
定义:多路查找书,其每一个结点的孩子树可以多于两个,且每一个结点处可以存储多个元素。
堵路查找树的形式:
2-3树
2-3-4树
B树 平衡的多路查找树
B+树 为了解决所有元素遍历的问题
结点最大的孩子数目称为B树的阶,因此,2-3树是3阶B数。