数据结构与算法C++版(笔记)

跳跃链表:

跳跃链表主要是为了解决单链表和双链表查找复杂的问题提出的。其时间复杂度为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双端队列并没有实现为链表,而是实现为指向数据块或数组的指针数组

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值