回溯算法
引言:为什么需要回溯 许多算法问题不是「求一个最优值」,而是「把所有符合条件的方案枚举出来」,或者「在庞大的状态空间里找一个可行解」。前者如「列出数组的所有全排列」「把字符串切成若干回文子串的所有切法」,后者如「在 9×99 \times 99×9 棋盘上填出一个合法数独」「在字符网格里搜出某个单词」。 这类问题的共同特点是:解空间结构上是一棵巨大的「决策树」,每个节点代表「到目前为止已经做...
二分查找
二分查找(Binary Search)大概是每个程序员最早接触到的算法之一:在有序数组里找目标值,每次砍掉一半,O(log n) 完事。听起来简单到不值一提。但只要稍微写过几道二分题,几乎所有人都经历过「改一个符号就死循环」「差一行就越界」「边界永远是 off-by-one」的折磨。Donald Knuth 在《The Art of Computer Programming》里指出,第一个正...
分治算法
引言:为什么「分而治之」如此自然 面对一个规模为 nnn 的问题,如果它具备某种可分解的内部结构,我们往往不必正面强攻。把问题切成若干个规模更小的同构子问题,递归求解后再把答案拼回来——这就是分治(Divide and Conquer)。这并非某种具体算法,而是一套算法设计范式,与贪心、动态规划、回溯并列。 分治的影子无处不在:归并排序把数组对半切,快速排序按 pivot 分两半,最近点对按...
动态规划
动态规划(Dynamic Programming,DP)是算法世界里最具张力、也最容易让人"卡壳"的一个主题。它的代码往往只有寥寥数行,思想却能在陌生题目面前把人挡在门外;它的理论门槛看似只是一句"分治 + 记忆化",但能否在第一时间构造出正确的状态定义,几乎直接决定了"会做"与"不会做"。本文将以 DP 的三要...
贪心算法
引言:从「走一步看一步」到「步步最优」 在算法世界里,有两类策略恰好处于光谱的两端。一类是「把所有可能都试一遍再回溯」的搜索派——DFS、回溯、动态规划都属于这一脉,它们宁可付出指数级代价也要保证不漏掉任何一种可能。另一类则是「看眼前、不回头」的贪心派——每一步都基于当前可观察的信息做出最优决策,做完就不再反悔。 贪心算法 (Greedy Algorithm) 听起来朴素得近乎天真:在每一步...
双指针技术
双指针(Two Pointers)是数组、字符串、链表上最常用的算法技巧之一。它用一个看似平凡的细节–用两个游标代替一个游标遍历–换取指数级的效率提升。表面上看,从「单指针 O(n²)」到「双指针 O(n)」省下的是一次嵌套循环;往深处理解,双指针真正在做的是利用问题本身的结构(单调性、有序性、区间不变量),把搜索空间裁剪成一个低维流形。 这一篇我们系统地拆解双指针的四大家族:对撞指针、快慢...
数位 dp
数位 dp(digit DP)是一类专门处理「在某个数区间 [L,R][L, R][L,R] 内统计满足特定数位性质的数」的动态规划技术。所谓"数位性质",指的是只取决于数的十进制(或任意进制)表示中各位数字的性质,例如"不含数字 4"、“相邻两位之差至少为 2”、“数字之和等于 K”。这类问题看似简单,但区间上界可能高达 101810^{18}101...
Golang 杂项:embed 与资源嵌入
课程概览 · 上一篇:测试与工程实践 · 第 12 章 //go:embed 指令与 embed 包(Go 1.16 引入)解决了 Go 程序分发时的一个老问题:如何把静态资源——HTML 模板、SQL 迁移、前端构建产物、默认配置、TLS 证书——连同二进制一起发布,做到单文件部署。在 embed 之前,社区用 go-bindata、packr、statik、vfsgen 等代码生成工...
Cargo.toml 配置速查
Cargo.toml 是 Cargo 项目的清单文件(TOML 格式),描述包名、版本、依赖、特性、编译目标等。本文给出常用配置速查。 最小示例 1234567[package]name = "myapp"version = "0.1.0"edition = "2021"[dependencies]serde = { ve...
C++17 any 与 variant
在 C++ 中,我们经常需要“用一个变量持有多种可能的类型”。C 风格的 union 和 void* 是最早的答案,但它们既不安全(不记录当前存的是哪种类型),也缺乏面向对象的扩展能力。C++17 引入了 std::any 和 std::variant,从两个不同方向填补了这块空白: std::any:类型擦除(type erasure)——持有一个任意类型的值,但“忘记”了它的静态类型,...
Python collections 包详解
Python 内置的 dict、list、set、tuple 已经覆盖了绝大多数日常需求,但一旦遇到"按出现次数统计"“给元组字段起名字”“双端高效增删”"层叠的配置查找"这类场景,手写往往既啰嗦又容易出错。标准库的 collections 模块正是为此而生:它在内置类型之上提供了一批专门化的容器,既保留 Pythonic 的简洁,又补齐了数据结构层面...
FastAPI 快速上手
FastAPI 是基于 Python 类型标注的现代 Web 框架,底层是 Starlette(ASGI)和 Pydantic(数据校验)。核心思想很纯粹:函数签名上的类型标注就是一切契约的来源–路由参数解析、请求体校验、响应序列化、OpenAPI 文档全部从同一份标注推导。写一次标注,同时得到校验、文档和编辑器补全,这是对「动态语言写后端」的最大重构。 安装与第一个应用 FastAPI 本...
所有权、借用与生命周期:用数据流理解编译器
课程概览 · 第 6 章 上一篇:函数与 I/O:把所有权、错误和资源边界写进接口 下一篇:结构体:组织数据、封装状态与编写方法 同一段任务数据,往往要被查询函数读取、被编辑函数修改、再被日志函数打印。如果"谁负责释放"和"谁正在改它"只靠人为约定,悬垂指针和数据竞争就藏在这些约定里。Rust 把约定升级为编译期规则:所有权规定清理责任,借用规定读...
函数与 I/O:把所有权、错误和资源边界写进接口
课程概览 · 第 5 章 上一篇:表达式与控制流:让分支、循环和返回值清楚可审查 下一篇:所有权、借用与生命周期:用数据流理解编译器 函数签名是 Rust 最重要的设计文档:参数类型说明谁拥有数据、要不要还,返回类型说明成功产出什么、失败怎么办。文件 I/O 把这两件事逼到真实世界–文件会缺失、配置会为空、读取会中途失败。本章把所有权、错误与资源边界写进签名,用 ? 把失败路径组织成直线...
表达式与控制流:让分支、循环和返回值清楚可审查
课程概览 · 第 4 章 上一篇:切片和范围:为函数设计稳定、低耦合的输入 下一篇:函数与 I/O:把所有权、错误和资源边界写进接口 Rust 是表达式语言:if、match、代码块乃至循环都能产生值。这让"从输入算出一个结果"可以写成一条类型明确的表达式链。但工程上的优先级不是炫技式地消灭临时变量,而是让每个分支的类型、每个循环的退出条件、每条失败路径在评审时一眼可...
C++ 转换运算符
在 C++ 中,转换运算符(conversion operator) 又称用户定义转换函数(user-defined conversion function),是一种特殊的成员函数,用于把当前类类型的对象转换为另一个类型。它的语法形式是 operator 目标类型(),与构造函数形成对称关系:构造函数把"其他类型"构造成"本类型",而转换运算符把&qu...
字符串与切片:String、&str 与 UTF-8 边界
课程概览 · 第 2 章 上一篇:Rust 基础:变量、类型与转换的工程选择 下一篇:切片和范围:为函数设计稳定、低耦合的输入 字符串是 Rust 里被使用得最多、也最容易选错的一对类型:String 拥有数据,&str 只借用数据。更深的坑在 UTF-8–中文字符占 3 个字节,字节下标随时可能落进字符中间。本章把这两个层面一次讲清:所有权层面的 String vs &...
切片和范围:为函数设计稳定、低耦合的输入
课程概览 · 第 3 章 上一篇:字符串与切片:String、&str 与 UTF-8 边界 下一篇:表达式与控制流:让分支、循环和返回值清楚可审查 上一章的结论是"只读文本用 &str"。本章把同一思路推广到任意序列:函数应该声明自己需要的是"一段数据"还是"修改一段数据",而不是绑死调用方用 Vec 还是数组...
Rust 基础:变量、类型与转换的工程选择
课程概览 · 第 1 章 下一篇:字符串与切片:String、&str 与 UTF-8 边界 学 Rust 的第一个真实障碍不是新语法,而是默认选择:哪些值该可变、类型标注写在哪里、数值转换在哪个边界必须受检。这些选择做错了,代码照样能编译,但接口会变贵、错误会推迟出现。本章用任务队列 CLI 里的两个小函数,把这些默认选择一次立起来;文本数据(String 与 &str...
Rust 工程课程概览:从能运行到可维护
📚 Rust 课程系列 课程概览(本文) Rust 基础:变量、类型与转换的工程选择 字符串与切片:String、&str 与 UTF-8 边界 切片和范围:为函数设计稳定、低耦合的输入 表达式与控制流:让分支、循环和返回值清楚可审查 函数与 I/O:把所有权、错误和资源边界写进接口 所有权、借用与生命周期:用数据流理解编译器 结构体:组织数据、封装状态与编写方法 枚举:把状态...



















