算法笔记2 递归与分治策略

算法实验——递归与分治   一、实验目的: 理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。 掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。 具体要求: 1. 分析并掌握“棋盘覆盖问题”的递归与分治算法示例; 2. 练习使用递归与分治策略求解具体问题; 二、实验环境: Visual C++ 实验环境 三、实验内容: (写出主要的内容) 1. 1) 编写完整的主函数,分别记... 阅读详情
一.递归的概念:直接或间接地调用自身的算法成为递归算法。用函数自身给出定义的函数成为递归函数。
1.1递归解决阶乘函数。定义=(n是非负整数,n的阶乘是n*(n-1)......2*1)
int factorial(int n)
       {
           if(n == 0)return 1;
           return n * factorial(n - 1);
       }
 
1.2递归解决Fibonacci(斐波那契)数列。定义=当n〉时,数列的第n项是他前面两项之和,初始值F(0)和F(1)都==1。
int fibonacci(int n)
       {
           if(n <= 1) return 1;
           return fibonacci(n - 1) + fibonacci(n - 2);
       }
 
1.3递归解决排列问题。R的全排列定义=当n=1时,全排列Perm(R) = (r),其中r是集合R中唯一的元素;    当n>1时,Perm(R)由(r1)Perm(R1),(r2)Perm(R2),...,(rn)Perm(Rn)构成
template<class Type>
 void Perm(Type list[], int k, int m)//k是待排列数组的起始位,m是结束位。
 {//产生List[k, m]的所有排列
  if(k == m)
  {//只剩下一个元素
   for(int i = 0;i <= m; i++) cout << list[i];
   cout << endl;
  }
  else//还有多个元素待排列,递归产生排列
  {
   for(int i = k;i <=m; i++)//递归调用时,对剩下的k->m之间的数,继续排列。
   {
    Swap(list[k], list[i]);
    Perm(list, k + 1, m);
    Swap(list[k], list[i]);
   }
  }
  
 }
 void Swap(Type &a, Type &b)
 {
  Type temp = a;a = b; b = temp;
 }
 
1.4递归解决Hanoi塔问题。定义=有a,b,c三个塔座,a上自下而上,由大到小叠有n个圆盘。要求将塔座a上的所有圆盘移动b上,并仍按同样顺序叠置。移动过程中遵循的规则:1)每次只能移动一个圆盘2)任何时刻都不允许小的圆盘上有大的3)满足1)2)的前提下,可将圆盘移到a,b,c中任一塔座上。
基本解决思路:移动过程中,奇数次移动,将最小的顺时针(a->b->c->a)移到下一塔座;偶数次移动,最小的不动,其他两个塔座间,次小的移到另一个塔座上。
递归解决思路:n=1时,直接移动。n>1时,设法将n-1个较小的移到c上,然后将剩下的最大的从a移到b上;在设法将c上n-1个较小的从c移到b。

 void hanoi(int n, int a,int b,int c)//a,b,c可看做三个塔座a,b,c;n是n个圆盘
 {
  if(n > 0)
  {
   hanoi(n - 1, a, c, b);
   move(a,b);  //模拟移动动作
   hanoi(n - 1, c, b, a);
  }
 }
 
二.分治法的基本思想:将一个规模为n的问题分解为k个规模较小的子问题,这些子问题,互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
一个分治法,将规模为n的问题分成k个规模为n/m的子问题去解。为方便起见,设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。另外,再设将原问题分解为k个子问题及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。如果用T(n)表示该分治法divide-and-conquer(P)解规模为|P|=n的问题所需的计算时间,则有T(n)=O(1) n=1;T(n)=kT(n/m) + f(n).
它的一般的算法设计模式如下:
divide-and-conquer(P)
 {
  if(|P| <= n0) adhoc(P);
  divide P into small subinstances P1,P2,···,Pk;
  for(int i = 1; i <= k; i++)
  {
   yi = divide-and-conquer(Pi);
   return merge(y1,y2,···,yk);
  }
 }
 
2.1分治法解决二分搜索技术。定义=给定已经排好序的n个元素a[a:n-1],现在要在这n个元素中找出一特定元素x。采用分治策略,最坏情况下用O(logn)时间完成搜索任务。
基本思路:将n个元素分成个数大致相同的两半,取a[n/2]与x比较。如果,x=a[n/2],则找到x,算法终止;如果x<a[n/2],则只要在数组a的左半部继续搜索x;如果x>a[n/2],则只要在数组a的右半部继续搜索x。
template<class Type>
 int BinarySearch(Type a[], const Type&, int n)
 {//在a[0]到a[n-1]中搜索x
  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;
      else right = middle - 1;
  }
  return -1;//没找到x
 }
 
2.2分治法解决大整数的乘法。定义=需要处理的数无法在计算机硬件对整数的表示范围内直接处理,就必须用软件的方法来实现大整数的算术运算,如果将每两个一位数的乘法或加法看做一步运算,这种方法要进行O(n~2)步才能求出乘积XY。用分治法来设计将更有效地解决这个问题。X=A2~(n/2) + B,Y=C2~(n/2) +D.按此式相乘几乎没有改进算法。写成另外一种形式:XY=AC2~n + ((A-B)(D-C) +AC + BD)2~(n/2) +BD,此式看似复杂,但对于计算机运算来说,效率有了很大改进,T(n)由O(n~2)变为O(n~1.59).
 
2.3分治法解决Strassen矩阵乘法。定义=对于A和B的乘积矩阵C,每计算一个元素c(ij),需要做n次乘法和n-1次加法。因此,求出矩阵C的n~2个元素所需的计算时间是O(n~3)。
分治法解决思路:假设n是2的幂,将矩阵A,B,C中每一矩阵都分块成4个大小相等的子矩阵,每个子矩阵都是n/2 * n/2的方阵,对这个小方阵,改进一下,则2阶方阵用少于原来8次的乘法运算7次,但增加了加、减法的运算次数。用此法改进了算法,T(n)=O(n~2.81).
 
2.4分治法解决合并排序。定义=合并排序算法是用分治策略实现对n个元素进行排序的算法
  基本思想:将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合。
  合并排序算法可递归地描述如下:
  template<class Type>
void MergerSort(Type a[], int left, int right)
{
if(left < right)//至少有2个元素
{
int middle = (left + right)/2;//取中点
MergeSort(a, left, middle);
MergerSort(a, middle + 1, right);
Merge(a, b, left, middle, right);//合并到数组b
Copy(a, b, left, right);//赋值回数组a
}
}
template<class Type>
void Merge(Type c[], Type d[], int n, int m, int r)
{//合并c[n:m]和c[m+1:r]到d[n:r]
int i = n, j = m + 1, k = n;
while((i <= m) && (j <= r))
{
if(c[i] <= c[j]) d[k++] = d[i++];
else d[k++] = c[j++];
}
if(i > m)
for(; j <= r; j++) d[k++] = c[j];
else for(; i <= m; i++) d[k++] = c[i];
}
  
消去递归后的合并排序算法可描述如下:
此处略去。
2.5分治法解决快速排序。定义=快速排序算法是基于分治策略的另一个排序算法那。
  基本思想:对于输入的子数组a[p:r],按以下三个步骤进行排序。
  1)分解:以a[p]为基准,分数组为两部分,左边的均小于a[p],右边的均大于a[p]。
  2)递归求解:通过递归调用快速排序法分别对a[p:q-1]和a[q+1:r]进行排序。
  3)合并:对两部分排好序后,不需要任何计算,a[p:r]就已经排好序了。
  template<class Type>
void QuickSort(Type a[], int p, int r)
{
if(p < r)
{
int q = Partition(a,p,r);
QuickSort(a, p, q - 1);//对左半段排序
QuickSort(a, q + 1, r);//对右半段排序
}
}
tempplate<class Type>
int Partition(Type a[], int p, int r)
{
int i = p,j = r + 1;
Type x = a[p];
//将小于x的元素交换到左边区域
//将大于x的元素交换到右边区域
while(true)
{
while(a[++i] < x && i < r);
while(a[--j] >);
if(i >= j) break;
Swap(a[i], a[j]);
a[j] = x;
return j;
}
}




分治与递归 分治与递归 递归是一种方法; 分治是一种思想; 分治可以用递归来实现,也可以不用递归 普通分治:分治的各个层次的各解决方案不同 递归分治:分治的各个层次的解决方案相同 分治 分治的基本思想 分治算法是将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 如果原问题可分割成k个子问题,1<k≤n,且这些子问题都可解并可利用这些子问题的解求出原问题的解,那么这种分治法就是可行的。 由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。 在这种情况下, 阅读详情

相关推荐

算法- 递归算法 分治算法

递归算法 (1)递归需要满足的三个条件 一个问题的解可以分解为几个子问题的解 何为子问题?子问题就是数据规模更小的问题。 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样 存在递归终止条件 把问题分解为子问题,把子问题再分解为子子问题,一层一层分解下去,不能存在无限循环,这就需要有终止条件。 (2)如何编写递归代码? 写递归代码的关键就是找到如何将大问题分解为小问题的...

林夏天的博客 2760

【递归】高效率求2的n次幂

思路:使用翻一番的技巧。 比如,2的9次 则 1 * 2 = 2;2 * 2 = 4;4 * 4 =16;16 * 16=。。。; 指数:1-----------2-----------4------------8--------------- 对应代码: 能翻倍的情况下 //能翻 while((ex<<1)<n) { //翻 res = res * res; ...

alovelypeach的博客 2465

算法 —— 第二章 递归与分治策略

第二章 递归与分治策略 判断题 1-1算法分析的两个主要方面是时间复杂度和空间复杂度的分析。 T 1-2在具有NNN个结点的单链表中,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。 F 1-3仅基于比较的算法能得到的最好的“最坏时间复杂度”是O(NlogN)。 T 1-4对NNN个记录进行快速排序,在最坏的情况下,其时间复杂度是O(NlogN)。 F 1-5(neuDS)直接插入排序算法在最好情况下的时间复杂度为O(n)。 T 单选题 2-1用二分查找从100个有序整数中查找某数,最

Dilraba__的博客 2902

算法笔记3——递归与分治

一、递归算法定义 程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。 一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 二、例题分析 例1(集合全排列): 代码如下: #include<ios...

weixin_45212219的博客 326

递归与分治策略

对于计算机科学来说,算法的概念至关重要。例如,在一个大型软件系统的开发中,设计出有效的算法将起决定性的作用。通俗地讲,算法是指解决问题的一种方法或一个过程。

静Yu的博客 862

MIMO-OFDM 通信-感知一体化(ISAC)中的联合优化与性能权衡

本文深入探讨了MIMO-OFDM技术在通信-感知一体化(ISAC)系统中的核心作用与挑战。文章分析了如何通过联合优化资源分配、波束成形与波形设计,在有限的频谱与硬件资源下,实现通信速率与感知精度之间的最佳平衡,并指出了工程实践中面临的同步、干扰等关键难题。

dapp9builder的博客 215

经典算法之分治法 递归与分治 学习笔记

经典算法之分治法 递归与分治 学习笔记 分治法思想 当要求解的问题规模较大时,将一个难以解决的大问题分割成一些规模较小的相同类子问题,以便各个击破,分而治之。 四大特征 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 应用条件 1.大问题可以分割成k个子问题(1<k<=n ); 子问题规模仍不够小,则

weixin_45614903的博客 364

算法面经手撕系列(2)--手撕BatchNormlization

手动实现/手撕BatchNormlization

罟霖同学的站点 865

算法笔记(一):递归与分治法

一、基本思想 (一)分治法的基本思想是:将规模较大的、不容易解决的大问题,分割为性质相同但规模较小的子问题,若子问题易于求解,则分别求解子问题,然后由子问题的解构造出原问题的解。适合用分治法求解的问题一般都具有以下基本特征: (1)该问题可以分解为若干个规模较小的子问题; (2)该问题的规模缩小到一定的程度后容易求解; (3)各个子问题相互独立; (4)子问题的解可以合并为原问题的解。 分治法求解问题的步骤主要包括三步: (1)分解(Divide)。当问题的规模超过某一阈值时,将问题分解为规模较小但性质与原

Hoshizola的博客 1312

Bulk / Smart-seq2数据分析一般流程

Bulk RNA-seq(RNA-Seq of bulk samples)是一种RNA-Seq技术应用,它是通过将整个组织或细胞群体的RNA提取并混合,进行高通量测序来分析基因表达的技术。转录本定量结果可以用于后续的差异表达分析和聚类分析。功能注释和富集分析:对差异表达基因进行功能注释和富集分析,以帮助理解差异表达基因的功能和调控网络,从而获得对研究样品的更深入的理解。数据可视化:最后,将聚类分析的结果进行可视化,可以使用常见的数据可视化工具,如ggplot2、Plotly等,来帮助用户更好地理解数据。

weixin_54519672的博客 5348

国内网络环境下Calico v3.26.4安装避坑指南(附华为云镜像加速脚本)

本文为国内开发者提供Calico v3.26.4的高效部署指南,重点介绍如何通过华为云镜像加速服务解决Kubernetes集群网络插件镜像拉取问题。文章包含详细的镜像加速脚本、部署清单修改方法及深度排错技巧,帮助开发者快速完成Calico网络插件的安装与配置。

brown的博客 288

算法设计: 二、递归与分治策略 (2. 快速排序、快速排序随机基准算法)—— java实现 - 算法分析

分治法基本思想 将一个规模为 n 的问题分解为 k 个规模较小的问题,这些子问题相互独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 1、快速排序算法(运用了二分搜索技术) 2、Hanoi 塔问题 ...

demo_yo的博客 630

如何快速获取SAMM、SMIC等主流微表情数据集?完整申请指南(附避坑技巧)

本文提供了获取SAMM、SMIC等主流微表情数据集的完整申请指南,包括申请前的准备工作、分步申请流程、协议谈判技巧以及数据使用与维护策略。特别针对高分辨率动态捕捉和多模态同步数据等热词,帮助研究者高效获取高质量数据集,避免常见陷阱。

weixin_29057163的博客 420

【算法分析与设计】递归与分治策略

计算机算法分析与设计中有关递归与分治策略的讲解,主要包括学习要点、算法总体思想、递归的概念、分治法

東方緋想天 1536

【100%通过率】华为od机试C卷【出差 / 员工派遣】Java&Go 实现

某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则:

MISAYAONE的博客 2638

10、利用智能合约实现公平的私有集合交集

本文探讨了利用智能合约实现公平的私有集合交集(PSI)的多种协议,重点分析了协议 Π 和 Π∗ 的气体成本与性能特点。同时对比了包括 Justitia 和 Anesidora 在内的现有方案,突出了仅使用智能合约实现硬币补偿公平性的优势。文中还介绍了相关密码学基础、安全模型及隐私保障机制,为在不同应用场景下选择高效、安全的 PSI 协议提供了理论支持和实践指导。

linux的博客 95

算法设计与分析——递归与分治策略

文章目录1. 递归算法1.1 特点1.2 优缺点2. 分治策略2.1 基本思想2.2 适用的条件2.3 求解过程(步骤)3. 典型算法案例3.1 二分搜索3.1.1 非递归实现3.1.1 递归实现3.2 棋盘覆盖问题 1. 递归算法 1.1 特点 1.2 优缺点 优点:结构清晰、可读性强 缺点:运行时效率较低,耗费较多的时间、空间资源 2. 分治策略 2.1 基本思想 分治策略的基本思想是将一个规模为n的问题分解为k个较小的子问题,这些子问题互相独立,并且和原问题相同,递归

krain的博客 3566

华为OD机试真题 新系统 9月20号 【字符串分组求和】

华为OD新系统机试真题【字符串分组求和】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【字符串分组求和】解析。

qq_45776114的博客 610

【基础算法实战2.0】递归与分治算法

在算法设计的过程中,递归与分治算法常常被作为解决复杂问题的重要工具。它们能够通过巧妙的思维,将问题拆解成较小的子问题逐步求解。本文将结合个人的一些理解,详细探讨递归与分治算法的原理、应用场景,以及如何在实际问题中使用这些算法。

2301_79633602的博客 2353

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【算法】递归与分治策略

递归算法与分治算法的概述和部分案例

weixin_44131922的博客 1213

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

算法分析与设计:递归与分治策略

三、算法设计与分析 1、递归 定义:递归算法是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。 递归算法可以将一个大型的复杂问题转化为一个与原问题相似的规模较小的问题求解,其优势在于用有限的语句定义无限的集合,可以有效减少代码量,使程序简洁易懂;其缺点在于运行效率低,空间消耗大,容易造成堆栈溢出。 递归需要有边界条件,递归前进段和递归返回段。当不满足边界条件时,递归前进;当满足边界条...

AlexTu的博客 3310

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

递归与分治策略算法之循环赛日程表

递归与分治策略算法之循环赛日程表 1、先简单的来介绍一下分治策略的思想 分治策略的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,分解出来的子问题与原问题相同,并且相互独立。通过递归去解决子问题,然后将子问题的解合并得到原问题的解。 2、循环赛日程表问题的介绍 ...

wrlovesmile的博客 3753

【算法设计与分析】递归与分治策略

本文介绍了递归与分治策略的基本概念和应用。主要内容包括:递归的三要素(基准情况、递归情况、收敛性)及执行过程,比较了递归与迭代的优缺点;分治法的三个步骤(分解、解决、合并)及适用条件,并通过递归树和主定理分析算法复杂度;详细讲解了二分搜索技术,包括迭代和递归两种实现方式。此外还列举了合并排序、快速排序等经典分治算法,为学习更复杂的算法问题奠定基础。

m0_72516377的博客 869
上一篇: 《活出全新的自己》新版上市
下一篇: 致李彦宏的公开信
雪地车
博客等级 码龄15年 3粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值