Wetts's blog

Stay Hungry, Stay Foolish.

0%

数据结构-0-知识点汇总.md

数据结构

  • 前缀树(字典树)
    • 前缀树又名字典树,单词查找树,Trie 树,是一种多路树形结构,是哈希树的变种,和hash效率有一拼,是一种用于快速检索的多叉树结构。
    • 前缀树
    • 特性
      • 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。
      • 从根节点到某一节点的路径上的字符连接起来,就是该节点对应的字符串。
      • 每个节点的所有子节点包含的字符都不相同。
      • 每条边对应一个字母。每个节点对应一项前缀。叶节点对应最长前缀,即单词本身。
    • 应用场景
      • 字符串的快速检索
      • 字符串排序
      • 最长公共前缀
      • 自动匹配前缀显示后缀
  • B树
    • 即二叉搜索树
    • 结构特点
      • 所有非叶子结点至多拥有两个儿子(Left 和 Right);
      • 所有结点存储一个关键字;
      • 非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;
  • B-树
    • B-tree,即 B树,而不要读成 B减树,它是一种多路搜索树(并不是二叉的)
    • 结构特点
      • 定义任意非叶子结点最多只有 M 个儿子;且 M>2;
      • 根结点的儿子数为[2, M]
      • 除根结点以外的非叶子结点的儿子数为[M/2, M]
      • 每个结点存放至少 M/2-1(取上整)和至多 M-1 个关键字;(至少2个关键字)
      • 非叶子结点的关键字个数=指向儿子的指针个数-1;
      • 非叶子结点的关键字:K[1], K[2], …, K[M-1];且 K[i] < K[i+1]
      • 非叶子结点的指针:P[1], P[2], …, P[M];其中 P[1] 指向关键字小 于K[1] 的子树,P[M] 指向关键字大于 K[M-1] 的子树,其它 P[i] 指向关键字属于(K[i-1], K[i])的子树;
      • 所有叶子结点位于同一层;
    • 特性
      • 关键字集合分布在整颗树中;
      • 任何一个关键字出现且只出现在一个结点中;
      • 搜索有可能在非叶子结点结束;
      • 其搜索性能等价于在关键字全集内做一次二分查找;
      • 自动层次控制;
    • 如果索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片,这和磁盘碎片、内存碎片产生原理是类似的,这些存储碎片不仅占用了存储空间,而且降低了数据库运行的速度。如果发现索引中存在过多的存储碎片的话就要进行 “碎片整理”了,最方便的“碎片整理” 手段就是重建索引, 重建索引会将先前创建的索引删除然后重新创建索引
  • B+树
    • B+树是B-树的变体,也是一种多路搜索树
    • 结构特点
      • 其定义基本与 B-树同,除了:
        • 非叶子结点的子树指针与关键字个数相同;
        • 非叶子结点的子树指针 P[i],指向关键字值属于(K[i], K[i+1])的子树(B-树是开区间);
        • 为所有叶子结点增加一个链指针;
        • 所有关键字都在叶子结点出现;
    • 特性
      • 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
      • 不可能在非叶子结点命中;
      • 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
      • 更适合文件索引系统;
        • 原因
          • B+树空间利用率更高,因为 B+树的内部节点只是作为索引使用,而不像 B-树那样每个节点都需要存储硬盘指针。
          • 增删文件(节点)时,效率更高,因为 B+树的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。
  • B*树
    • 是 B+树的变体,在 B+树的非根和非叶子结点再增加指向兄弟的指针
  • 平衡二叉树
    • AVL 树
      • 平衡二叉搜索树(Self-balancing binary search tree)又被称为 AVL 树(有别于 AVL 算法)
      • 具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过 1,并且左右两个子树都是一棵平衡二叉树。
    • 红黑树
      • 是一种平衡二叉树,但每个节点有一个存储位表示节点的颜色,可以是红或黑。通过对任何一条从根到叶子的路径上各个节点着色的方式的限制,红黑树确保没有一条路径会比其它路径长出两倍,因此,红黑树是一种弱平衡二叉树(由于是弱平衡,可以看到,在相同的节点情况下,AVL树的高度<=红黑树),相对于要求严格的 AVL 树来说,它的旋转次数少,所以对于搜索,插入,删除操作较多的情况下,用红黑树。
    • 对比
      • 平衡二叉树类型 平衡度 调整频率 适用场景
        AVL树 查询多,增/删少
        红黑树 增/删频繁