【算法导论】第10章,基本数据结构

10.1 栈和队列

都是动态集合,Delete操作是预先设定好的。

Insert:push Delete: pop

实现,一个计数器记录元素数量

同理,队列实现是一个计数器记录首尾元素的位置,如果首元素太过靠后,尾元素可以过来。

10.2 链表

双向链表:每一个元素是一个对象,有prev, next两个指针,还有元素本身的数值,两边的元素是None

L.head指向第一个元素。

链表搜索 、 插入、 删除、

哨兵:主要作用:简化边界值的处理!

  看着也像是一个元素,只不过值为空,这样一个双向链表可以变成一个有哨兵的双向循环链表,哨兵位于表头和表尾中间。

不能滥用哨兵:如果有很多个很短的链表,那么哨兵占用的额外存储空间会造成存储浪费。

10.3 指针和对象的实现

对象多数组表示,位置用另一个方向的下标来表示

对象单数组表示,连续的数组储存所有的信息,位置用下标来表示。优势:允许不同长度的对象存储于同一数组中。

对象的分配与释放: 一般由gc负责

  以下针对多数组表示的双向链表:

  维护一个单链表:自由表,只有next数组,每个对象不是在链表中,就是在自由表中。自由表类似一个栈,下一个分配的就是刚刚被释放的。

10.4 有根树的表示

用链式数据结构表示:

二叉树:很容易

节点数量无限制的数:左孩子右兄弟表示法

其他表示方法:视具体情况而定,例如完全二叉树在堆排序中用一个数组表示。

猜你喜欢

转载自www.cnblogs.com/yesuuu/p/8926354.html