1 条题解
-
0
Guest
-
0
-
B 解释: 拓扑排序是图论中的一个重要操作,它专门用于处理有向无环图(DAG),输出的序列满足所有任务的依赖关系。
-
B 解释: 树的定义之一就是一个无环的连通图。对于一个包含n个顶点的图,它成为一棵树的充要条件是:图是连通的且有n-1条边,或者图中无环且有n-1条边。
-
C 解释: 贪心算法的两个核心性质是贪心选择性质(每一步都做出当前看起来最优的选择)和最优子结构(问题的最优解包含其子问题的最优解)。Prim算法在每一步都选择连接到当前生成树的、权重最小的边,是贪心算法的典型应用。
-
D 解释:
size()
是vector
中当前存储的元素数量,而capacity()
是vector
在不重新分配内存的情况下可以容纳的元素总量。为减少频繁的内存分配,capacity()
通常会预留一些空间,因此它总是大于或等于size()
。 -
B 解释: 无向图的边
(u, v)
和(v, u)
是同一条边。在邻接矩阵M
中,这意味着M[u][v]
和M[v][u]
的值(通常是1或权重)是相等的。一个矩阵M
如果满足M[i][j] = M[j][i]
,则它是一个对称矩阵。 -
C 解释: 最长不下降子序列问题具有最优子结构。设
dp[i]
表示以第i
个元素结尾的最长不下降子序列的长度,则dp[i]
可以由所有j < i
且a[j] <= a[i]
的dp[j]
推导出来。这是典型的动态规划思想。 -
B 解释: 正数1的8位二进制是
00000001
。求其补码(负数表示法),需要先按位取反得到11111110
,然后加1,结果为11111111
。 -
C 解释: 这是欧拉函数
φ(n)
的标准定义,在数论和密码学(如RSA算法)中有重要应用。 -
C 解释:
std::set
和std::map
是基于红黑树实现的有序容器,它们内部的元素会根据键值自动排序。std::vector
和std::list
是序列容器,不保证有序。std::unordered_map
是哈希表,无序。 -
D 解释: A、B、C 都是卡特兰数的经典应用场景。而n个不同元素的全排列数是
n!
,其增长速度远快于卡特兰数。 -
B 解释:
static
修饰局部变量时,该变量的存储位置从栈区变为静态存储区。它的作用域不变(仍为函数内部),但生命周期延长至整个程序结束。这意味着它在多次函数调用之间保持其值。 -
D 解释: 三分查找(Ternary Search)是二分查找的扩展,专门用于在单峰/单谷函数上快速逼近极值点。它每次排除掉定义域的三分之一,时间复杂度为 O(log n)。
-
A 解释: P类问题是指能在多项式时间内解决的问题。NP类问题是指能在多项式时间内验证解是否正确的问题。所有能在多项式时间内解决的问题,其解自然也能在多项式时间内验证,因此P是NP的子集。
-
D 解释: 这两个都是计算加权连通图的最小生成树(MST)的经典算法。Prim算法以顶点为中心扩展,适合稠密图;Kruskal算法按边权从小到大选择,适合稀疏图。
-
C 解释: IEEE 754是当今最广泛使用的浮点数运算标准,它定义了浮点数的格式(符号位、指数、尾数)以及相关的运算规则。
-
B 解释: 异或(XOR)的逻辑是“相异为真,相同为假”。表达式
(A AND NOT B) OR (NOT A AND B)
精确地描述了A为真且B为假,或者A为假且B为真的情况,这与异或的定义完全一致。 -
B 解释: 树状数组(或称二叉索引树)是专门为解决“单点修改、区间查询”问题设计的数据结构。它的单次修改和查询操作的时间复杂度都是 O(log n),代码实现比线段树更简洁。前缀和数组修改慢,链表和哈希表不适合区间操作。
-
C 解释: 这是排列数(Permutation)的定义,记作
P(n, m)
或A(n, m)
。其计算公式为n * (n-1) * ... * (n-m+1)
,等价于n! / (n-m)!
。 -
B 解释: 平衡二叉搜索树通过旋转操作(左旋、右旋)来调整树的结构,以确保在插入或删除后,任意节点的左右子树高度差仍然在限定范围内(如AVL树中为1),从而维持树的平衡。
-
B 解释: Robert Tarjan 发明的 Tarjan 算法是一种基于深度优先搜索的算法,可以在线性时间 O(V+E) 内找到有向图中的所有强连通分量(SCC)。
-
C 解释: 虚函数是C++实现运行时多态(Runtime Polymorphism)的关键机制。通过基类指针或引用调用虚函数时,程序会在运行时根据对象的实际类型来决定调用哪个版本的函数(基类的还是派生类的)。
-
C 解释: 基数排序(Radix Sort)是一种非比较整数排序算法。它将整数按位数切割成不同的数字,然后按每个位数分别进行排序(分配到不同的桶中),再将它们收集起来。
-
B 解释: 埃氏筛法是一种古老但非常高效的算法,用于找出一定范围内(例如从2到n)的所有质数。它通过从最小的质数开始,依次标记掉其倍数的方式来筛选质数。
-
B 解释: 堆内存是程序中一块较大的、自由的内存区域。程序员通过
new
(C++) 或malloc
(C) 从堆上申请内存,并有责任通过delete
或free
来释放,否则会导致内存泄漏。栈内存由编译器自动管理。 -
B 解释: 这是鸽巢原理最直观的表述。它是一个简单但强大的组合数学原理,可以用来证明许多存在性问题。
-
A 解释:
next[i]
的值表示模式串 P 的子串P[0...i]
中,最长的相等的前缀和后缀的长度。这个数组是KMP算法能够在匹配失败时高效地移动模式串,而无需回溯主串指针的关键。 -
B 解释: 对于一个连通的无向图:如果所有顶点的度数都是偶数,则存在欧拉回路(从一点出发能遍历所有边一次并回到该点);如果恰好有两个顶点的度数为奇数,则存在欧拉路径(从一个奇数度顶点出发,到另一个奇数度顶点结束)。
-
C 解释:
std::priority_queue
是一个容器适配器,它提供常数时间的最大元素查找。其底层默认使用std::vector
作为存储容器,并用std::make_heap
,std::push_heap
,std::pop_heap
等算法来实现最大堆的逻辑。 -
C 解释: 斐波那契数列的递推关系
F(n) = F(n-1) + F(n-2)
可以表示为矩阵形式。通过构造一个转移矩阵,求F(n)
就等价于求该矩阵的n-1
次幂,可以使用快速幂算法将时间复杂度降至 O(log n)。 -
D 解释: 在成员函数声明后加
const
,意味着该函数是一个“常成员函数”。在函数体内,this
指针的类型是const T*
,因此不能通过this
指针修改类的任何非静态数据成员。 -
C 解释: 旅行商问题(TSP)是一个著名的组合优化问题,旨在寻找访问n个城市并返回起点的最短路径。它是NP-Hard问题,其判定版本(是否存在长度小于k的回路)是NP-Complete的。其他选项都有多项式时间解法。
-
B 解释: Graham 扫描法和 Monotone Chain (Andrew's algorithm) 都是计算平面点集凸包的经典高效算法,它们的时间复杂度都是 O(n log n),瓶颈在于对点的排序。
-
D 解释: TCP(传输控制协议)是一种面向连接的、可靠的协议,它工作在传输层,为应用层提供端到端的通信服务。
-
C 解释: 这是一个典型的递归树分析。树的高度是
d
,每一层大约有b
倍于上一层的节点数。总的节点数(代表总的计算量)大致是1 + b + b² + ... + b^d
,这是一个等比数列,其和的数量级为 O(b^d)。 -
A 解释:
#define
是一个简单的文本替换预处理指令,它在编译前执行,没有类型检查,也可能导致意想不到的副作用。const
是语言内置的常量定义方式,它有明确的类型,受编译器类型检查系统的保护,更安全、更推荐使用。 -
A 解释: 霍夫曼编码的核心思想是构造一棵最优二叉树(霍夫曼树),使得出现频率高的字符路径更短,从而获得更短的编码;频率低的字符路径更长,编码也更长。这样加权平均下来,总的编码长度最短。
-
D 解释: C/C++ 等编译型语言的源代码需要经过预处理(如处理
#include
,#define
)、编译(生成汇编代码)、汇编(生成机器码的目标文件)、链接(将目标文件和库链接成可执行文件)等阶段。解释执行是解释型语言(如Python, JavaScript)的运行方式,它逐行读取代码并立即执行。 -
B 解释: 期望值(Expected Value)的计算公式为
E(X) = Σ [x * P(x)]
,即每个取值与其对应概率的乘积之和。所以E(X) = 1*0.5 + 2*0.3 + 3*0.2 = 0.5 + 0.6 + 0.6 = 1.7
。 -
C 解释: 进程调度程序(Scheduler)是操作系统的核心组件之一,它的职责是根据某种调度算法(如先来先服务、时间片轮转等)来决定哪个进程应该在何时获得CPU的使用权。
-
C 解释: 汉诺塔问题的递推关系是
H(n) = 2 * H(n-1) + 1
,其中H(1) = 1
。这是一个经典的递推式,其通项公式解为H(n) = 2^n - 1
。
-
信息
- ID
- 9811
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者