概述
- 字典是词条的结构,包括key和其他信息,其主要包括,搜索,插入和删除等基本操作
- 伸展树和跳表都可用于字典结构
- 跳表有很好的平均时间性能
- 伸展树有很好的分摊代价性能,即对于长的运算序列,具有很好的平均时间性能
伸展树
- 二叉搜索树
- 要求根的左子树上的值都小于根值
- 右子树上的值都小于根值
- 并且左右子树都是二叉搜索树
- 常用于表示动态集
- 自动调节树和伸展树
- 用二叉搜索树的时候,容易出现树的退化,树的高度增大,不平衡等?
- 在伸展树上,执行一个m次运算(搜索,插入,删除),总时间为O(mlogn)
- 伸展树
- 是二叉搜索树
- 要求每次访问一个元素后,将最新访问(搜索,插入,删除(删除的节点的双亲为伸展节点))的元素移至二叉搜索树的根部,(该元素的这个节点成为伸展节点,伸展结束后,节点变成根节点)从而保证经常访问的元素靠近根节点。而较少访问的元素位于较低的层次
- 这种将元素移至根部的操作,就叫做伸展
- 虽然某次操作可能很费事O(n),但是总体上的平均分摊代价为O(mlogn)
- 伸展操作
- 伸展操作,由至多一次单一旋转,和若干次双重旋转组成
- 旋转
- zigzig/zagzag的操作,并不是从底连续执行了两次zigzig/zagzag,而是从两次zig/zag的根节点处,进行的两次zigzig/zagzag,此处要特别注意
- zigzag操作,可以分开成两步,zig和zag进行操作
跳表
-
概述
-
跳表被认为是可以替代平衡搜索树的另外一种选择
-
具有很好的搜索,插入和删除的时间效率,且比前者更容易实现
-
删除某个元素时,应记得将该删除元素的前后,指向其本身的指针,进行更改
-
转自百度图片,侵删
-
完全以2i平均分布的指针的跳表,成为完全平衡跳表
-
但是我们在插入元素时,就会破坏掉这种平均
-
要想保证完全平衡的跳表,代价是很大的
-
因此,我们对插入元素到底拥有多少指针,以概率来决定,比如1指针1/2,2指针1/4…
-
这样的跳表称为称为随机跳表
-
n个元素的跳表的平均空间复杂度为O(n)