查找技术

可以标识的一个记录的某个数据项成为关键码,关键码的值称为键值,若关键码可以唯一的标识一个记录,则称此关键码为主类关键码,反之称为次关键码。

广义的讲,查找 是在具有相同类型的记录构成的集合中找出满足给定条件的记录。

若再查找集合中找到了与给定值相匹配的记录,称查找成功,否则称查找不成功。

静态查找:不涉及插入和删除的操作的查找称为静态查找,静态查找在查找不成功时,返回查找该不成功的标志。动态查找就是涉及插入和删除的操作,则在查找不成功的时候需要把被查找的记录插入到查找集合中。

查找结构:面向查找操作的数据结构。

顺序查找:设置哨兵(在查找起始点的对面设置哨兵、哨兵就是要查找的那个点)

折半查找:折半查找要求序列是有序的递增或者递减,然后通过不断地缩减区间长度直到找到所需要找的值或者区间不存在,但是要注意区间缩减的方式,否则会造成死循环。

二叉排序树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值,若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值,它的左右子树也分别为二叉排序树。二叉排序树的构造:根据定义如果要插入的节点比当前节点大就找他的右儿子如果儿子为空就插入否则就继续比较,小的话就插入左儿子然后继续执行。

二叉排序树的删除:三种情况                                                                                                                                                         1.如果删除的节点是叶子节点直接删                                                                                                                                                      2.若节点p只有左子树或者只有右子树那么就只需要把他们的子树接到父结点上就行。                                                                         3.左右子树均不为空,两种思路,一种就是从要删除结点的左子树中选取最大的结点进行替代之,另一种就是从要删除的结点的右子树中选取最小的结点替代之。(第二种实现方法,首先向右子树找到最小的点然后记录他的父亲节点,用找到的这个最小的点代替要删除的点,之后就是吧最小点的右子树(不管他是不是空)接到最小子结点的父亲得左儿子,这里有一种情况那就是要删除的节点的右儿子是个叶子那么这时候最小点就是这个叶子,只需要把最小点的右儿子接到最小点的右儿子做最小点的父亲的右儿子)。

由于二叉排序树有一些缺陷就是当插入的序列顺序不同导致了二叉排序树的结构是不同的,如果说插入的序列是一个有序的那么构成的二叉排序树就是一个斜树。不会降低查找的复杂度还是O(n)的这时候就需要构造平衡二叉树。

平衡二叉树根节点的左子树和右子树的深度最多相差1,跟节点的左子树和右子树也都是平衡二叉树。

结点的平衡因子:这个点的左子树的深度与右子树的深度的差。

最小不平衡子树:距离插入点最近的平衡因子绝对值大于一的节点为根的子树。

构造方法:平衡二叉树是一边插入点一边平衡,当插入一个点的时候造成了不平衡那么就从插入点开始找找到最小不平衡子树,从这个树的根节点开始走两步 找到他的类型(LL、LR、RR、RL)四种情况,还是根据这个节点的左边都比他大右边都比他小,开进行节点的替换和子树的移动。(其中,LR、RL要先转换成LL、RR,之后再变)

 

Hash表法:构建哈希函数通过哈希函数把所需要查的值对应到一个关系中然后直接用这个关系判断是否存在就行。

闭散列法,通过哈希函数找到其对应的下标如果该下标已经存在了值,那么就向后找一位直到找到一个没有数的空间存下来并记录向后移了几位,并由此可以计算复杂度。

拉链法:构建邻接表!

 

你可能感兴趣的:(数据结构)