(数据结构)第三章 列表

3.1 从向量到列表

向量中的秩同时对应于逻辑和物理次序,而位置仅对应于逻辑次序。

3.3.1 数据结构支持的操作:静态和动态。

size()和get()均可以在常数时间内完成。

insert()和remove()均需要线性时间完成。

静态策略:在O(1)时间内由秩确定向量元素的物理地址,但就动态操作而言,局部的修改可能引起大范围甚至整个数据结构的调整。

动态策略:列表,尽管要求各元素在逻辑上具有线性次序,但对其物理地址却未作出任何限制。

链表是一种典型的动态存储结构。节点之间通过指针相互索引和访问。

列表是链表结构的一般化推广,其中的元素称作节点,分别由特定的位置和链接指代。

节点的作用:保存对应的数据项,还应记录其前驱和后继的位置。

3.2.1 列表节点

列表节点支持的操作接口

data()、pred()、succ()、insertAsPred(e)、insertAsSucc(e)

3.3 列表

3.3.1 头、尾节点

私有的头节点和尾节点始终存在,但对外并不可见。头节点紧邻于首节点之前,尾节点紧邻于末节点之后。

哨兵节点的引入:使得相关算法不必再对各种边界退化情况做专门的处理。

此后引入的新节点都将陆续插入于这一对哨兵节点之间。

3.3.4 查找

时间复杂度为O(n),线性正比于查找区间的宽度。

3.3.8 析构

列表析构首先调用clear()接口删除并释放所有对外部有效的节点,然后释放内部的头、尾哨兵节点。

3.3.10 遍历

3.5 排序器

这里介绍了三种排序方法:

插入排序、选择排序、归并排序。

插入排序:始终将整个序列视作并切分为两个部分:有序的前缀,无序的后缀;通过迭代,反复地将后缀的首元素转移至前缀中。

在任何时刻,相对于当前节点e=S[r],前缀S[0,r]总是业已有序。

选择排序:将序列划分为无序前缀和有序后缀两部分,此外,要求前缀不大于后缀。每次只需从前缀中选出最大者,并作为最小元素转移至后缀中,即可使有序部分的范围不断扩张。

猜你喜欢

转载自blog.csdn.net/xyk_hust/article/details/84964058