绪论
1 同一个算法,实现的语言级别越高,效率就越低
2 循环队列是用顺序表表示的队列
3 数据结构的逻辑结构就是在设计上与物理结构无关,是一种抽象出来的数学模型
4 存储密度,在计算机中是指结点数据本身所占的存储量和整个结点结构所占的存储量之比,计算公式:存储密度 = (结点数据本身所占的存储量)/(结点结构所占的存储总量)。链式存储的存储密度小于1。
线性表
1 如果给定一个链表并且给定某个节点,要删除该节点,两种方式,一种是可以循环找到该节点的前驱,然后删除,复杂度是O(n)。另一种方式是将该节点的后继节点的值赋值给该节点然后删除其后继节点,复杂度为O(1)。
2 线性表是一种逻辑结构,表示元素之间一对一的相邻关系。顺序表和链表是指存储结构。
3 线性表中元素的位序是从1开始的,而数组的下标是从0开始的
4 顺序表是一种随机存储,顺序存取是一种读写方式,有别与顺序存储
5 头结点指的是链表中物理上的第一个结点,头指针指的是指向物理上第一个结点的指针(存放该结点地址的变量),开始结点指的是逻辑上的第一个元素的结点。
6 下面的代码fun执行结果是13,fun1执行结果是10
void fun(L*& sql)
{
L *b = new L();
b->data = 13;
sql = b;
}
void fun1(L* sql)
{
L *b = new L();
b->data = 13;
sql = b;
}
int main()
{
L *a=new L();
a->data = 10;
fun(a);
cout << a->data << endl;
return 0;
}
栈和队列
7 ABCDEFGH入栈,不可能的出栈次序是什么?
首先直接看第一个比如GHBACDEF,这个G第一个出栈,则G前面的均在栈里面,所以ABCDEF他们的出栈顺序必然维持FEDCBA的状态,由此可以判断,这个是一个充分条件。
8 计算出栈排列的方式次数:
总
数
量
=
1
n
+
1
C
2
n
n
总数量=\frac{1}{n+1}C^{n}_{2n}
总数量=n+11C2nn。
9 队列长度计算:
l
e
n
=
(
r
e
a
r
+
m
a
x
s
i
z
e
−
f
r
o
n
t
)
%
m
a
x
s
i
z
e
len=(rear+maxsize-front)\%maxsize
len=(rear+maxsize−front)%maxsize
其中rear指向队尾元素,front指向队头前一个元素。
树和二叉树
1 树的一个节点的子节点的个数是该节点的度,树中结点最大的度数称为树的度
2 树的基本性质:1)度为m的树上第i层最多
m
i
−
1
m^{i-1}
mi−1个结点。
2) 高度为h的m叉树至多有
m
h
−
1
m
−
1
\frac{m^{h}-1}{m-1}
m−1mh−1个结点。
3)具有n结点的m叉树的最小高度为
l
o
g
m
(
n
(
m
−
1
)
+
1
)
log_{m}(n(m-1)+1)
logm(n(m−1)+1)向上取整
4)非空二叉树叶子结点数等于双分支结点数加1
3 在一棵m叉树中,度为1的结点个数是
n
1
n_{1}
n1,度为2的结点数是
n
2
n_{2}
n2,…,度为m的结点数
n
m
n_{m}
nm则叶子结点的个数
n
0
=
1
+
n
2
+
2
n
3
+
.
.
.
.
.
+
(
m
−
1
)
n
m
n_{0}=1+n_{2}+2n_{3}+.....+(m-1)n_{m}
n0=1+n2+2n3+.....+(m−1)nm
4 给定n个结点形成不同二叉树的个数:
总
数
量
=
1
n
+
1
C
2
n
n
总数量=\frac{1}{n+1}C^{n}_{2n}
总数量=n+11C2nn。
5 完全二叉树总结点数为n,那么
n
=
2
n
0
+
n
1
−
1
n=2n_{0}+n_{1}-1
n=2n0+n1−1完全二叉树中n1只能取0或者1。
6 如果一颗二叉树有126个结点,在第七层至多有多少个结点(63)
图
1 自环(Loop):若一条边的两个顶点为同一顶点,则此边称作自环。
2 桥(Bridge):若去掉一条边,便会使得整个图不连通,该边称为桥。
3 连通图:在一个无向图 G 中,若从顶点i到顶点j有路径相连(当然从j到i也一定有路径),则称i和j是连通的。如果 G 是有向图,那么连接i和j的路径中所有的边都必须同向。如果图中任意两点都是连通的,那么图被称作连通图。如果此图是有向图,则称为强连通图(注意:需要双向都有路径)。
4 连通分量:无向图 G的一个极大连通子图称为 G的一个连通分量(或连通分支)。连通图只有一个连通分量,即其自身;非连通的无向图有多个连通分量
5 强连通图:有向图 G=(V,E) 中,若对于V中任意两个不同的顶点 x和 y,都存在从x到 y以及从 y到 x的路径,则称 G是强连通图。相应地有强连通分量的概念。强连通图只有一个强连通分量,即是其自身;非强连通的有向图有多个强连分量。
6 单向连通图:设G=<V,E>是有向图,如果u->v意味着图G至多包含一条从u到v的简单路径,则图G为单连通图。
7 弱连通图:将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。
8 完全图:任何两个顶点之间均连通的图,有向完全图有
n
(
n
−
1
)
n(n-1)
n(n−1)条边,无向完全图有
n
(
n
−
1
)
2
\frac{n(n-1)}{2}
2n(n−1)条边。
9
N
h
N_{h}
Nh表示高度为h的平衡二叉树中含有的最少结点的个数。
N
0
=
0
,
N
1
=
1
,
N
2
=
2
,
.
.
.
.
.
N
h
=
N
h
−
1
+
N
h
−
2
+
1
N_{0}=0,N_{1}=1,N_{2}=2,.....N_{h}=N_{h-1}+N_{h-2}+1
N0=0,N1=1,N2=2,.....Nh=Nh−1+Nh−2+1,比如
N
5
=
12
N_{5}=12
N5=12
10 拓扑排序的两种实现方法,一种是直接拓扑,取入度为0的点,另一种拓扑排序是根据DFS算法,最先退出算法顶点的就是出度为0的顶点他是拓扑排序的最后一个顶点。
11
算法 | 实现细节 | 时间复杂度 |
---|---|---|
DFS | 使用邻接矩阵 | O ( n 2 ) O(n^2) O(n2) |
BFS | 使用邻接矩阵 | O ( n 2 ) O(n^2) O(n2) |
DFS | 使用邻接表 | O ( n + e ) O(n+e) O(n+e) |
BFS | 使用邻接表 | O ( n + e ) O(n+e) O(n+e) |
拓扑排序 | 普通拓扑 | O ( n + e ) O(n+e) O(n+e) |