计算机算法设计与分析 第2章 递归与分治策略 (笔记)

简介: 计算机算法设计与分析 第2章 递归与分治策略 (笔记)

第2章 递归与分治策略

 

2.1 递归的概念

直接或间接调用自身为递归。

采用递归的目的(思路)是将一个较大(或较复杂)的问题分解成较小的相同问题。

使用递归方法时,一定要设置结束递归的边界条件。

递归的实现的关键是建立递归调用工作栈。(但使用时并不需要我们去建立,系统自动进行这个操作。)

递归的优点是形式简单,缺点是运行效率低(多次调用函数耗费大量时间、空间,问题规模较大时无法在规定时间内完成)。

例-阶乘】 阶乘函数 n!

可用递归函数定义:

n! = 1          ,n=0

      n(n-1)!  ,n>0

递归函数必须有非递归定义(直接给定)的初始值

第一式给出初始值,第二式给出用较小自变量表示较大自变量的函数值的式子。

用C++表示:

int factorial(int n) {
  if( n == 0)
    return 1;
  else
    return n*factorial(n-1);
}

例-斐波那契数列

数列1,1,2,3,5,8,13,21,...为斐波那契数列。

F(n) = 1                    , n = 0或1

F(n) = F(n-1)+F(n-2)  n>1

C++表示:

int fibonacci(int n){
  if (n<=1)
    return 1;
  else
    return fibonacci(n-1)+fibonacci(n-2);
}


【例-Hanoi塔问题】

汉诺塔问题是一个经典的可用递归解决的问题。

问题简述:

设有3个塔座,记为a,b,c

开始时a上一共叠有n个圆盘,圆盘从下到上,由大到小地叠在一起。

要求把a上的n个圆盘移到b上,仍按照上小下大的顺序叠放。

规则是每次只能移动一个盘子,且大盘子不能压在小盘子上。

 

使用递归方法分析这个问题:

当n=1时,将这个盘子放在b上即可

n>1时,先把n-1个盘子放在c上,再把最大的那个放在b上,接着把n-1个盘子放在b上。

void hanoi(int n, int a, int b, int c) {  //把a上的n个圆盘移到b上
    if(n>0){               //n>0,(有盘子时执行下面操作,n=0就放完了,结束)
        hanoi(n-1,a,c,b);  //把a上的n-1个圆盘移到c上,b是中转站
        move(a,b);         //移动剩下的那个大圆盘
        hanoi(n-1,c,b,a);  //将c上的n-1个圆盘移到b上,a是中转站
    }
}

2.2 分治法的基本思想

分治法的基本思想是将一个规模为n的问题 分解为 k个规模较小的子问题。子问题相互独立与原问题相同

递归地解这些子问题,然后将各子问题地解合并得到原问题的解。

 【例-二分搜索技术】

给定以排序的n个元素a[0,n-1],要在这n个元素里找一特定元素x。

若使用顺序搜索方法逐个比较x和a[]中的元素,最坏情况下要对比完所有的n个元素,时间复杂度O(n)。


使用二分搜索可在O(logn)时间完成搜索。基本思想如下:

将n个元素分为个数相当的两半,取a[n/2]与x比较,

若x= a[n/2],找到x,算法终止;

若x<a[n/2],则x在a[n/2]左侧,在a[n/2]左侧搜索;

若a>[n/2],x在a[n/2]右侧,在a[n/2[右侧搜索。

 

template<class Type>
int BinarySearch(Type a[],const Type& x,int n){
    int left = 0;
    int right = n-1;
    while(left<=right){
        int middle = (left+right)/2;
        if(x==a[middle])
            return middle;
        if(x>a[middle])
            left = middle+1;
        if(x<a[middle])
            right = middle-1;
    }
    return -1;
}


相关文章
|
24天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
21天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
23天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
1月前
|
算法
优化策略:揭秘钢条切割与饼干分发的算法艺术
本文探讨了钢条切割与饼干分发两个经典算法问题,展示了算法在解决实际问题中的应用。钢条切割问题通过动态规划方法,计算出不同长度钢条的最大盈利切割方式,考虑焊接成本后问题更为复杂。饼干分发问题则采用贪心算法,旨在尽可能多的喂饱孩子,分别讨论了每个孩子一块饼干和最多两块饼干的情况。这些问题不仅体现了数学的精妙,也展示了工程师的智慧与创造力。
37 4
|
1月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
50 2
|
2月前
|
算法 API 计算机视觉
人脸识别笔记(一):通过yuface调包(参数量54K更快更小更准的算法) 来实现人脸识别
本文介绍了YuNet系列人脸检测算法的优化和使用,包括YuNet-s和YuNet-n,以及通过yuface库和onnx在不同场景下实现人脸检测的方法。
78 1
|
2月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
77 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
数据采集 缓存 算法
算法优化的常见策略有哪些
【10月更文挑战第20天】算法优化的常见策略有哪些
|
18天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
24天前
|
机器学习/深度学习 算法 Serverless
基于WOA-SVM的乳腺癌数据分类识别算法matlab仿真,对比BP神经网络和SVM
本项目利用鲸鱼优化算法(WOA)优化支持向量机(SVM)参数,针对乳腺癌早期诊断问题,通过MATLAB 2022a实现。核心代码包括参数初始化、目标函数计算、位置更新等步骤,并附有详细中文注释及操作视频。实验结果显示,WOA-SVM在提高分类精度和泛化能力方面表现出色,为乳腺癌的早期诊断提供了有效的技术支持。