阅读 · 推演 · 自测 · 理解
FOUNDATIONS · BEGINNER'S APPROACHES

通用解题方法 · 从关系到算法

算法就是“一份别人照着做,也能做对的步骤说明”。先认出题目要什么,再选一条能解释清楚的做法。不需要先学会写代码。

① 找输入

别人给了我什么?
一排数?一个目标?一张喜好表?

② 找输出

我要交回什么?
在不在?哪几个位置?最少多少?

③ 找保证

题目特别告诉我什么?
已排序?不能重复选?值越大越容易成功?

按大类学习通用做法,展开后才看具体例子。当前内容归入第 1 周学习记录;课件来源仅使用2026 T3 Welcome与Foundations;题目指南归纳和自编例子另行标明。周数按悉尼日期与开学日 2026-09-14 计算,不等于官方考核范围。

选择学习周次

复制后粘贴到 Codex 发送,即手动执行一次:收集 COMP3121 新课件并更新方法笔记。

手动执行指令
$comp3121-lecture-sync 更新3121课件并补充按周解题方法笔记。
第 1 周 / 通用方法

关系改写与特征分组

故事 → 数学关系 → 等价变形 → 单个对象的特征 → 分组或查找

先把“两个人之间满足什么”写成关系 R(i,j),再尝试把 i 的项与 j 的项分开。如果能等价改写成 g(i)=g(j),就为每个对象单独计算 g,特征相同的对象放在一组。不是所有关系都能这样拆。

把两对象的关系,改写成单对象的特征
01 / 建模

把两对象的关系,改写成单对象的特征

看到什么,就想起它?

条件里同时出现 i、j,但加减移项后可能把两个对象分开。先检查能否得到 g(i)=g(j)。

先用生活里的话理解

给每个对象算一张“特征标签”。如果原条件等价于标签相同,就不必逐对检查,直接找同标签的对象。

做法公式 · Approach

R(i,j) ⇔ g(i)=g(j) → 算出所有 g(i) → 排序分组 → 按问题取组大小或对象

R(i,j) 是两个对象满足的原关系;g(i) 是只由第 i 个对象及其原位置计算出的特征。⇔ 表示双向等价;n 是对象总数。

具体例子 · 2026 T3 当前课件

来自当前题目指南的 1.4(不是已确认的 lecture PPT 例题):A[i]−A[j]=i−j。两边移项得到 A[i]−i=A[j]−j,令 g(i)=A[i]−i。同一组内任意两项都满足原条件。 Foundations p20–21补充通用存储方法:小整数值域直接用频率表;大键使用字典。这里只支持分组计数的工具选择,Maximum Alignment 的代数变形仍来自题目指南,不是讲义原例。

还没懂?点这里,一步一步想

分步讲解用于理解,不代替对全部合法输入的证明。

别这样套用

必须证明两个方向都成立。不要把仅必要条件当等价条件;除法要检查分母为零,平方可能引入额外解。特征中的 i 是原位置,不能排序后重新编号再计算。

工作量怎么看?

计算特征 O(n),将特征排序并扫描分组 O(n log n)。若另用哈希分组,需要明确期望时间与课程允许条件,不直接宣称最坏 O(n)。

检查理解 / 记下我自己的技巧
作答后看解释

移项得 xᵢ−2i=xⱼ−2j,因此取 g(i)=xᵢ−2i;再验证这个等式也能变回原条件。

相关分支:固定一个对象,查找它需要的搭档
02 / 搜索

相关分支:固定一个对象,查找它需要的搭档

看到什么,就想起它?

如果关系不能直接变成相同标签,尝试固定 i,把 j 需要满足的条件单独解出来。例如 aᵢ+aⱼ=T ⇔ aⱼ=T−aᵢ。

先用生活里的话理解

像凑 10 元:你已经有 3 元,就只需要找 7 元,不用再猜搭档要多少。

做法公式 · Approach

先排好队 → 固定一个数 → 算还差多少 → 快速找差额

差额 = T − h[i]。T 是目标总数;h[i] 是你先选的数;i 是它的位置。n 表示一共有多少个数。

具体例子 · 2026 T3 当前课件

Welcome 的“两只鹅穿风衣”:两只不同鹅的身高之和必须恰好等于 T。先排序,再为每只鹅查找 T−h[i]。

还没懂?点这里,一步一步想

分步讲解用于理解,不代替对全部合法输入的证明。

别这样套用

必须是两只不同的鹅。只有一只身高 5 的鹅,目标 10,不能把它用两遍;一种安全做法是只在当前位置右侧查找。

工作量怎么看?

排序花 O(n log n);每只鹅查找花 O(log n),共 n 次,所以总时间 O(n log n)。查找如何变快,看下一张卡。

检查理解 / 记下我自己的技巧
作答后看解释

找 12−5=7。不能重复使用同一个对象;对象不同可以具有相同的值。

第 1 周 / 通用方法

转换问题实例,复用已有算法

数学限制 → 构造新实例 → 调用已知算法 → 对应解与目标值 → 合计成本

当陌生问题接近熟悉问题,先尝试改造输入,让标准算法直接适用。正确性检查双向对应,最优化还要检查目标值。彩色最短路径是本学期讲义实例。

把局部限制变成删边,再调用 BFS
07 / 归约

把局部限制变成删边,再调用 BFS

看到什么,就想起它?

无权最短路多了一个能逐条边独立判断的限制。

先用生活里的话理解

先把不能走的路从地图上划掉,再用熟悉的最短路线方法。

做法公式 · Approach

E′={(a,b)∈E | color(a)≠color(b)} → H=(V,E′) → BFS

G=(V,E)是原无向无权图;H保留全部顶点,仅保留异色边。BFS返回边数距离。

具体例子 · 2026 T3 当前课件

课件原图:u、c蓝;a、d红;b、e、v绿。删u–c、a–d、b–v。原最短路u–b–v长2但不合法;最短合法路u–a–c–d–v长4。

还没懂?点这里,一步一步想

分步讲解用于理解,不代替对全部合法输入的证明。

别这样套用

只证明新路径合法还不够,必须证明原合法路径没丢。要求“全程某颜色最多一次”等历史限制不能直接照搬;带权最短路不直接用普通BFS。

工作量怎么看?

邻接表构造O(|V|+|E|),BFS O(|V|+|E′|),相加仍O(|V|+|E|),空间同阶。7点10边删3条后7边,是讲义图的规模。

检查理解 / 记下我自己的技巧
作答后看解释

还要证明H的路径与G的合法路径双向对应且长度不变,否则BFS可能正确解决了一个与原题不同的问题。

第 1 周 / 通用方法

分解问题与合并答案

定义子问题 → 处理更小规模 → 合并结果 → 检查边界

将大实例转成更小的同类实例,写清答案之间的等价条件、基本情况与规模递减。回文是本学期Foundations的原例。

写等价条件,把问题缩成更小的自己
08 / 递归

写等价条件,把问题缩成更小的自己

看到什么,就想起它?

去掉一部分后,剩下的问题与原来同型;能写出答案之间的等价关系。

先用生活里的话理解

拆开一层,检查这一层,再把相同问题交给里面更小的一层。

做法公式 · Approach

P(l,r) ⇔ s[l]=s[r] 且 P(l+1,r−1);l≥r 时为真

s是原字符串;l,r是当前两端下标;P表示该区间是否回文。长度每次减2,不能漏掉空串基本情况。

具体例子 · 2026 T3 当前课件

Foundations p45 回文原题;教学自编“radar”:r=r,再看“ada”;a=a,再看“d”;单字符是真。

还没懂?点这里,一步一步想

分步讲解用于理解,不代替对全部合法输入的证明。

别这样套用

递归不自动等于对数时间。每次只少2个字符,有线性层数;复制子串还可能产生二次工作量。

工作量怎么看?

下标方式T(n)=T(n−2)+O(1),O(n)时间、O(n)递归栈;自编例radar比较2对。逐层复制子串可达O(n²)。

检查理解 / 记下我自己的技巧
作答后看解释

每层减2而不是除2。约n/2层才到基本情况,仍是线性数量。

第 1 周 / 通用方法

正确性论证与工作量分析

小例找漏洞 → 对任意输入论证 → 数操作次数 → 合并各阶段代价

这是每个算法都需要的检查层:反例可以否定一个方法;一般证明才能支持所有合法输入。速度要另行计算,不能用“跑通一个例子”代替证明或复杂度分析。

算法写完,怎样数它要做多少工作?
06 / 复杂度

算法写完,怎样数它要做多少工作?

看到什么,就想起它?

题目要求 O(n)、O(log n) 或 O(n log n),你需要说明每部分花多少工作。

先用生活里的话理解

先擦 10 张桌子,再搬 10 把椅子,是两份工作相加;给 10 张桌子各放 4 张纸,是重复 10 次每次 4 张。

做法公式 · Approach

先后做:加起来 | 每次都做:次数 × 每次工作

n 是输入个数。O(...) 说的是输入变大时工作量的上界量级,不是秒数。常数和较小项在这种比较里可以略去。

具体例子 · 2026 T3 当前课件

Welcome PDF p17–18:鹅题先排序,再为每只鹅做一次二分。Foundations p11–12给出顺序相加与重复相乘规则;p46要求计入构造成本、调用次数和单次成本;p47的Hamiltonian Path枚举说明简单操作重复阶乘次仍然很慢。

还没懂?点这里,一步一步想

分步讲解用于理解,不代替对全部合法输入的证明。

别这样套用

有两层循环不自动等于 n²:要数真实执行次数。遍历不同组时,若每个元素只被看一次,所有组加起来仍只看 n 个元素。

工作量怎么看?

例:先排序再扫描,O(n log n)+O(n)=O(n log n)。这里用大写 O;小写 o 有另一种数学含义。

检查理解 / 记下我自己的技巧
作答后看解释

不是。先后两个 O(n) 阶段相加是 O(n)。如果每个元素都重新扫描整个数组,才会产生 n×n 的工作。

TRANSFER / 当前题目的迁移

把技巧带回你正在做的题

下面是作业题的简短联系,来源是你提供的题目 PDF,不是 PPT 原例。

1.2 · 有序网格

顺序 → 安全排除。
右上角比目标大,排除这一列;比目标小,排除这一行。每次说明为什么这一整段不可能。

回到网格演示 →

1.3 · 两只鹅

凑目标 → 看两端。
排好队后,两端之和太小,左端配谁都不够;太大,右端配谁都太大。用这个理由说明移动不漏解。

回到双指针演示 →

1.4 · 相同特征归一组

改写条件 → 计算特征 → 找最大组。
A[i]−A[j]=i−j 可改为 A[i]−i=A[j]−j。i、j 是原位置;A[i] 是该位置的值。同样的“值减位置”才分在一起。

回到 alignment 讲解 →
小提醒:如何把技巧写成作业答案?

先用文字写清具体步骤和停止条件,再解释为什么不会出错,最后数工作量。不能只交“用二分”“用排序”这样的名字。算法演示与短例子帮助理解,不代替一般证明。

来源与范围

页码全部使用 PDF 的实际页序(从 1 开始),不是页脚编号。点击链接可核对原页;本地服务启动后可以打开。页面正文和交互本身可离线阅读。

“具体例子”保留已核对材料的来源;特征分组依据当前题目指南归纳;“教学小例 / 自编数值”是为理解额外添加的例子,已经分开标注。示例省去故事细节,但保留使用条件。

勾选和你写的技巧只保存在当前浏览器,不是作业提交记录。