- 栈和队列的应用
· 栈:括号匹配、表达式求值(中缀、后缀表达式等)、递归调用(函数调用)
· 队列:二叉树层序遍历、图的广度优先遍历、CPU任务调度 - 稀疏矩阵的存储:三元组法(行标、列标、值)、十字链表法。压缩存储会失去随机存取特性。
- 讲一下十字链表法,及其特点》》》》
- 串的匹配
(1)暴力解法复杂度O(mn);
(2)KMP算法优点是主串不回溯,优化掉模式串与模式串某段前缀比较的弊端。时间复杂度O(m+n)。 - 有关二叉树的概念区分
· 满二叉树:高度为h含有2^h-1个节点的二叉树。
特点:除了最底层叶节点,所有节点的度都为2,都有两个分支。编号为i的节点左子节点为2i,右子节点为2i+1。
· 完全二叉树:高度为h含有n个节点,且每个节点都与高度为h的满二叉树的1~n号节点一一对应。
特点:相当于满二叉树的一部分。最下层的节点集中在左部。
· 二叉排序树:左子树上所有节点均小于根节点关键字,右子树节点均大于根结点关键字。所有节点都如此。
· 平衡二叉树:树上任一节点的左子树和右子树的深度之差不超过1。 - 二叉树的遍历
先序、中序、后序、层序遍历中,中序序列和任一其他序列可以还原二叉树。必须要有中序序列。 - 线索二叉树:二叉树的链式存储中,n个节点会有n+1个空指针。设置ltag和rtag标志,为0表示指示节点为子节点。
建立线索二叉树的过程:《》《》《》 - 树的存储结构:
· 双亲表示法:利用类似静态链表性质,进行双亲查找。两行,一行是数据,一行是父节点的数组下标。很快能找到父节点,但求子节点时需要遍历整个结构。
· 孩子表示法:将每个节点的孩子节点都用单链表链接起来形成一个线性结构。所有节点形成一个线性表。寻找子女非常直接,但是寻找双亲需要遍历n个节点中孩子链表指针域所指向的n个孩子链表。
· 孩子兄弟表示法:左孩子右兄弟原则转为二叉树进行存储。 - 树和森林的遍历对应二叉树的遍历
树 | 森林 | 二叉树 |
---|---|---|
先根遍历 | 先序遍历 | 先序遍历 |
后根遍历 | 中序遍历 | 中序遍历 |
-
二叉排序树
最坏情况下时间复杂度:O(n);平均为O(log n) 。 -
平衡二叉树
平均查找长度为O(log n) 。 -
哈夫曼树与哈夫曼编码
可变长度编码,是应用广泛的数据压缩编码。是一种前缀码。 -
图的有关概念
· 完全图:任意两顶点间都存在边;任意两定点间都存在方向相反的两条弧。
· 无向图中,从定点v到定点w有路径存在,称v和w是连通的。
· 有向图中v到w和w到v都有路径,则称此图为强连通图。 -
图的存储
· 邻接矩阵法:适合稠密的图,无向图邻接矩阵一定是对称矩阵。空间复杂度O(|V|^2)。
· 邻接表法:适合稀疏图,表示不唯一,存储空间为[无向:O(|V|+2|E|);有向:O(|V|+|E|)]
· 十字链表法:存有向图,尾域,头域,两个链域,信息域;同样表示不唯一。
· 邻接多重表:存无向图,在邻接表中对两个顶点是否存在边,以及对边执行删除等操作时,需要分别在两个顶点的边表中遍历,效率低。 -
图的遍历
广度优先遍历BFS:借助队列。邻接表O(|V|+|E|);邻接矩阵O(|V|^2)。可以求解单源最短路径问题。
深度优先遍历DFS:借助递归工作栈。空间复杂度O(|V|)。邻接表O(|V|+|E|);邻接矩阵O(|V|^2)。 -
普里姆Prim算法
-
克鲁斯卡尔算法
-
排序:插入排序、交换排序、选择排序、归并排序、基数排序
(1)插入排序:直接插入排序、折半插入排序、希尔排序
(2)交换排序:冒泡排序、快速排序
(3)选择排序:简单选择排序、堆排序
(4)归并排序:
(5)基数排序:适合较大数据量的排序
排序方法 | 最佳时间复杂度 | 最坏时间复杂度 | 稳定性 | 备注 |
---|---|---|---|---|
直接插入排序 | 有序:O(n) | 逆序:O(n^2) | 稳定 | 顺序存储或链式存储的线性表 |
折半插入排序 | O(n log n) | 逆序:O(n^2) | 稳定 | 通过low和high的赋值确保稳定性。 主要时间复杂度花在移动上。 适合数据量不大的排序表。 |
希尔排序 | – | O(n^2) | 不稳定 | 适用于线性表存储的数据 |
冒泡排序 | O(n) | O(n^2) | 稳定 | 每一次都有元素到达最终位置 |
快速排序 | O(n log n) | 有序:O(n^2) | 不稳定 | 空间复杂度O(log n),要用到栈 |
简单选择排序 | O(n^2) | O(n^2) | 不稳定 | 元素被动交换会导致不稳定 每趟都会有 |
堆排序 | O(n log n) | O(n log n) | 不稳定 | |
归并排序 | O(n log n) | O(n log n) | 稳定 | 空间复杂度O(n) |
基数排序 | O(d(n+r)) | O(d(n+r)) | 稳定 | 与初始状态无关。 不基于比较和移动。 |