• 第七章小结


    查找的基本概念:

    1.查找表

    2.关键字:关键字是数据元素(或记录)中某个数据项的值,用它可以标识一个数据元素(或记录)。若关键字可以唯一地标识一个记录,则称此关键字为主关键字(对不同的记录,其主关键字均不同)。反之,称用以识别若干记录的关键字为次关键字。当数据元素只有一个数据项时,其关键字即为该数据元素的值

    3.查找

    4.动态查找表和静态查找表:在查找的同时做修改操作(如插入和删除),则相应的表称之为动态查找表,否则称之为静态查找表。

    5.平均查找长度:为确定记录在查找表中的位置,需和给定值进行比较的关键字个数的期望值,陈伟查找算法。

      在查找成功的平均查找长度(ASL)。 

        对于含有n个记录的表,查找成功时的平均查找长度为

            

     其中, pi为查找表中第i个记录的概率,且所有元素概率和为1。

    线性表的查找:

    1.顺序查找

    基本实现方法:

    int Search(SSTable ST,keyType key)
    {
        for(i = ST.length;i>=1;--i)
            if(ST.R[i].key == key)
                return i;
        return 0;
    }
    View Code

    带哨兵:

    // 有哨兵顺序查找数组a中从a[1]到数组末尾的key
    // 设置一个哨兵可以解决不需要每次让i与a.length作比较。
    // 返回-1说明查找失败,注意:从数组下标为1的位置开始查找
     int seqSearch(int[] a, int key)
     {
        int i = a.length - 1;    // 设置循环从数组尾部开始
        a[0] = key;              // 设置a[0]:"哨兵"
        while (a[i] != key)
            i--;
        if(i>0)
            return i;
        else
            return -1;
    }
    View Code

    2.折半查找(二分查找)

    算法描述:

    int Search_Bin(SSTable ST, KeyType key)
    {//在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为改元素在表中的位置,否则为0
        
      low=1; high=ST.length;
      while(low<=high)
      {
             mid=(low+high)/2;
             if(key==ST.R[mid].key) return mid;
             else if(key<ST.R[mid]) high=mid-1;
             else low = mid+1;
        }      
        return 0;
    }
    View Code

    需要注意的地方是,循环执行条件是low<=high, 而不是low<high

    3.分块查找(索引顺序查找)

      这是一种性能介于顺序查找和折半查找之间的一种查找方法。在此查找法中,除表本身以为,尚需建立一个“索引表”。对于每个子表(或称块)建立一个索引项,其中包括两项内容:关键字项(其值为该子表内的最大关键字)和指针项(知识该子表的第一个记录在表中的位置)

    分块查找的平均查找长度为:

    数表的查找:

    1.二叉排序树(二叉查找树)

    2.二叉平衡树(AVL数):

      (1)左子树和右子数的深度之差的绝对值不超过1;

      (2)左子树和右子树也是平衡二叉树

    平衡二叉树的平衡调整方法:找到离插入结点最近且平衡因子绝对值超过1的祖先结点,以该结点为根的子树为最小不平衡子树,可将重新平衡的范围局限于这颗子树。

    3.B-树:

      一颗m阶的B-数,或为孔数,或为满足下列特性的m叉树:

        (1)树的每个结点至多有m颗子树

        (2)若根结点不是叶子结点,则至多有两颗子树

        (3)除根之外的所有非终端结点至少有【m/2】棵子树

        (4)所有的叶子结点都出现在同一层次上,并且不带信息,通常陈伟失败结点(失败结点并不存在,指向这些结点的指针为空。引入失败结点是为了便于分析B-树的查找性能);

        (5)所有非终端结点最多有m-1个关键字,结点的结构,如图所示:

     4.B+树:

      一颗m阶的B+树和m阶的B-树的差异在于

        (1)有n棵子树的结点中含有n个关键字;

        (2)所有的叶子结点中包含了全部关键字的信息,以及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接

        (3)所有的分终端结点可以看成是索引部分,结点中仅含有其子树(跟结点)中最大(或最小)关键字。

    散列表:

     构造方法:

    1.数字分析法

    2.平方取中法

    3.折叠法

    4.除留余数法

    处理冲突方法:

      1.开放地址法:

        (1)线性探测法

          di=1,2,3······, m-1

        (2)二次探测法

          di=1^2, (-1)^2, 2^2, (-2)^2, ······, k^2, (-k)^2(k<=m/2)

        (3)伪随机探测法

          di=伪随机数序列

      2.链地址法  

        链地址法的基本思想是:把具有相同散列地址的记录放在同一个单链表中,称为同义词链
        表。有 m 个散列地址就有 m 个单链表,同时用数组 HT[O…m-1]存放各个链表的头指针,凡是
        散列地址为 i的记录都以结点方式插入到以 HT[i]为头结点的单链表中。
     
    查找过程中需和给定值进行比较的关键字的个数取决千三个因素:散列函数、处理冲突的方法和散列表的装填因子。
     
    散列表的装填因子(负载因子)=表中填入的记录数/散列表的长度 
     
     
  • 相关阅读:
    java.lang.NoSuchMethodError
    asm相关内容想下载(包括 jar 包)
    Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    交通测速方式
    卡口和电子警察的区别
    Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable
    在window上安装mysql
  • 原文地址:https://www.cnblogs.com/ojkojk/p/13198730.html
Copyright © 2020-2023  润新知