算法、图、动态规划与关系数据库

32 张本科复习卡片,涵盖排序、图算法、动态规划、SQL、索引和事务。需要具备基础编程、数据结构和 SQL 知识。

Level
basic
Languages
zh → zh
Cards
32
Markdown
算法、图、动态规划与关系数据库 (.md)

Flashcards (32)

#Front (Term / Question)Back (Definition / Answer)ExampleMultiple-Choice Options
1二分查找需要什么条件?何时能在 O(log n) 时间内完成?它在按比较次序排好的数据中反复将查找区间减半。若数组支持 O(1) 下标访问且每次比较耗时为常数,则查找 n 个元素需要 O(log n) 时间。
2两阶段锁定(2PL)的两个阶段是什么?增长阶段:获取锁而不释放锁。收缩阶段:释放锁而不获取新锁。使用合适的冲突读写锁时,2PL 保证调度具有冲突可串行化性,但仍可能发生死锁。
3B+ 树为什么适合数据库索引和范围查询?较大的扇出使树较矮,减少页面访问。有序键和相连的叶节点支持范围扫描。哈希索引针对等值查找,本身不提供同样的有序范围访问。
4记忆化与自底向上的动态规划有什么区别?记忆化按需计算子问题,通常使用递归并缓存结果。自底向上的动态规划按依赖项已经求出的次序计算状态,通常通过填表实现。
5SQL SELECT 查询的简化逻辑处理顺序是什么?对于不含 CTE、窗口函数或集合运算的查询:FROM/JOIN → WHERE → GROUP BY 与聚合 → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFFSET。这是逻辑模型,不一定是优化器实际执行的物理顺序。
6什么是幻读?如何防止它?另一个事务提交更改后,重复谓词查询会得到不同的匹配行集合。标准模型中的 SERIALIZABLE 防止幻读;包括 PostgreSQL REPEATABLE READ 在内的一些实现也会在较低级别防止幻读。
7什么是脏读?哪个标准隔离级别最先禁止它?读取另一个事务尚未提交的数据,无论该事务之后是否回滚。READ COMMITTED 及更强的标准隔离级别禁止脏读。
8标准数组归并排序如何工作?时间和空间界是多少?它递归排序两个半区,再在线性时间内合并。在比较耗时为常数的假设下,标准版本需要 Θ(n log n) 时间和 O(n) 辅助空间。
9深度优先搜索如何检测有向图中的环?DFS 用递归或显式栈向深处探索。指向当前 DFS 路径上仍处于活动状态的顶点的边是回边,证明存在有向环;仅仅指向任意已访问顶点并不足以证明有环。
10计数排序或基数排序何时能达到线性时间?计数排序对取值范围含 k 个值的 n 个键需 O(n+k)。基数排序若进行 d 次稳定的数位排序、基数为 b,则需 O(d(n+b))。只有这些参数允许时才是线性时间;它们利用了比较之外的键结构。
11PostgreSQL 中的主键与外键有何区别?主键以唯一、非 NULL 的值标识行。外键要求其值匹配被引用的键值,但受相应 NULL 规则约束。它可以引用同表或另一表中符合条件的 UNIQUE 键或主键。
12原地堆排序的最坏时间和额外空间界是多少?建堆需要 O(n),随后所有取出操作合计需要 O(n log n)。若在输入数组中采用迭代下沉,堆排序最坏耗时 O(n log n),额外空间为 O(1)。
13什么是拓扑序?卡恩算法如何求得拓扑序?在有向无环图中,每条边 u→v 都要求 u 排在 v 前面。反复输出入度为零的顶点并删除其出边,将新出现的零入度顶点入队。若输出顶点数少于 V,则有向图含环。
14插入排序如何工作?近乎有序输入的耗时取决于什么?它逐个把元素插入已排序的前缀。通常采用相邻移位或交换的版本需要 Θ(n+I) 时间,其中 I 为逆序对数量。I=O(n) 时为线性时间;输入规模小本身并不改变最坏 Θ(n²) 的界。
15SQL Server 中的聚集与非聚集行存储索引有何区别?聚集索引按键序存储表行,所以每张表最多有一个。非聚集索引具有自己的键和行定位符,也可包含其他列。这些术语和存储细节因数据库系统而异。
16快速排序为什么可能耗时 Θ(n²)?随机化有何帮助?反复出现高度不均衡的划分,例如每次都选不同键中的最小键作为枢轴,会导致二次工作量。当键互异或正确处理重复键时,随机选择枢轴可使期望耗时为 O(n log n)。三数取中是一种实用启发式方法,不保证最坏情况的界。
17贪心算法与动态规划有何区别?贪心算法直接采用局部选择,需要证明这些选择能保留一个最优解。动态规划通过递推比较方案并复用子问题结果。全局最优需要正确的模型和递推关系,不能仅凭“动态规划”这一名称保证。
18迪杰斯特拉算法何时有效?常见的堆实现复杂度是多少?边权非负时,它反复确定暂定距离最小的顶点。邻接表配合二叉最小堆的实现耗时 O((V+E) log V)。负权边可能使已确定距离的正确性论证失效。
19在正常同步提交下,PostgreSQL 的 WAL 如何支持持久性?相关日志记录在确认提交之前、也在写入已更改的数据页之前到达持久存储。崩溃后,WAL 可重放数据页尚未包含的更改。异步提交可能丢失最近已确认的事务。
20最长公共子序列长度的动态规划递推式是什么?令 L[i,j] 为长度分别为 i,j 的前缀的最长公共子序列长度。设 L[0,j]=L[i,0]=0。末字符相同则 L[i,j]=1+L[i−1,j−1];否则 L[i,j]=max(L[i−1,j],L[i,j−1])。完整表需要 O(mn) 时间和空间。
21贝尔曼–福特算法如何处理负权边并检测可达负环?对所有边最多进行 V−1 轮松弛。若再从可达顶点松弛仍能改进距离,就说明存在从源点可达的负环。最坏耗时 O(VE);从此负环可达的顶点没有有限的最短路径代价。
22整数容量 W 的标准 0/1 背包递推式是什么?令 D[i,w] 表示用前 i 件物品、容量为 w 时的最大价值,重量 wᵢ 为正整数。设 D[0,w]=0。若 wᵢ>w,则取 D[i−1,w];否则取 max(D[i−1,w],vᵢ+D[i−1,w−wᵢ])。O(NW) 时间是伪多项式时间。
23广度优先搜索如何在无权图中找到最短路径?BFS 使用先进先出队列,按边数距离逐层探索顶点。在顶点入队时标记可避免重复访问。首次发现到达某个可达顶点的路径具有最少的边数。
24分组查询中的 WHERE 和 HAVING 有何不同?WHERE 在分组之前筛选输入行。HAVING 筛选产生的分组,可使用 COUNT(*)>1 等聚合条件。
25什么使排序算法具有稳定性?键相同的元素保持原来的相对次序。归并排序在相等时先取左侧元素即可实现稳定;标准原地快速排序通常不稳定。稳定性取决于具体实现。
26邻接矩阵与普通邻接表如何比较?对 V 个顶点、E 条边,矩阵需 O(V²) 空间,判断一条边是否存在需 O(1)。邻接表需 O(V+E) 空间;在未排序的表中查找边 (u,v) 需 O(deg(u)),其中 deg(u) 是该表长度。
27事务的 ACID 属性各是什么意思?原子性:效果要么全部发生,要么全部不发生。一致性:正确事务保持约束和应用不变量。隔离性:并发行为遵守所选隔离级别。持久性:已提交效果在数据库配置保证所涵盖的故障后仍然存在。
28什么是不可重复读?哪个标准隔离级别可防止它?另一个事务提交更新或删除后,再读同一行得到不同数据,或发现该行消失。REPEATABLE READ 和 SERIALIZABLE 禁止这种异常。
29动态规划为何适用于许多优化问题?最优子结构允许用子问题的最优解表达整体最优解。当子问题重叠时,存储结果可避免重复计算。状态定义和递推关系必须正确表达原问题。
30INNER JOIN 和 LEFT JOIN 有何区别?INNER JOIN 返回满足连接条件的行组合。LEFT JOIN 还保留每个未匹配的左表行,并在右表列中填入 NULL。若右表有多个匹配行,一个左表行可能产生多个输出行。
31第一、第二和第三范式分别要求什么?1NF:属性值具有原子性。2NF:满足 1NF,且任何非主属性都不依赖于任一候选键的真子集。3NF:满足 1NF,且每个非平凡依赖 X→A 中,X 为超键或 A 为主属性。主属性属于至少一个候选键。
32克鲁斯卡尔和普里姆算法如何构造最小生成树?对于连通无向加权图,克鲁斯卡尔按边权递增考察边,用并查集拒绝产生环的边。普里姆从一棵树开始,每次选择连接树内与树外顶点的最小权边来扩展。