平衡数据结构有:B树,红黑树,AVL树,Splay Tree, Treep等
跳表
主要思想就是空间换时间,逐层建立索引,加速查找与插入O(logn)
空间复杂度分析
假设一个链表有 n 个结点,如果每两个结点抽取出一个结点建立索引的话,那么第一级索引的结点数大约就是 n/2,第二级索引的结点数大约为 n/4,以此类推第 m 级索引的节点数大约为 n/(2m),我们可以看出来这是一个等比数列。这几级索引的结点总和就是 n/2+n/4+n/8…+8+4+2=n-2
,所以跳表的空间复杂度为 o(n)。
查找/插入的时间复杂度:
- 假设索引有h级,最高级索引有2个结点,通过上面公式可以得到n/(2h) = 2,从而可得:h = log2n - 1。如果包含原始链表这一层,整个跳表的高度就是 log2n。
- 我们在跳表中查找某个数据的时候,如果每一层都要遍历m个结点,那么在跳表中查询一个数据的时间复杂度就为:O(m*logn)。
- 二分查找:每一级索引都最多只需要遍历3个结点,m=3
索引动态更新
如果红黑树、AVL树这样的平衡二叉树,你就会知道它们是通过左右旋的方式保持左右子树的大小平衡,而跳表是通过随机函数来维护“平衡性”。