学习笔记之线性表
[学习笔记] - 线性表
顺序存储
使用连续的存储单元依次进行存储。
属性:
- 存储起始位置:数组data
- 最大容量: 数组长度MaxSize
- 当前长度: length
随机读取: LOC(\(a_{i+1}\))= LOC(\(a_i\))+ c (c为单个元素空间占用大小),因此顺序存储对于随机读取时间复杂度为O(1)。
插入和删除操作涉及到元素移位,最坏情况为删除第一个元素(剩余元素全部迁移)和插入操作(剩余元素全部后移),时间复杂度为O(n)。
链式存储
以单链表为例,每个节点除了存储数据本身,存储一个指针指向后继节点。
通常有头指针指向第一个节点,链表最后的节点next指针为空。
单链表的读取
需要依次遍历,时间复杂度O(n)
单链表的插入和删除
时间复杂度为O(1)
- 插入
s->next = p->next; |
- 删除
q = p->next; |
链式存储插入删除时间复杂度小,随机读取时间复杂度高
循环链表
circular linked list - 将单链表终端节点的指针由空改为指向头节点,是单个链表形成一个环。
双向链表
DoublyLinked list - 是在单链表的每个节点,再设置一个指向前驱节点的指针。解决单链表无法直接访问前驱的问题。
- 插入
s->prior = p; |
- 删除
p->prior->next = p->next; |
循环双向链表
循环链表 + 双向链表
相关知识
双向链表可用来实现LRU(Least Recently Used)算法,是cache eviction中常用的策略。