本章内容主要为查找。
我们学习了顺序查找、二分查找、二叉排序树、平衡二叉树、B树、B+树。
一、顺序查找。
当查找成功的时候
ASL=(p1 x c1 +p2 x c2 +p3 x c3 +......+pn x cn )/n
当查找概率相同时,且顺序查找时,成功时
ASL = (C1+C2+C3+...+Cn) /n
优点:简单。
缺点:平均查找长度较大、查找效率低。当数据规模较大的时候,不宜。
二、折半查找
可以用链式存储、但是不能在对数时间内完成,因为不能做到随机存取
在一个数组里进行二分的查找时间复杂度不一定是log2 n ,因为还需要进行排序,使用冒泡、选择、插入的复杂度为n的平方,用快速排序为nlog(n)
复杂度:O(nlogn)+O(log2(n))
静态查找:二分查找
动态查找:因为要保持顺序表的有序性,对有序表进行插入和删除时,平均比较和移动表中其中一半的元素,比较费时。不宜。
缺点:当数据量太大时,不能进行二分查找,因为找一片连续的空间会超出内存,数据量很小且操作不耗时时,不需要二分。
三、二叉排序树
//二叉排序树的二叉链表表示 typedef struct { keytype key; //关键字项 infotype otherinfo; //其他数据项 }Elemtype; //每个结点的数据类型 typedef struct BSTnode { Elemtype data; struct BSTnode *lchild,*rchild; }BSTnode,*BSTree;
定义:左子树都小于根结点的,右子树的都大于根结点
如果删除的结点左右不为空,则找左子树的最大值后删除找到的结点,而又转化成右子树为空的情况,或找右子树的最小值。
缺点:不采用二叉排序树时因为它的深度与输入的顺序密切相关,变成单叉树O(n) 会增加时间复杂度。
四、平衡二叉树
要判断左右子树的高度差。
左右子树的深度之差的绝对值不
访问该平衡二叉树的次数为深度log2 n
该查找方式解决了内存访问外存的次数。
五、B树、B+树
https://www.cnblogs.com/vincently/p/4526560.html
里面很详细,收获挺多。
散列表的查找
主要讲的时造表、查表 发生冲突如何解决
一、线性探测法
二、二次探测法
三、伪随机探测法