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

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

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

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

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

参考文章:各方资料

文章目录

  • [[算法设计与分析-从入门到入土] 递归](#[算法设计与分析-从入门到入土] 递归)
  • 递归recursion
  • 1.归纳法Induction
        • [以选择排序求解数组 `A[1...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 小时前
图结构完全解析:从基础概念到遍历实现
javascript·后端·算法
m0_736919102 小时前
C++代码风格检查工具
开发语言·c++·算法
yugi9878382 小时前
基于MATLAB强化学习的单智能体与多智能体路径规划算法
算法·matlab
Coder_Boy_2 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
啊森要自信3 小时前
CANN ops-cv:面向计算机视觉的 AI 硬件端高效算子库核心架构与开发逻辑
人工智能·计算机视觉·架构·cann
helloworldandy3 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
2401_836235863 小时前
中安未来SDK15:以AI之眼,解锁企业档案的数字化基因
人工智能·科技·深度学习·ocr·生活
DuHz3 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
njsgcs3 小时前
llm使用 AgentScope-Tuner 通过 RL 训练 FrozenLake 智能体
人工智能·深度学习