- 写在前面:该类文章作为笔者的读书笔记,仅供参考。
数组:
动态指定,但需要对于大小的最大值进行估计(估计过大浪费空间);插入删除平 均需要移动表一半的元素,最坏情况为
O(N
)
- 线性查找的话,时间复杂度为O(N)
- 二分查找的话时间为O(longN)
- 无序数组插入的时间复杂度为O(1)
- 有序数组插入的时间复杂度为O(N)
- 删除操作的时间复杂度均为O(N)
链表:
不连续存储(避免插入删除的线性开销),每个结构均包含表元素和指向包含该元素后继元的结构的指针(
next
指针)
- 在表头插入和删除速度很快,仅需改变一两个引用值,所以话费O(1)的时间
- 平均起来,查找、删除和在指定节点后面插入都需要搜索链表中的一半节点,需要O(N)次比较
- 链表比数组优越的另一个重要方面是链表需要多少内存就可以用多少内存,并且可以扩展到所有可用内存。
栈:
插入和删除只能在一个位置上进行,即表末端,称为栈顶(
top
);基本操作有进栈(
push
)和出栈(
pop
);别称
LIFO
(后进先出)表
- 可用数组和链表实现
- 数据项入栈和出栈的时间复杂度均为O(1)
- 应用:平衡符号、后缀表达式、中缀到后缀的转换、函数调用(存储活动记录,递归函数会导致栈溢出)
队列:
基本操作是入队(
enqueue
),在队尾(
rear
)插入元素;有出队(
dequeue
),在队头(
front
)删除(或返回)元素
- 可用数组实现(循环数组,解决数组下标满的问题)
- 队列中插入数据项和删除数据项的时间复杂度均为O(1)