大话数据结构 第八章 查找(二) 二叉排序树、多路查找树、哈希表

大话数据结构 第八章 查找(二) 二叉排序树、多路查找树、哈希表

  • 查找
    • 二叉排序树
      • 查找操作
      • 插入操作
      • 删除操作
    • 平衡二叉树(AVL树)
      • 实现原理
    • 多路查找树
      • 2-3树
        • 插入操作
        • 删除操作
      • 2-3-4树
      • B树
      • B+树
    • 散列表查找(哈希表)
      • 散列函数的构造方法
        • 原则
        • 方法
      • 处理散列冲突的方法
      • 散列表查找实现

查找

二叉排序树

  • 顺序存储结构插入和删除效率不错,但是查找效率很低;有序线性表查找很方便,但是插入和删除数据效率较低
  • 二叉排序树是以链接的方式存储,保持了链接存储结构在执行插入或删除操作时不用移动元素的优点,只要找到合适的插入和删除位置后,仅需修改链接指针即可
  • 二叉排序树:或者是一棵空树,或者是具有下列性质的二叉树:
  • 【1】若它的左子树不空,则左子树上所有结点的值都小于它的根结构的值
  • 【2】若它的右子树不空,则右子树上所有结点的值都大于它的根结构的值
  • 【3】它的左、右子树也分别是二叉排序树

查找操作

插入操作

删除操作

平衡二叉树(AVL树)

  • 平衡二叉树:是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1
  • 平衡因子BF = 左子树深度 - 右子树深度(AVL树各结点的BF只能为-1,0,1)
  • 最小不平衡子树:距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树
  • 查找的时间复杂度为O(log n),而插入和删除的复杂度也为O(log n)

实现原理

  • 平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入而破坏了树的平衡性,若是,则找出最小不平衡子树。在保持二叉排序树特性的前提下,调整最小不平衡子树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树
  • BF> 0 顺时针旋转;BF <0 逆时针旋转
  • 插入结点后,最小不平衡子树的BF和它的子树的BF符号相反时,就需要对结点先进行一次旋转以使得符号相同后,再反向旋转一次才能够完成平衡操作

多路查找树

  • 多路查找树:其每一个结点的孩子数可以多于两个,且每一个结点处可以存储多个元素

2-3树

  • 2结点包含一个元素和两个孩子(或没有孩子),3结点包含一大一小两个元素和三个孩子(或没有孩子)
  • 2-3树中所有的叶子都在同一层次上

插入操作

删除操作

2-3-4树

  • 2-3树的扩展
  • 2结点包含一个元素和两个孩子(或没有孩子),3结点包含一大一小两个元素和三个孩子(或没有孩子),4结点中包含小中大三个元素和四个孩子(或没有孩子)

B树

  • B树是一种平衡的多路查找树,2-3树和2-3-4树都是B树的特例。结点最大的孩子数目称为B树的阶
  • 一个m阶的B树具有以下属性:
  • 【1】如果根结点不是叶结点,则其至少有两棵子树
  • 【2】每个非根的分支结点都有k-1个元素和k个孩子,其中[m/2]≤k≤m。每个叶子结点n都有k-1个元素,其中[m/2]≤k≤m
  • 【3】所有叶子结点都位于同一层次

B+树

  • B+树是应文件系统所需而出的一种B树的变形树。在B+树中,出现在分支结点的元素会被当作它们在该分支结点位置的中序后继者(叶子结点)中再次列出。另外,每一个叶子结点都会保存一个指向后一叶子结点的指针
  • 特别适合带有范围的查找

散列表查找(哈希表)

  • 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。查找时,根据这个确定的对应关系找到给定值key的映射f(key),若查找集合中存在这个记录,则必定在f(key)的位置上
  • f称为散列函数,又称为哈希函数。
  • 采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或者哈希表
  • 散列技术最适合的求解问题是查找与给定值相等的记录

散列函数的构造方法

原则

  • 计算简单
  • 散列地址分布均匀

方法

  • 直接定址法:优点是简单、均匀,也不会产生冲突,但是需要事先知道关键字的分布情况,适合查找表较小且连续的情形
  • 数字分析法:适合处理关键字位数比较大的情况,如果事先知道关键字的分布且关键字的若干位分布较均匀,就可以考虑使用这种方法
  • 平方取中法:比较适合与不知道关键字的分布,而位数又不是很大的情况
  • 折叠法:事先不需要知道关键字的分布,适合关键字较多的情况
  • 除留余数法(最常用)
  • 随机数法:适合于关键字长度不等时

处理散列冲突的方法

  • 开放定址法
  • 再散列函数法
  • 链地址法
  • 公共区溢出法

散列表查找实现

  • 时间复杂度为O(1)

你可能感兴趣的:(大话数据结构)