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

    技术2022-05-20  53

    跳跃链表:

    跳跃链表主要是为了解决单链表和双链表查找复杂的问题提出的。其时间复杂度为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)