计算机算法设计与分析 第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;
}


相关文章
|
7月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
181 15
|
8月前
|
算法 搜索推荐 Java
算法系列之分治算法
分治算法(Divide and Conquer)是一种解决复杂问题的非常实用的策略,广泛应用于计算机科学中的各个领域。它的核心思想是将一个复杂的问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后将子问题的解合并,最终得到原问题的解。分治算法的典型应用包括归并排序、快速排序、二分查找等。
234 72
 算法系列之分治算法
|
8月前
|
存储 算法 Java
算法系列之递归反转单链表
递归反转链表的基本思路是将当前节点的next指针指向前一个节点,然后递归地对下一个节点进行同样的操作。递归的核心思想是将问题分解为更小的子问题,直到达到基本情况(通常是链表末尾)。
194 5
算法系列之递归反转单链表
|
8月前
|
监控 网络协议 算法
基于问题“如何监控局域网内的电脑”——Node.js 的 ARP 扫描算法实现局域网内计算机监控的技术探究
在网络管理与安全领域,监控局域网内计算机至关重要。本文探讨基于Node.js的ARP扫描算法,通过获取IP和MAC地址实现有效监控。使用`arp`库安装(`npm install arp`)并编写代码,可定期扫描并对比设备列表,判断设备上线和下线状态。此技术适用于企业网络管理和家庭网络安全防护,未来有望进一步提升效率与准确性。
244 8
|
10月前
|
供应链 算法
【算法】——快排,分治算法合集
本文主要介绍排序中的快排思想的应用,做到一法通万法的效果
|
10月前
|
监控 算法 安全
解锁企业计算机监控的关键:基于 Go 语言的精准洞察算法
企业计算机监控在数字化浪潮下至关重要,旨在保障信息资产安全与高效运营。利用Go语言的并发编程和系统交互能力,通过进程监控、网络行为分析及应用程序使用记录等手段,实时掌握计算机运行状态。具体实现包括获取进程信息、解析网络数据包、记录应用使用时长等,确保企业信息安全合规,提升工作效率。本文转载自:[VIPShare](https://www.vipshare.com)。
99 1
|
11月前
|
人工智能 并行计算 算法
量子计算算法:超越经典计算机的边界
量子计算基于量子力学原理,利用量子位、量子叠加和量子纠缠等特性,实现并行计算和高效处理复杂问题。核心算法如Shor算法和Grover算法展示了量子计算在大数分解和搜索问题上的优势。尽管面临量子位稳定性和规模化等挑战,量子计算在化学模拟、优化问题和人工智能等领域展现出巨大潜力,预示着未来的广泛应用前景。
|
11月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
204 2
|
12月前
|
机器学习/深度学习 人工智能 算法
量子计算算法:超越经典计算机的边界
【10月更文挑战第30天】量子计算基于量子力学原理,通过量子比特和量子门实现超越经典计算机的计算能力。本文探讨量子计算的基本原理、核心算法及其在密码学、化学、优化问题和机器学习等领域的应用前景,并讨论当前面临的挑战与未来发展方向。
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
177 3

热门文章

最新文章