数据结构与STL基础知识复习
1、数据存储结构:顺序存储结构和链式存储结构
2、算法与程序概念略有差别:算法要满足5个准则(输入,输出,有穷性,确定性和可行性),程序可以不满足有穷性
3、算法分析:时间复杂度(多项式时间算法和指数时间算法)、空间复杂度
4、STL(standard template library,标准模板类)是C++语言提供的一个基础模板集合,包含各种常用的存储数据的模板类和相应的操作函数,为开发者提供了一种快速有效的访问机制。STL最初由惠普实验室开发,1998年被定为国际标准。
5、STL有13个头文件,由6部分组成空间管理器、迭代器(类似指针)、泛函、适配器、容器(顺序容器,排序容器和哈希容器)和算法。
6、顺序表是一种随机的存储结构,静态存储分配,方便查询操作。注,C++数组的下标从0开始。
7、链表是一种顺序存取方式,动态存储分配,可分为单链表、双链表和循环链表,方便插入和删除等操作。
8、STL与线性表(6和7)相关的容器有向量(vector,数组实现),列表(list,链式存储的双向循环链表)等顺序容器。
9、栈:后进先出(LIFO),顺序存储结构和链式存储结构。
10、队列:先进先出(FIFO),循环队列(队头指针所指位置永不存储队列元素,队列长度(rear-front+QueueSize)%QueueSize),链队列。
11、串:模式匹配(即定位算法)。朴素模式匹配算法(BF算法)基本思想是将模式串的各个字符依次与目标串进行比较,如果模式串的全部字符比较完成后都与目标串的对应字符相同,则说明在目标串中已经找到模式串。如果比较到某个字符不同后,将模式串与目标串的下一个字符开始重新比较。改进算法有KMP算法和BM算法等。
12、STL与栈、队列和串(9、10和11)相关的模板类有双端队列容器(deque)、栈适配器(stack)、队列适配器(queue)、优先级队列适配器(priority_queue)和串容器(string)。
13、多维数组存储方式:行优先存储和列优先存储;矩阵的压缩存储:特殊矩阵(对称矩阵、三角矩阵和对角矩阵),稀疏矩阵的存储的方法:三元组表和十字链表;广义表是一种非线性结构。
14、树:有序树{二叉树和哈夫曼树(带权路径最短的二叉树,最优二叉树)},存储结构:双亲表示法(静态链表)、孩子表示法(一维数组和多个单链表结合)和孩子兄弟表示法(二叉链表)。
15、树的遍历:每个结点被访问一次且仅被访问一次
前序遍历:根左右
后序遍历:左右根
层序遍历:广度遍历,按层次从上到下,从左到右
16、二叉树:满二叉树(所有叶子节点位于最后一层且其他分支结点度为2)和完全二叉树(相比于满二叉树,最后一层可以不满)
二叉树的遍历:由前序遍历和中序遍历可确定唯一二叉树,由后序遍历和中序遍历也可确定唯一二叉树
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
17、树和森林:前序遍历森林(树)=前序遍历该森林(树)对应的二叉树;后序遍历森林(树)=中序遍历该森林(树)对应的二叉树。
18、哈夫曼树(最优二叉树):哈夫曼编码是1952年最先由Huffman提出来的有一种广泛应用于数据压缩的一种有效编码方式。构造方法,最小权值结点两两合并。
19、图:存储结构有邻接矩阵、邻接表、十字链表、邻接多重表和边集数组。图的遍历:深度优先遍历(前序遍历,栈)和广度优先遍历(层序遍历,队列)。
20、最小生成树:
普利姆算法(Prim),不断选取最小值的边并把对应的顶点不断并入集合的过程,时间复杂度O(n^2);
克鲁斯卡尔算法(Kruskal),为使生成树上边的权值之和最小,其中每一条边的权值应该尽可能小,时间复杂度O(n^2)。
21、最短路径:
Dijkstra算法解决一个顶点到所有其它顶点的最短路径,基本思想,按路径长度递增的次序产生源点到其余各顶点的最短路径,时间复杂度O(n^2);
Floyd算法求任意两点间的最短路径,邻接矩阵求解,时间复杂度为O(n^3)。
22、查找:
静态查找(顺序查找、折半查找和分块查找),线性表
动态查找(二叉排序树和平衡二叉树),树表,二叉排序/查找树(左<根<右)中序遍历为递增有序序列;平衡二叉排序树左右子树高度之差的绝对值<=1
散列查找(散列技术),散列表
散列函数设计方法:直接定址法、除留余数法、数字分析法、平方取中法和折叠法
冲突处理方法:开放定址法、链地址法和公共溢出法
23、排序基本上是基于顺序表设计的,分为插入排序、交换排序、选择排序和归并排序。
插入排序:最简单的为直接插入排序(稳定,每个元素距离其最终位置不远)、希尔排序(不稳定)
交换排序:起泡排序(稳定)、快速排序(不稳定)
选择排序:简单选择排序(不稳定)、堆排序(不稳定)
归并排序:二路归并排序(稳定)