Skip to content

Latest commit

 

History

History
executable file
·
100 lines (92 loc) · 4.52 KB

File metadata and controls

executable file
·
100 lines (92 loc) · 4.52 KB

查找

平均查找长度

ASL = 1/2 ASL_success + 1/2\*ASL_failed = 3/4\*(n+1)

有序表的查找

  • 折半查找(Binary Search, 二分查找)
    • 高效率的查找方案,前提条件是查找表中的记录有序
    • 二分查找的路径会得到一个二叉树,称为判定树。n个结点的判定深度是log2n+1。
  • 分块查找(Blocking Search,索引顺序查找)
      1. 将查找表分为几块,块间有序,块内无序
      1. 在查找表的基础上附加一个索引表,索引表按关键字有序 查找方法的比较
查找方法 顺序查找 二分查找 索引查找
ASL 最大 最小 中等
表结构 有序表、无序表 有序表 分块有序表
存储结构 顺序存储结构线性链表 顺序存储结构 顺序存储结构线性链表

二叉搜索树

  • 具有以下特性的二叉树或空树
    • 每个结点都有一个作为搜索依据的关键字,所有结点的关键字互不相同
    • 左子树上的所有结点的关键字都小于根节点关键字
    • 右子树上的所有结点的关键字都大于根节点关键字
    • 左右子树也是二叉搜索树
  • 特性:
    • 左子树<根结点<右子树
    • 如果对一棵二叉搜索树中序遍历,可以得到一个从小到大的结果
  • 搜索方法:
    • 从根节点开始,沿某一个分支逐层向下进行比较判等的过程
    • 如果根指针为null,搜索失败;否则用给定值x与根节点判断
      • 若给定x等于根节点,搜索成功
      • 若给定x小于根节点,搜索失败,转向左子树;反之转向右子树
  • 插入算法:
    • 检查该值是否已经存在
      • 如果查找成功,拒绝插入
      • 如果查找失败,将给定值x插入到搜索停止的地方
  • 删除算法:
    • 删除叶结点
    • 被删结点右子树为空,拿它左子女顶替;反之亦然
    • 被删结点左右都不为空,判定后向上平移

AVL树(高度平衡的二叉搜索树)

  • 具有以下特性的二叉搜索树
    • 左子树和右子树的高度差绝对值不超过1
  • 平衡因子bf(-1,0,1)
  • 如果是一棵AVL树,高度和ASL都可以保持O(log2n)
  • 平衡化旋转
    • 单旋转(左旋和右旋)
    • 双旋转(左平衡和右平衡)
    • 每插入一个新结点的时候,AVL树的相关结点的平衡状态将会变化,因此插入结点后,需要从插入位置沿根的路径回溯,检查各结点的平衡因子。
    • 如果在某一结点发现不平衡,停止回溯。从不平衡的结点开始,沿刚才回溯路径取下两层结点等待操作
      • 如果在一条直线上:单旋转
        • 右单旋转
        • 左单旋转
      • 如果在一条折线上:双旋转
        • 先左后右双旋转
        • 先右后左双旋转

B树

  • B树是平衡的多路查找树,满足以下特性:
    • 每个结点至多有m可子树
    • 若根节点不是叶子,至少有两棵子树
  • B树查找分析
    • 在B树中查找结点(磁盘进行,耗时)
    • 在结点中找关键字(内存进行)
    • B树上进行查找的效率由待查关键字所在结点的层次数l决定
  • B树的插入
    • m阶B树的结点分裂

B+树

  • B+树是B树的特殊情形,不同点在:
    • 所有关键字都存放叶结点,上层的非叶结点都是子树中最小(大)的关键字的副本
    • 叶结点包含了全部关键字以及指向相应数据记录存放的地址指针,叶结点本身按照关键字从小到达排序
  • B+树的分类
    • 按照“最大关键字复写”原则组织
    • 按照“最小关键字复写”原则组织
  • B+树的插入
    • 只能在叶结点插入,没插入一个需要判断是否超过范围m。

Hash表

  • 基本概念
    • 理想的搜索方法是可以不经过比较,一次直接从字典中获取要搜索的元素
    • 散列函数、散列表
    • 使用散列方法不需要进行多次关键字的比较,可以直接到达有此关键字的表项的实际存放地址
    • 通过散列函数的计算得到了同一个散列地址,称这些产生冲突的散列地址相同的不同关键字为同义词
  • 散列函数
    • 要求:
      • 运算简单
      • 定义域需要包含需要存储的全部关键字
      • 计算出来的地址地址应能均匀分布在整个地址空间中
    • 生成方法:
      • 直接定址
      • 数字分析
      • 除留余数法
      • 平方取中法
      • 折叠法