[算法设计与分析-从入门到入土] 递归

算法设计与分析-从入门到入土 递归

知乎:https://www.zhihu.com/people/byzh_rc

CSDN:https://blog.csdn.net/qq_54636039

注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码

参考文章:各方资料

文章目录

  • [算法设计与分析-从入门到入土 递归](#[算法设计与分析-从入门到入土] 递归)
  • 递归recursion
  • 1.归纳法Induction
        • [以选择排序求解数组 `A1...n`为例](#以选择排序求解数组 A[1...n]为例)
        • [全排列生成generating permutation](#全排列生成generating permutation)
  • [2.分治法divide and conquer](#2.分治法divide and conquer)
  • [3.动态规划dynamic programming](#3.动态规划dynamic programming)

递归recursion

递归技术存在三种特殊情况:

  1. 归纳法Induction: 数学证明中的归纳思想
  2. 非重叠子问题Nonoverlapping: 分治法(拆成p个子问题)
  3. 重叠子问题overlapping: 动态规划(自底向上)(以空间换取时间)

1.归纳法Induction

核心思想:

对于参数为n的问题, 先假设 "参数小于n的子问题已解决"(归纳假设), 再将子问题扩展到参数为n的情况

以选择排序求解数组 A[1...n]为例

归纳假设:假设长度为 n-1 的子数组 A[1...n-1] 已能成功排序

原问题转化:要解决长度为 n 的原数组排序,只需先在整个数组 A[1...n] 中找到最小值 min,将其与数组第一个元素交换位置;此时原数组被拆分为"已确定有序的最小值 min"和"待排序的子数组 A[1...n-1]"

m i n , A \[ 1... n − 1 \] \] \\big\[ min, A\[1...n-1\] \\big\] \[min,A\[1...n−1\]

通过这一过程,原问题的规模从n 缩小到 n-1,最终可递推至规模为 1(单个元素天然有序)的基准情况,完成整个排序

通过递推式计算比较次数:
C o m p a r e ( n ) = { 0 n = 1 ( n − 1 ) + C ( n − 1 ) n ≥ 2 = n ( n − 1 ) 2 \begin{align} Compare(n) &= \begin{cases} 0 & n=1 \\ (n-1) + C(n-1) & n \geq 2 \end{cases} \\ &= \frac{n(n-1)}{2} \end{align} Compare(n)={0(n−1)+C(n−1)n=1n≥2=2n(n−1)

全排列生成generating permutation

目的: 给定整数 n n n,生成由数字 1 , 2 , ... , n 1,2,\dots,n 1,2,...,n 构成的所有排列

归纳假设:已能生成 n − 1 n-1 n−1 个元素的所有排列

原问题转化: 将第 n n n 个元素插入到所有可能位置,从而生成 n n n 个元素的排列

  1. 固定数字 1 在首位,递归生成 { 2 , 3 , ... , n } \{2,3,\dots,n\} {2,3,...,n} 的所有排列;
  2. 固定数字 2 在首位,递归生成 { 1 , 3 , ... , n } \{1,3,\dots,n\} {1,3,...,n} 的所有排列;
  3. 依次类推,直到固定数字 n n n 在首位

时间复杂度: Θ ( n ∗ n ! ) \Theta(n*n!) Θ(n∗n!)

空间复杂度: Θ ( n ) \Theta(n) Θ(n)

递推式写成:
f ( n ) = { 0 n = 1 n f ( n − 1 ) + n n ≥ 2 f(n)= \begin{cases} 0 &n=1 \\ nf(n-1)+n & n \geq2 \end{cases} f(n)={0nf(n−1)+nn=1n≥2

令 f ( n ) = n ! h ( n ) f(n)=n!h(n) f(n)=n!h(n),

则 n ! h ( n ) = n ( n − 1 ) ! h ( n − 1 ) + n n!h(n)=n(n-1)!h(n-1)+n n!h(n)=n(n−1)!h(n−1)+n

则 h ( n ) = h ( n − 1 ) + 1 ( n − 1 ) ! < e − 1 h(n)=h(n-1)+\frac{1}{(n-1)!}<e-1 h(n)=h(n−1)+(n−1)!1<e−1

-> f ( n ) < n ! ( e − 1 ) f(n)<n!(e-1) f(n)<n!(e−1)

e.g. 对于集合{1, 2, 3, 4}:

1 234, 2 134, 3 124, 4123,

(12 34), 13 24, 14 23,

(21 34), 23 14, 24 13,

(31 24), 32 14, 34 12,

(41 23), 42 13, 4312,

(123 4), 124 3

(213 4), 214 3

(312 4), 314 2

(412 3), 413 2

(132 4), 134 2,

(142 3), 143 2,

(231 4), 234 1,

(241 3), 243 1,

(321 4), 324 1,

(341 2), 342 1,

(421 3), 423 1,

(431 2), 4321

-> A 4 4 = 24 A_4^4=24 A44=24

2.分治法divide and conquer

  • 找到多数元素
  • 最小 / 最大值查找
  • 第 k 小元素查找

3.动态规划dynamic programming

  • 最长公共子序列问题LCS
  • 全对最短路径问题(All-Pairs Shortest Path)
  • 0/1背包问题Knapsack
相关推荐
circuitsosk11 小时前
NL2SQL在工业级场景下的精度优化:Schema Linking + 动态Few-shot实战
人工智能·python·sql·大模型·nl2sql
9000AI11 小时前
9000AI如何工业化生产流量?高质量规模生产与矩阵化饱和覆盖
人工智能
字节数据平台12 小时前
iDA:从 ChatBI 到专业数据分析助手的演进之路
大数据·人工智能·机器学习·数据分析
warpdrivelabs12 小时前
Codex 开源 harness 全面了解
开发语言·人工智能
mit6.82412 小时前
微软如何交付企业级Agent
人工智能
Mininglamp_271812 小时前
明略科技携手海康机器人亮相世界机器人大会,以“Agent+具身“联合进入商业机器人场景
人工智能·科技·机器人·开源·agent·ai agent
2401_8949155312 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
1000世界小札14 小时前
《大话数据结构》第9章精读:归并排序与快速排序完整 C++ 实现
数据结构·c++·算法
MobotStone14 小时前
从“听得懂”到“干得了”:工业大模型落地工厂的三层进化路线
人工智能
wangruofeng14 小时前
GLM-5.3-Flash 发布:追平 Opus 4.8 的智力,1/40 的价格,跑在国产芯片上
人工智能·aigc·chatglm (智谱)