第一章 算法概述
1.数据结构就好比舞台,算法就是舞台上的舞者。
2.衡量算法两大标准:
时间复杂度、空间复杂度
常见时间复杂度:
O
(
1
)
<
O
(
l
o
g
n
)
<
O
(
n
)
<
O
(
n
l
o
g
n
)
<
O
(
n
2
)
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)
常见空间复杂度:
O
(
1
)
<
O
(
n
)
<
O
(
n
2
)
O(1)<O(n)<O(n^2)
O(1)<O(n)<O(n2)
绝大多数情况下,时间复杂度越小越好。
第二章 数据结构基础
1.
逻辑结构 | 线性结构(数组、链表、栈、队列,散列表) | 非线性结构(树、堆、图) |
物理结构 | 顺序存储结构:数组 | 链式存储结构:链表 |
常见数据结构:数组、链表、栈、队列、哈希表、树、堆、图
2.数据结构基本操作:
增、删、改、查
3.数组与链表
数组: 物理上存储连续。
链表:物理上随机存储.
时间复杂度比较:
查找 | 更新 | 插入 | 删除 | |
---|---|---|---|---|
数组 | O(1) | O(1) | O(n) | O(n) |
链表 | O(n) | O(n) | O(1) | O(1) |
4.栈和队列
机制 | 基本操作 | 应用 | |
---|---|---|---|
栈 | 先入后出(First In Last Out,FILO) | 入栈(push)、出栈(pop):O(1) | 浏览器导航 |
队列 | 先入先出(First In First Out,FIFO) | 入队(enqueue)、出队(dequeue):O(1) | 线程调度 |
(数组实现时可以采取循环队列来维持队列容量恒定)
5.哈希表(散列表)
本质也是数组。通过哈希函数作为中转站把key和数组下标进行转换。
提供键(key)和值(Value)的映射
基本操作:
写操作(put):有可能会产生哈希冲突。解决方法:开放寻址、链表法。
读操作(get):通过key寻找value。
(Python中哈希表对应的集合叫字典(dict),且采用开放寻址方法处理哈希冲突;Java采用链表法处理哈希冲突。)
未完待续…