数据结构与算法

62 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

跳表

Redis 中的有序集合(Sorted Set)就是用跳表来实现的。

跳表的背景:

即便链表中存储的数据是有序的,如果我们要想在其中查找某个数据,也只能从头到尾遍历链表。这样查找效率就会很低,时间复杂度会很高,是 O(n)

跳表的思想:

对链表建立“索引”,每两个结点提取一个结点到上一级,我们把抽出来的那一级叫作索引或索引层。

视情况而定,可以建立多级索引。这样查询的复杂度就降为logn了。

跳表索引动态更新

当我们不停地往跳表中插入数据时,如果我们不更新索引,就有可能出现某 2 个索引结点之间 数据非常多的情况。极端情况下,跳表还会退化成单链表。

这时候就需要动态更新索引了。跳表是通过随机函数来维护平衡性的。


平衡二叉搜索树

定义:在二叉搜索树的基础上,任意一个节点的左右子树的高度相差不能大于 1。(又叫AVL树)

平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”、比较“平衡”,不会出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相 应的插入、删除、查找等操作的效率高一些

失衡后会进行自旋平衡:

特点:自旋前后中序遍历是一样的

红黑树

“Red-Black Tree”,简称 R-B Tree。追求近似平衡

红黑树中的节点,一类被标记为黑色,一类被标记为红色。除此之外,一棵红黑树还需要满足这样几个要求:

  1. 根节点是黑色的;
  2. 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;
  3. 任何相邻的节点都不能同时为红色
  4. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点