11、数组结构: 高效随机访问的下标集到值集的映射
a)下标集是存储连续的,即最简单的数组形式;
b)下标集是非连续的, 例如存储稀疏矩阵的元组集合
12、链表
a)单链表: 在列表中高效地插入、删除;
b)多重栈、多重队列实现;
13、栈: 先进后出型数据结构,仅允许在一端进行插入和删除
a)深度优先搜索的辅助数据结构,比如回溯技术
b)典型用例: 表达式计算,走迷宫
14、队列: 先进先出型数据结构,仅允许在一端进行插入,在另一端进行删除
a)FIFO服务的最佳选择,比如操作系统中各种就绪、阻塞队列
b)广度优先搜索的辅助数据结构,比如二叉树的层序遍历
15、二叉查找树
在平均情形下,查找、插入、删除、最大元素、最小元素、前驱元素、后继元素的操作均为O(logn),最差情形是O(n)。中序遍历可用于排序。
16、散列表
通常主要支持查找、插入和删除操作;在平均情形下,这些操作可以在O(1)内完成;在最差情形下,在O(n)内完成。
17、位图技术
将给定元素标识成一个位,从而在后续处理中标识该元素的存在。可用于稠密集合的排序,节省空间资源。
18、堆结构
用来查找第k小(大)的元素,前K大的元素,实现优先级队列以及排序。
19、算法分析: Ο(n), Ω(n), Θ(n)
通过统计基本操作的次数,并取主项,可以得到算法运行的时间复杂度。
a)Ο(n): 算法的上界,即至多要运行的时间近似;
b)Ω(n): 算法的下界,即至少要运行的时间近似;
c)Θ(n): 算法的精确界,不大于O(n),不小于Ω(n)
NOTE: 这里通俗地说明三种界,精确定义请参考相关的算法书籍。
通过取阶、无穷小可以快速判断算法复杂度。比如
3n^2 + 2nlogn = O(n^2) 这是因为:
(3n^2 +2nlogn)/(n^2) 对 n 取极限(当n趋于无穷大时)为零,而
(3n^2 +2nlogn)/(nlogn) 取极限为无穷大,因此,
3n^2 + 2nlogn = O(n^2), 3n^2 + 2nlogn =Ω(nlogn)
通过对程序中的嵌套循环层数可以快速判断算法的时间复杂度;但有些情况是例外,比如外层循环的下标根据内层循环的下标进行跳跃性前进。