查找-概念性总结及代码示例

Posted stormax

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找-概念性总结及代码示例相关的知识,希望对你有一定的参考价值。

总览

  • 静态查找:只有查找的功能
  • 动态查找:找到删掉,没找到添加
  • 数据结构:顺序表
  • 性能分析:平均查找长度ASL 与给定值进行比较的关键字个数的期望值

     

静态查找:

  1. 顺序查找
    1. 主要思想:从表的最后一个记录开始,逐个进行关键字的匹配,若匹配成功,查找成功,返回关键字的位置;若直到第一个记录依旧没有匹配成功,查找失败。
    2. ASL:(n + 1/2
    3. 时间复杂度:O(n)
    4. 示例代码:
  2. 折半查找
    1. 主要思想:先确定待查记录的方位,然后逐步缩小范围知道找到记录为止。
    2. ASL
    3. 时间复杂度:
    4. 构造折半查找判定树:把当前查找区间中的中间位置(向下取整)上的记录作为树根,左子表和右字表中的记录分别作为根的左子树和右子树。
    5. 求判定树的ASL:判定树的层数就是查找的次数,ASL=判定树上所有分枝节点的总层数/总分支节点数
    6. 示例代码:
  3. 块查找(索引顺序表的查找)
    1. 结构:把线性表分成若干块,每一块中的元素存储顺序是任意的,但是块与块之间必须按照关键字的大小有序排列,前一块的最大关键字小于后一块的最大关键字。需要建立一个索引表用于存放每一块的最大关键字,并将指针指向该块。
    2. 主要思想:首先确定待查找元素属于哪一块,然后在块内精确查找该元素。由于索引表是递增有序的,所以第一步采用折半查找,第二步采用顺序查找。
    3. ASL:折半查找的平均长度+顺序查找的平均长度
    4. 示例代码:

动态查找:

  1. 二叉排序树(BST
    1. 定义:
      1. 若它的左子树不为空,则在左子树上的所有结点的值均小于它的根节点的值
      2. 若它的右子树不空,则右子树上的所有结点的值均大于它的根结点的值
      3. 它的左子树、右子树也分别为平衡二叉树
    2. 查找算法:
      1. 主要思想:将待查元素与根节点比较,小于查左子树,大于查右子树,重复直到查到,查找成功;到结点的空指针域,查找失败
      2. 示例代码
    3. 插入关键字:
      1. 主要思想:对查找算法进行修改,来到空指针域直接插入即可。如果要插入的关键字已经存在,插入失败;否则,插入成功
      2. 示例代码:
    4. 删除关键字:
      1. 主要思想:

        假设在二叉排序树行被删除节点为p, f为其双亲节点,删除p的过程分为三种情况

        1. p为叶子结点,直接删除即可;
        2. p结点只有右子树而无左子树,或者只有左子树没有右子树,删除p,并把p的子树连接到原来p与其双亲节点f连接的指针上;
        3. p既有左子树又有右子树,先沿p的左子树的根节点的右指针一直往右走,知道来到其右子树的最右边的一个节点(或者沿p的右子树的根节点的左指针一直往左走,知道来到其左子树的最左边的一个节点),然后将p中的关键字用r中的关键字代替。最后判断,如果r是叶子结点,则按照1中的方法删除r;如果r是非叶子结点,则按2中的方法删除r
      2. 示例代码(不重要)
  2. 平衡二叉树(AVL
    1. 概念:

      一种特殊的二叉排序树,左右子树都是平衡二叉树,左右子树高度之差绝不大于1。目的是为了提高二叉排序树的查找效率。

    2. 平衡调整总结:以平衡因子为2-2的结点,自底向上的进行调整
      1. 单向右旋平衡处理:由于在根节点的左子树根节点的左子树上插入节点,根节点的平衡因子由1增至2,需要进行一次向右的顺时针旋转操作。
      2. 单向左旋平衡处理:由于在根节点的右子树根节点的右子树上插入节点,根节点的平衡因子由-1增至-2,需要进行一次向左的逆时针旋转操作。
      3. 双向旋转(先左后右):由于在根节点的左子树根节点的右子树上插入节点,根节点的平衡因子由1增至2,需要进行先左后右的旋转操作。
      4. 双向旋转(先右后左):由于在根节点的右子树根节点的左子树上插入节点,根节点的平衡因子由-1增至-2,需要进行先右后左的旋转操作。
  3. b-
    1. 概念:B-树是一种平衡多路查找树,在文件系统中很有用。

      一棵m阶的B-树,或为空树,或者满足下列特性的m叉树:

      1. 树中每个结点至多有m棵子树
      2. 若根节点不是叶子结点,则至少有两棵子树
      3. 除根之外的所有非终端结点至少有m/2(向上取整)棵子树
      4. 所有的非终端结点中包含下列信息数据

        n,A0,K1,A1,K2,A2,…,Kn,An

      5. 所有叶子结点都出现在同一层次上,并且不带信息。
    2. 查找:
    3. 插入:
    4. 删除:
  4. b+
    1. 概念:

哈希表:

  1. 概念
  2. 哈希表的构造方法
    1. 直接定址法
    2. 数字分析法
    3. 平方取中法
    4. 折叠法
    5. 除留余数法
    6. 随机数法
  3. 处理冲突的方法
    1. 开放定址法
    2. 再哈希法
    3. 链地址法
    4. 建立一个公共溢出区
  4. 哈希表的查找
    1. 主要思想:给定值K,根据造表时设定的哈希函数求得哈希地址,若此位置上没有记录,则查找不成功;否则,比较关键字,若给定值相等,则查找成功;否则根据造表时设定的处理冲突的方法找"下一个地址",直至哈希表中的某个位置为"空"或者表中所填记录的关键字等于定值时为止。
    2. 二次聚集:
    3. 不同哈希函数的ASL

以上是关于查找-概念性总结及代码示例的主要内容,如果未能解决你的问题,请参考以下文章

Spring Batch学习记录及示例项目代码

ref:关于JAVA中一些安全漏洞示例说明及如何规避方法代码示例总结分享

C# Apose Word 中的知识点详细的总结及代码示例

C++_继承详谈

C++_继承详谈

(转载)C++ string中find() ,rfind() 等函数 用法总结及示例