跳跃链表:
跳跃链表主要是为了解决单链表和双链表查找复杂的问题提出的。其时间复杂度为O(lgn),主要的操作时查找和插入:
一、 查找
目的:在跳跃表中查找一个元素x
在跳跃表中查找一个元素x,按照如下几个步骤进行:
i) 从最上层的链(Sh)的开头开始
ii) 假设当前位置为p,它向右指向的节点为q(p与q不一定相邻),且q的值为y。将y与x作比较
(1) x=y 输出查询成功及相关信息
(2) x>y 从p向右移动到q的位置
(3) x<y 从p向下移动一格
iii) 如果当前位置在最底层的链中(S0),且还要往下移动的话,则输出查询失败
二、插入
目的:向跳跃表中插入一个元素x
首先明确,向跳跃表中插入一个元素,相当于在表中插入一列从S0中某一位置出发向上的连续一段元素。有两个参数需要确定,即插入列的位置以及它的“高度”。
关于插入的位置,我们先利用跳跃表的查找功能,找到比x小的最大的数y。根据跳跃表中所有链均是递增序列的原则,x必然就插在y的后面。
而插入列的“高度”较前者来说显得更加重要,也更加难以确定。由于它的不确定性,使得不同的决策可能会导致截然不同的算法效率。为了使插入数据之后,保持该数据结构进行各种操作均为O(logn)复杂度的性质,我们引入随机化算法(Randomized Algorithms)。
我们定义一个随机决策模块,它的大致内容如下:
产生一个0到1的随机数r r ← random()
如果r小于一个常数p,则执行方案A, if r<p then do A
否则,执行方案B else do B
初始时列高为1。插入元素时,不停地执行随机决策模块。如果要求执行的是A操作,则将列的高度加1,并且继续反复执行随机决策模块。直到第i次,模块要求执行的是B操作,我们结束决策,并向跳跃表中插入一个高度为i的列。
性质1: 根据上述决策方法,该列的高度大于等于k的概率为p^(k-1)。
此处有一个地方需要注意,如果得到的i比当前跳跃表的高度h还要大的话,则需要增加新的链,使得跳跃表仍满足先前所提到的条件。
用C++进行编程实现时:每个节点的指针如何处理?可以用一个指针数组root【level】来存放该节点的指针,数组大小取决于该节点的级数,该节点用一个指针指向该数组。
自组织链表:
几种组织方式:前移法、换位法、级数法、排序法
标准模板库中的表list
#include <list>
list<T> lst;
list(iterator first, iterator last)//构建list ,有first到last间的元素
list()
list(size_type n, const T&el=T())//n个el副本
list(const list<T>&lst)//复制构造函数
T& back();
T& front();
void clear();
vool empty()const;
iterator begin();返回第一个节点的迭代器
iterator end();返回超过最后一个节点的迭代器
iterator erase(iterator i);删除迭代器i所引用的节点,返回一个迭代器,该迭代器引用删除节点后面的元素
iterator erase(iterator first,iterator last);
iterator insert(iterator i, const T & el=T());
iterator insert(iterator i, size_type n, const T&el);//在i的前面插入n个el
void pop_back();
void pop_front();
void push_front(const T&el)
void push_back(const T&el)
void remove(const T &el)//删除所有的el
void sort()//按照从大到小的顺序排序
void sort(Comp f)//按照Boolean 函数f制定的顺序排序
void unique()//删除重复元素
STL中的双端队列deque:
list 中没有at()函数,相当于operation[],deque中增加了该功能
list 中只能对迭代器自增或自减,而deque中可以增加任何整数
const T& at(size_type n) const 返回双端队列n处的元素
T& operator[]
!!!STL双端队列并没有实现为链表,而是实现为指向数据块或数组的指针数组