本讲定位(先把话说清楚):基础算法系列第 06 讲,本线正篇的最后一讲,标 S⭐,J 组可跳。
定位比第 05 讲还要克制,依据是本库两份逐题统计(
cspj-series/cspj-round2-analysis-2019-2025.md、csps-series/csps-round2-analysis-2019-2025.md):迭代加深、双向搜索、折半搜索、A 在 CSP-J/S 两组复赛七年 58 题里 0 次主考点、0 次次考点。* 它们在真题里只出现在初赛阅读程序:双向 BFS 是 CSP-S 2020 阅读(3) 的原题,折半搜索是 CSP-S 2025 阅读(3) 的新面孔(csps-series/csps-exam-analysis-2019-2025.md§3)。所以本讲要交付的是三样东西:(1)NOI 大纲【7】级三条目(迭代加深、双向广搜、启发式搜索)达标;(2)CSP-S 初赛阅读程序里认得出这三种代码、能手算它的复杂度;(3)知道每种手段的前提,以及前提破了会怎样。 不追求做难题。
接第 05 讲的钩子:第 05 讲 §2.1 那张表说”可行性剪枝的收益随 $n$ 指数放大”。本讲回答它留下的问题——当剪枝已经用尽、搜索树还是太大时,怎么办? 答案不是再剪,而是换一棵更小的树:限制深度反复搜(§2)、从两头往中间搜(§3)、把 $2^n$ 拆成两个 $2^{n/2}$(§4)。
⚠️ 编译选项:本讲代码块由
tools/check-cpp-blocks.py用g++ -std=c++11(不开-O2) 编译运行,下列耗时即该环境实测;§4.3 另给了开-O2的对照。结点数 / 出队数 / 枚举量与编译选项无关,本讲的结论优先用它们表述——这是第 05 讲定下的纪律。
O2 后排序占比降到 84%,二分比双指针只慢 4.1 倍——又一条必须标编译选项的结论。前置:
basic-series/05-backtracking-and-pruning.md —— 本讲直接接第 05 讲 §2.1 的钩子;回溯骨架不重讲。graph-series/03-bfs-advanced.md §4 —— 双向 BFS 已经在那里用八数码实测过(省 95%~98% 出队,无解时反而慢 30%)。本讲不重做八数码,只讲一般框架,并换一个非棋盘的状态空间重测一次。basic-series/07-two-pointers.md §3 —— 折半搜索的”合并两半”就是那一节的相向双指针(有序数组两数之和)。basic-series/04-enumeration-simulation-construction.md §2 —— 子集枚举 for (s = 0; s < (1 << n); s++) 的写法,折半的两半各用一次。适合对象:CSP-S 复赛(全讲);CSP-S 初赛(§2.1、§3.2、§4.2 三个模板 + §7.2 的读法,能看懂 2020 / 2025 阅读(3) 那两段代码即可);CSP-J 可整讲跳过(J 组两轮七年 0 次)。
本讲不讲(只指路):