• 第7章学习小结


    一、线性表的查找

        1、顺序查找:

    typedef KeyType int;//这个根据具体情况去定义;在这里定义为int; typedef struct{
        KeyType key;
        InfoType otherinfo;//这个根据具体情况去改,这里只是抽象的说成还要添加这些类型。 
     }ElemType;
     
     typedef struct{
         ElemType *R;
         int length;
     }SSTable; 

    ①查找过程:按顺序一个一个比对,直到找到为止;若全部对比完都没找到,则意味着查找失败。

    ②设置哨兵与没有设置哨兵的区别:时间复杂度同样是O(n),但是从比较次数来看,设置哨兵的时间复杂度为O(2n),而没有设置哨兵的时间复杂度为O(n)。

        2、二分查找:

    int Search_Bin(SSTable ST,KeyType key)
    {//在有序表ST表中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0;
       int low = 1 ,high = ST.length;//置查找区间初值。 
       int mid;
       while(low<=high)   
        {
              mid = (low+high)/2;
              if(key==ST.R[mid].key) //找到待查找元素; 
              return mid;
              else
              if(key<ST.R[mid].key) high = mid - 1;//继续在前一子表进行查找; 
              else
                low = mid + 1;//继续在后一子表中进行查找; 
         } 
         return 0; //表中不存在待查元素; 
      }

    ①要求表中的元素按关键字有序排列

    ②查找过程:从表的中间记录开始,如果与中间记录的关键字相同,则查找成功;若大于或小于中间记录的关键字,则在表中大于或小于中间记录的那一半中查找,重复操作,

        直到查找成功,或者在某一步中查找区间为空,则代表查找失败。

    ③边界问题:

      a)剩余3个数:从中间记录开始比对,最终转化成剩余1个数的问题。

      b)剩余2个数:假设取上,那么mid=l,如果a[mid]>x,则r=l-1,l>r。

      c)剩余1个数:与剩余两个数一样。

    (因此,当l>=r,都是在搜索范围内)

    ④应用场景:

      a)当找不到时,返回l或者r。

      b)多条相同关键字记录时,根据mid往前往后找相同关键字的记录。

    ⑤注意:

      a)对于数组a使用二分查找法查找:首先排序,然后查找,T(n)=O(nlog2(n))。

      b)链表不能以时间复杂度O(log2(n))实现折半查找,因为链表不能随机存取。

      二、树表的查找

        1、二叉排序树

          ①性质:若左子树不为空,左子树上所有结点的值均小于根结点的值;若右子树不为空,右子树上所有结点的值均大于根结点的值;他的左、右子树也分别为二叉排序树。

           ②查找:

      a)若key=T->data.key,说明查找成功。

      b)若大于,则递归查找右子树。

      c)若小于,则递归查找左子树。

    ③插入:若小于则插入左子树,若大于则插入右子树

    ④删除:当删除结点左右不为空时,找左子树的最右结点,找右子树的最左结点。

        2、平衡二叉树:平衡因子定义为该结点左子树和右子树的深度之差,平衡二叉树上所有结点的平衡因子只能是-1、0和1.只要二叉树上有一个结点的平衡因子的绝对值大

             于1,则该二叉树不平衡

        3、B-树:多叉树,一层有多个关键字。可减小高度,避免内外存反复的交换。

        4、B+树:类似B-树,可实现区间查找。

      三、散列表

        1、构造方法:计算简单;分布应均匀,尽可能减少冲突。

    ①数字分析法:仅适用于事先知道关键字集合。

    ②平方取中法:适用于不能事先了解关键字的所有情况,或难于直接从关键字中找到取值较分散的几位。

    ③折叠法:适用于散列地址的位数较少,而关键字的位数较多。

    ④除留余数法:最常用的构造散列函数的方法,选p为小于表长的最大质数。

        2、处理冲突的方法

    ①开放地址法:

      a)线性探测法:从冲突地址的下一单元顺序寻找空单元,如果最后一个位置也没找到空单元,则回到表头开始继续查找。

                                 如果找不到空位,说明散列表已满,需要进行溢出处理。

      b)二次探测法:正增量为往后查找,负增量为往前查找

      c)伪随机探测法

    ②链地址法:类似邻接表,将所有冲突的地址以链式存储的形式放在相应位置的后面。

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    我觉得这一章学得不够好,这一章几乎把前面的知识点都用上了,看来我还是需要再对前面的知识点捣一捣,不过还好,csdn上有需要知识点可以学到,可以补充了解,再接再励,学期要结束了,期末考来了,得复习了。

  • 相关阅读:
    《需求工程——软件建模与分析》阅读笔记03
    第十一周周五
    统计字符串里每个词语的数目
    第十一周周四计划
    for循环创建的a标签,当点击时如何确定点击的是哪一个标签?
    第十周计划周二&周三计划
    第十周周二汇报
    第九周周五小思路
    第九周周五计划&&周四总结
    第九周周四计划&&周三总结
  • 原文地址:https://www.cnblogs.com/ldx539/p/13198055.html
Copyright © 2020-2023  润新知