数据结构的查找

        线性的查找主要是:顺序查找和折半查找

        树形的查找主要是:二叉排序树、平衡二叉树、B-树、B+树、红黑树

        最后还补充了一个区别于顺序存储和链式存储的存储方式:散列表(哈希表)

        ——查找这个章节有以下的几种指标:平均查找长度、插入、删除、查找等操作。

        1. 顺序查找

        顺序查找就是扫描,然后查找就好了。

        注意:
        (1)查找最需要注意的就是查找不成功时候的平均查找长度。因为最后不成功的比较究竟要不要计算在平均查找长度中是有待商榷的。在顺序查找中,无序的序列中,如果查找失败,需要算上最后一个查找不成功的次数,因为有“哨兵。”(一般的情况是这样的)

        2. 折半查找(时间复杂度是log2n)——二分查找——

        折半查找的low + high 除以2 是向下取整

        折半查找需有一个前提条件:一定要是顺序存储且是有序的。

        注意
        (1)折半查找有一个查找判定树,这个树是一个二叉树,主要的建立树的规则如下:首先找到一个有序的序列,这个序列的下标是从0开始的,第一个为low =0,最后一个是high = n-1,然后计算好low和high的相加除以2,然后向下取整。算出下一个中间的mid,这个mid就是第一个根,然后中间的mid将整个序列分成了两份,这两份分别为左右mid根的左右两棵子树,然后左边和右边按照上述相同的方式,再次选出mid挂在最初的mid下面作为左孩子和右孩子,然后以此类推不断地弄下去就好了(建立的是二叉树。)

        (2)折半查找算比较次数的时候,注意成功的情况和没有成功的情况,不成功的情况,如果最后找不到,找到的是空指针,那么此时的空指针就不算在比较的次数之内。

        3. 分块查找

        分块查找就是是对顺序查找的一种改进,有些时候数据没有办法保证是有序的,无法使用折半查找,这个时候就可以使用分块查找。

        分块查找是折半查找和顺序查找的结合。如果发现一个序列将部分元素组成块之后,取出最大的数,这些数也是有序的,那么这个时候就可以使用分块查找。

        分块查找块内使用的是顺序查找快外使用的是折半查找(因为快外是有序的。)

        

        4. 二叉排序树(左小右大)——一般二叉链表存储

        二叉排序树需要掌握其建立、插入、删除、查找的方式以及上述操作的时间复杂度,以及求出平均查找长度(ASL)。

        

以上就是二叉排序树和二叉平衡树和红黑树的时间复杂度。

        二叉排序树的定义:左边的子树不大于中间,右边的子树不小于中间。(可以相同。)

        注意:

        (1)查找:查找就是和中间的节点进行比较,如果小于节点,那么就往左边走,如果大于就往右边走。

        (2)插入对于二叉排序树的插入,首先需要在二叉树中做一个查找的工作,查找一下其在二叉树中的位置;对于不存在于二叉树中的元素,那么最后访问的到空节点的时候,这个节点就是这个元素应该呆的地方;对于已经在二叉树中存在的元素,那么在访问到相同元素的时候,可以选择向左走或者是向右走,然后再根据比较的规则走最后空节点的地方,然后插入就好了。

        (3)删除(替换):二叉排序树的删除情况要分为三种

                A)删除叶子节点,直接删除就好了

                B)删除的是只有左节点或者是只有右节点的非叶节点,这个时候要判断这个非根节点在其父节点的哪个位置?如果在删除节点在其父亲节点的右边,那么可以直接删除这个节点,将这个删除节点的子树挂在删除节点父亲节点的右边;如果在删除节点在其父亲节点的左边,那么也是类似的操作,放在左边就好了。(注意这个操作是不需要管子树在删除节点的左边还是右边,只要管删除节点在其父节点的左边还是右边,这个关系到了子树挂在哪个方向。)

                C)P节点既有左子树又有右子树,这个时候有两种方式,不过本质都是找到其中一个节点来代替要删除的P节点以达到删除的目的

                        a)找到需要删除的节点,进入他的左子树,然后一直向右走,知道找到最后一个右边的节点r,用r来替换P,这个时候r可能会面临两种情况如果r是叶子节点,那么直接替换,然后将r删除就好了,但是r有左子树的,那么就按照“B)”中讲的方式,判断r在其父亲节点的哪个位置,然后让其左孩子接上去就好了。(r不可能会有右子树,如果有右子树那么r就不是最右边的节点了,即不可能同时拥有左右子树。

                        b)找到需要删除的节点,进入他的右子树,然后一直向左走,接下来的方式和上述一样,接下来就不赘述了。

            (4)建立树:建立树的过程其实就是插入的过程,

        5. 二叉平衡树(特殊的二叉排序树)

        二叉平衡树的中所谓的平衡值得是每个节点的平衡因子的绝对值是1,即只有-1,0,1三种,平衡因子就是用某节点P节点中左子树的高度减去右子树的高度,这个就是平衡因子

        在平衡二叉树的查找,插入,删除,建立四种基本操作中,除了查找之外,其余的三种操作在基本的二叉排序树的基础之上还要加上一个平衡调整,使得每一个节点的平衡因子的绝对值为1,除了平衡调整,其余的操作都是和二叉排序树一样的。

        平衡调整分为四种:RR、RL、LR、LL。其中RR和LL是最简单的,只需要经过一次操作就可以了,而RL和LR需要经过两次操作。这四种调整起名的含义表示的是四种出问题的状态,比如RR就是解决在右子树的右子树上新增加一个元素导致失衡的问题。LL就是解决左子树的左子树上增加了一个元素导致失衡,RL就是解决右子树的左子树的上增加了一个元素导致失衡,LR就是在左子树的右子树上增加了一个元素导致了失衡。
               

        那么上述具体的操作过程是怎么样的呢?RR和LL就需要一次这个需要自己记住。而RL和LR的执行过程非常有趣,比如RL就是将出现问题的子树2从子树1(即第一个根)摘下来,先进行LL,再进行RR即可;LR也是同理,先进行RR,再进行LL即可。主要是学会发现问题,然后将问题和解决方式的名字一一对应就好了。这里关于一个旋转操作的一个诀窍:从下往上找到第一个平衡因子绝对值为2的节点,那么以这个节点的数就是问题树,需要平衡处理,然后RR和LL的时候,需要看到中间节点,以第二个节点为根旋转就好了,然后RL和LR也是一样,摘下来之后,以第二个节点为根旋转就好了,多练练就好了。

        学会了平衡调整之后,插入,删除和建立,在二叉排序树的基础之上加上一步平衡检测和调整就好了。

        具有h层节点的二叉平衡树的最小节点数为Nh = Nh-1 + Nh-2 +1 这是一个递推公式,其中的N1 = 1,N2 = 2。

        6. B-树(平衡m叉树,但限制更强,要求叶子节点在同一层。)

        首先明确一点:B树的阶数是人为规定的,后续对同一节点的元素进行删减是不会改变B树的阶数的,但是如果题目没有明确的告诉你B树的阶数,直接给你一个B数让你说出他的阶数,那么就根据其中节点所含的最大分支数 = 阶数就好了。

        B树的4个特点:(非根非叶节点的最小分支数 = m/2向上取整

        (1)n个分支节点右n-1个关键字,其节点都是从中间发出的,这些关键字都是按照递增的顺序排列的(开始是如此的。)

        (2)叶子节点都处在最后一层,可以用空指针表示,是查找失败到达的节点,这些空指针就是叶子节点,在计算B树节点的时候,需要加上这些节点;但是B树的高度一般不加上叶子节点这个高度,所以利用高度计算总节点个数的时候,记得加上叶子节点的个数。

        (3) B树的根节点(即最上面的节点)至少一个元素,两个分支,m阶的B树对于非根非叶节点(即不是一开始的根节点,也不是最后空指针的叶子节点)其至少m/2向上取整个分支关键字 = 分支数 -1就好了,两种情况最大的分支数就是m,即阶数

        (4)关键字内元素互不相同。

       B树的创建、插入、删除和查找

        (1)创建:按照排序树的规则将元素送入左边或者是右边,当某个节点中的元素超过了最大的容纳量(B树中的关键字最大为 = 阶数 - 1),将其中的第(m/2向上取整)个元素提高一层,左右边的节点作为左右子树,然后这样不断利用排序树的规则加入新的成员,当底下的新成员满了的时候,按照同样规则上升就好了(元素之间的位置是递增的。

        (2)插入也是和创建同样的道理。

        (3)删除分为三种情况

                a)第一种是:要删除的节点的元素足够,删除这个节点之后满足最小的关键字的要求(即为m/2向上取整 - 1  = 关键字个数),这个时候直接删除节点就好了。

                b)第二种是:删除节点之后的元素不足够,这个时候可以向充足的兄弟节点借关键字,怎么借呢?其实这里的借并不是指的是直接将兄弟节点的元素挪到自己这边来,而是需要父亲节点组的帮助,让需要删除元素的节点子树和要借的元素的节点子树中间所夹住的就是他们要找的父亲节点中的关键字元素,这个时候父亲节点下来覆盖删除的节点,然后富足的节点元素代替父亲节点的元素就好了,其实说是借,其实是一个循环。

                c)第三种是:删除节点之后的元素不足够且也没有兄弟节点可以借的时候,那只能选择合并兄弟节点了,合并的原则:挑选周围兄弟节点中元素少的进行合并就好了合并的操作合并的操作也需要父亲节点中元素的帮助,其实也是两个子树中间夹住的元素帮助,父亲节点的元素覆盖掉要删除的元素,然后和旁边选定的元素组合并(因为父亲节点少了一个,没有人上去补充,所以从分支数减少1,故当然要合并),由于父亲节点少了一个,所以需要检查父亲节点中的元素情况是否满足最小的元素要求,如果不满足的话,显然要将父亲节点和其父亲节点的父亲节点进行合并,直到满足要求为止。

        (4)查找就是和二叉排序树一样查找就好了。

        7. B+树

        和B树唯一的不同就是其关键字个数 = 分支个数(但是B+树的分支个数和B树的分支个数的运算是一样的。)

        然后就是B树的关键字信息都是记录的地址,B+树的关键字信息都是索引,没有记录的存储地址且B+树有一个指针指向关键字最小的叶子节点,所有的叶子节点链成一个线性链表。

        8. 散列表——具体看书,书上的更加详细。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值