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

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

知乎: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
相关推荐
风哥2号1 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
豪气的程序猿1 小时前
电商图片工作流怎么选?Lingko AI 对比折叠键盘主图与详情页
人工智能
YangYang9YangYan2 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
小刘快学习2 小时前
把 AI 账单拆到部门:企业 AI 网关的精准分账思路
人工智能
米小虾2 小时前
你让监控模型读的思维链,可能是攻击者写好的剧本
人工智能
deepseek232 小时前
Iris 开源搜索智能体拆解:35B 与 397B 中文仅差 0.3 分,上下文管理胜过堆参数
人工智能·ai agent·开源模型
ai小陈2 小时前
CUDA Stream实战:让数据传输与GPU计算真正重叠
人工智能·深度学习·ai·pdf·云计算·gpu算力
v_34836087622 小时前
Android native端 堆栈打印
android·算法
residual_fan2 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
东风破_2 小时前
从 RAG 到 Agentic RAG:第二步,把复杂问题拆开再检索
人工智能