这里写目录标题
宝藏博主
第二次考核
A和B选项:比较字符串并不在乎两个字符串的长度,而是逐个比较两个字符串中的字符的ASCII值,若相等则继续比较,否则返回两个字符ASCII值的差。
C选项:两个字符串不会相等,因为它们保存在不同的地址,只有字符串的值才会相等。
D选项:正确,而且返回-4,因为’a’ - 'e’为-4。
深度:看前括号个数
选a
第一次考核
选c,为什么? d:o(n)?只要给出前驱节点就能直接插入和删除,但是没有给出前驱结点的话就需要遍历得到,这种情况的复杂度为o(n)
王道网课
第三次考核
所谓连通图一定是无向图,有向的叫做强连通图
最短路径算法-迪杰斯特拉(Dijkstra)算法
基本思想
引进两个数组S和U。S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点D的距离)。
只是将才连好的点的邻接点和起始点的距离大小更新,然后再进行选择。
最短路径弗洛伊德算法
最小生成树prim算法(普里姆算法)
普里姆算法的实现思路是:
1.将连通网中的所有顶点分为两类(假设为 A 类和 B 类)。初始状态下,所有顶点位于 B 类;
2.选择任意一个顶点,将其从 B 类移动到 A 类;
3.从 B 类的所有顶点出发,找出一条连接着 A 类中的某个顶点且权值最小的边,将此边连接着的 A 类中的顶点移动到 B 类;
4.重复执行第 3 步,直至 B 类中的所有顶点全部移动到 A 类,恰好可以找到 N-1 条边。
举个例子,下图是一个连通网,使用普里姆算法查找最小生成树,需经历以下几个过程:
eg:
-
将图中的所有顶点分为 A 类和 B 类,初始状态下,A = {},B = {A, B, C, D, S, T}。
-
从 B 类中任选一个顶点,假设选择 S 顶点,将其从 B 类移到 A 类,A = {S},B = {A, B, C, D, T}。从 A 类的 S 顶点出发,到达 B 类中顶点的边有 2 个,分别是 S-A 和 S-C,其中 S-A 边的权值最小,所以选择 S-A 边组成最小生成树,将 A 顶点从 B 类移到 A 类,A = {S, A},B = {B, C, D, T}。
-
从 A 类中的 S、A 顶点出发,到达 B 类中顶点的边有 3 个,分别是 S-C、A-C、A-B,其中 A-C 的权值最小,所以选择 A-C 组成最小生成树,将顶点 C 从 B 类移到 A 类,A = {S, A, C},B = {B, D, T}。
-
从 A 类中的 S、A、C 顶点出发,到达 B 类顶点的边有 S-C、A-B、C-B、C-D,其中 C-D 边的权值最小,所以选择 C-D 组成最小生成树,将顶点 D 从 B 类移到 A 类,A = {S, A, C, D},B = {B, T}。
-
从 A 类中的 S、A、C、D 顶点出发,到达 B 类顶点的边有 A-B、C-B、D-B、D-T,其中 D-B 和 D-T 的权值最小,任选其中的一个,例如选择 D-B 组成最小生成树,将顶点 B 从 B 类移到 A 类,A = {S, A, C, D, B},B = {T}。
-
从 A 类中的 S、A、C、D、B 顶点出发,到达 B 类顶点的边有 B-T、D-T,其中 D-T 的权值最小,选择 D-T 组成最小生成树,将顶点 T 从 B 类移到 A 类,A = {S, A, C, D, B, T},B = {}。
-
由于 B 类中的顶点全部移到了 A 类,因此 S-A、A-C、C-D、D-B、D-T 组成的是一个生成树,而且是一个最小生成树,它的总权值为 17。
最小生成树克鲁斯卡尔算法
克鲁斯卡尔算法查找最小生成树的方法是:将连通网中所有的边按照权值大小做升序排序,从权值最小的边开始选择,只要此边不和已选择的边一起构成环路,就可以选择它组成最小生成树。
kruskal算法详解
弗洛伊德算法的核心为:对于从顶点 A 到顶点 B 的最短路径,拿出网中所有的顶点进行如下判断:
Dis(A,K)+ Dis(K,B)< Dis(A,B)
也就是说,拿出所有的顶点 K,判断经过顶点 K 是否存在一条可行路径比直达的路径的权值小,如果式子成立,说明确实存在一条权值更小的路径,此时只需要更新记录的权值和即可。
eg
30
拓扑排序
拓扑排序是对一个有向图构造拓扑序列,解决工程是否能顺利进行的问题
例如,图 1 中的两个图都是有向无环图,都可以使用拓扑排序对图中的顶点进行排序,两个图形的区别是:左图中的 V2 和 V3 之间没有明确的前后顺序;而右图中任意两个顶点之间都有前后顺序。
所以,左图中顶点之间的关系被称为“偏序”关系;右图中顶点之间的关系被称为”全序“关系。
全序是偏序的一种特殊情况。对于任意一个有向无环图来说,通过拓扑排序得到的序列首先一定是偏序,如果任意两个顶点都具有前后顺序,那么此序列是全序。
1.对有向无环图进行拓扑排序,只需要遵循两个原则:
2.在图中选择一个没有前驱的顶点 V;
从图中删除顶点 V 的出度。
有向无环图如果顶点本身具有某种实际意义,例如用有向无环图表示大学期间所学习的全部课程,每个顶点都表示一门课程,有向边表示课程学习的先后次序,例如要先学《程序设计基础》和《离散数学》,然后才能学习《数据结构》。所以用来表示某种活动间的优先关系的有向图简称为“AOV网”
进行拓扑排序时,首先找到没有前驱的顶点 V1,如图 2(1)所示;在删除顶点 V1 及以 V1 作为起点的弧后,继续查找没有前驱的顶点,此时,== V2 和 V3 都符合条件,可以随机选择一个==,例如图 2(2) 所示,选择 V2 ,然后继续重复以上的操作,直至最后找不到没有前驱的顶点。
所以,针对图 2 来说,拓扑排序最后得到的序列有两种:
V1 -> V2 -> V3 -> V4
V1 -> V3 -> V2 -> V4
如果顶点之间只是具有偏序关系,那么拓扑排序的结果肯定不唯一;如果顶点之间是全序关系,那么拓扑排序得到的序列唯一。
拓扑排序详解
eg:
关键路径
拓扑排序只适用于 AOV 网,本节所介绍的求关键路径针对的是和 AOV 网相近的 AOE 网。
AOE 网是在 AOV 网的基础上,其中每一个边都具有各自的权值,是一个有向无环网。其中权值表示活动持续的时间。
如图 1 所示就是一个 AOE 网,例如 a1=6 表示完成 a1 活动完成需要 6 天;AOE 网中每个顶点表示在它之前的活动已经完成,可以开始后边的活动,例如 V5 表示 a4 和 a5 活动已经完成,a7 和 a8 可以开始。
使用 AOE 网可以帮助解决这样的问题:如果将 AOE 网看做整个项目,那么完成整个项目至少需要多少时间?
解决这个问题的关键在于从 AOE 网中找到一条从起始点到结束点长度最长的路径,这样就能保证所有的活动在结束之前都能完成。
起始点是入度为 0 的点,称为“源点”;结束点是出度为 0 的点,称为“汇点”。这条最长的路径,被称为”关键路径“。
为了求出一个给定 AOE 网的关键路径,需要知道以下 4 个统计数据:
对于 AOE 网中的顶点有两个时间:最早发生时间(用 Ve(j) 表示)和最晚发生时间(用 Vl(j) 表示);
对于边来说,也有两个时间:最早开始时间(用 e(i) 表示)和最晚开始时间( l(i) 表示)。
Ve(j):对于 AOE 网中的任意一个顶点来说,从源点到该点的最长路径代表着该顶点的最早发生时间,通常用 Ve(j) 表示。
例如,图 1 中从 V1 到 V5 有两条路径,V1 作为源点开始后,a1 和 a2 同时开始活动,但由于 a1 和 a2 活动的时间长度不同,最终 V1-V3-V5 的这条路径率先完成。但是并不是说 V5 之后的活动就可以开始,而是需要等待 V1-V2-V5 这条路径也完成之后才能开始。所以对于 V5 来讲,Ve(5) = 7。
Vl(j):表示在不推迟整个工期的前提下,事件 Vk 允许的最晚发生时间。
例如,图 1 中,在得知整个工期完成的时间是 18 天的前提下,==V7 最晚要在第 16 天的时候开始,因为 a10 活动至少需要 2 天时间才能完成,如果在 V7 事件在推迟,就会拖延整个工期。==所以,对于 V7 来说,它的 Vl(7)=16。
e(i): 表示活动 ai 的最早开始时间,如果活动 ai 是由弧 <Vk,Vj> 表示的,那么活动 ai 的最早开始的时间就等于时间 Vk 的最早发生时间,也就是说:e[i] = ve[k]。
e(i)很好理解,拿图 1 中 a4 来说,如果 a4 想要开始活动,那么首先前提就是 V2 事件开始。所以 e[4]=ve[2]。
l(i): 表示活动 ai 的最晚开始时间,如果活动 ai 是由弧 <Vk,Vj> 表示,ai 的最晚开始时间的设定要保证 Vj 的最晚发生时间不拖后。所以,l[i]=Vl[j]-len<Vk,Vj>。
在得知以上四种统计数据后,就可以直接求得 AOE 网中关键路径上的所有的关键活动,方法是:对于所有的边来说,如果它的最早开始时间等于最晚开始时间,称这条边所代表的活动为关键活动。由关键活动构成的路径为关键路径。
求关键路径的具体过程
对图 1 中的 AOE 图求关键路径,首先完成 Ve(j)、Vl(j)、e(i)、l(i) 4 种统计信息的准备工作。
Ve(j),求出从源点到各顶点的最长路径长度为(长度最大的):
Vl(j),求出各顶点的最晚发生时间(从后往前推,多种情况下选择最小的):
e(i),求出各边中ai活动的最早开始时间:
l(i),求各边中ai活动的最晚开始时间(多种情况下,选择最小的):
学习通错题
第一章
1.
2.
3.
第二章
1.
第三章
1.
第四章
1.
2.
3.
第五章
1.
2.
也就是说,广义表的head操作,取出的元素是什么,那么结果就是什么。但是tail操作取出的元素外必须加一个表——“ ()“
3.
4.
广义表
通常,广义表中存储的单个元素称为 “原子”,而存储的广义表称为 “子表”。
强调一下,除非广义表为空表,否则广义表一定具有表头和表尾,且广义表的表尾一定是一个广义表。
例如在广义表中 LS={1,{1,2,3},5} 中,表头为原子 1,表尾为子表 {1,2,3} 和原子 5 构成的广义表,即 {{1,2,3},5}。
再比如,在广义表 LS = {1} 中,表头为原子 1 ,但由于广义表中无表尾元素,因此该表的表尾是一个空表,用 {} 表示。
由于广义表中既可存储原子(不可再分的数据元素),也可以存储子表,因此很难使用顺序存储结构表示,通常情况下广义表结构采用链表实现。
5.
6.
广义表的表尾是广义表中将除了第一个元素之外的所有元素看做一个广义表
第六章
答案:选D
一棵含有n个结点的树,有n-1个分支,即 n = 14 + 22 + 31 + 41 + 1 = 16;
又由于 n = n0 + n1 + n2 + n3 + n4 = n0 + 8;
n0 + 8 = 16,所有叶子结点个数为8
树转化为二叉树
步骤:
1.在所有兄弟结点之间加一连线
2.对每个结点,除了保留与其长子的连线外,去掉该结点与其它孩子的连线。
二叉树转化为树
2.
3.
4.
5.
6.
7.
8.
前缀编码是指 在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀。
D项110是1100的前缀了。
二叉树是树的特殊情形。
9.
第七章
2.
2.
3.
prim适合稠密图
边代表的是活动之间的优先关系
要大于n*(n-1)/2
连通的才行
第八章
二次探测:1,-1,4,-4,9,-9…
二次聚集的产生是在二次探测的基础上产生的现象
第九章
不稳定排序:快速选择,希尔,快排,堆排序
希尔,快排,堆排序,归并排序时间复杂度:nlog2n
归并空间复杂度:n
快排:log2n
调整堆:交换堆顶元素和最后一个元素
初始堆:每调整一个数值后都要从下往上看
堆排序:一直交换堆顶和最后一个元素