iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >递归与分治算法练习
  • 645
分享到

递归与分治算法练习

2023-06-02 00:06:40 645人浏览 安东尼
摘要

  最近刚学习算法设计与分析的课程,所用教材是清华大学出版社王晓东编著的《算法设计与分析》。一道关于递归与分治算法的练习题如下:  刚拿到题目觉得这题目似乎和递归分治没有什么关系,但是O(1)的空间复杂度,以及O(n)的时间复杂度度就限制了

  最近刚学习算法设计与分析的课程,所用教材是清华大学出版社王晓东编著的《算法设计与分析》。一道关于递归与分治算法的练习题如下:

  刚拿到题目觉得这题目似乎和递归分治没有什么关系,但是O(1)的空间复杂度,以及O(n)的时间复杂度度就限制了解决方法,也就是分治和递归。(使用python语言只需几行,用切片即可完成,这里附上极其弱智的代码)

  def exchange(a,k):

  a=a[k:]+a[0:k]#列表切片

  return a

  ls=[1,2,3,4,5,6,7]

  print(exchange(ls,4))

  现在我们来思考这个递归分治算法。

  开始前先说明一下变量含义:

  start:左边子数组开始位置下标

  sep:分割位置下标(左边子数组结束位置下标)

  end:右边子数组结束位置下标

  首先,是最简单的情况,相信大家一定能想到,如果两个子数组长度相等,直接遍历子数组的长度,写上三行交换代码就可以解决了。(在这就不给出图例了,简单脑补一下即可)

  接下来,就是剩余两种情况:分别是左边子数组长度>右边子数组长度以及左边子数组长度<右边子数组长度。我的基本想法就是长度小的一边可以直接交换到位,长度长的一边分成两部分,一部分就是长度短的子数组长度,另一部分就是剩余部分长度。即:

  

递归与分治算法练习

  长数组用和短数组相同长度的元素和短数组元素一一交换,长数组剩余元素不动。第一次交换完成后短数组已经直接到位,接下来处理剩余元素长度即可,从而问题规模缩小,使用分治递归可以解决。

  下面图例都是以这个数组为例{1,2,3,4,5,6,7}(红色字体表示已经到位的元素)

  图一(start=0,sep=4,end=6):

  判断是左边大于右边;长度为2的两对交换。1,2和6,7互换位置;6,7到位。start前进2位(start=2),sep不变,end也不变。

  判断是左边大于右边;1,2和6,7互换位置;6,7,1,2到位。start再前进2位(start=4),sep不变,end也不变。

  判断是左边小于右边;5和3互换位置;6,7,1,2,3到位。start前进1位(start=5),sep增1(sep=5),end不变。

  判断是左边等于右边;5和4直接交换位置,所有元素全部到位。

  图二(start=0,sep=1,end=6):

  判断是左边小于右边;长度为2的两对交换。1,2和3,4互换位置;3,4到位。start前进2位(start=2),sep前进1位(sep=3),end也不变。

  判断是左边小于右边;1,2和5,6互换位置;3,4,5,6到位。start再前进2位(start=4),sep前进2位(sep=5),end也不变。

  判断是左边大于右边;5和3互换位置;6,7,1,2,3到位。start前进1位(start=5),sep增1(sep=5),end不变。

  判断是左边等于右边;2和1直接交换位置,所有元素全部到位。

  接下来是代码呈现:

  public static void exchange(int a[],int start,int sep,int end)

  {郑州妇科医院 Http://www.zyfuke.com/

  int t;

  // 左边子数组长度 = 右边子数组长度

  if(end-sep==sep-start+1)

  {

  for (int i = start; i <=sep; i++)

  {

  t=a[i];

  a[i]=a[i+sep-start+1];

  a[i+sep-start+1]=t;

  }

  }

  // 左边子数组长度 > 右边子数组长度

  if(end-sep

  {

  for(int i=end;i>=sep+1;i--)

  {

  t=a[i];

  a[i]=a[i-(sep-start+1)];

  a[i-(sep-start+1)]=t;

  }

  // start=start+end-sep;

  exchange(a, start+end-sep, sep, end);

  //递归调用exchange方法

  // exchange(a, start, sep, end);

  }

  // 左边子数组长度 < 右边子数组长度

  if(end-sep>sep-start+1)

  {

  for(int i=start;i<=sep;i++)

  {

  t=a[i];

  a[i]=a[i+sep-start+1];

  a[i+sep-start+1]=t;

  }

  // start=sep+1;

  // sep=sep+sep-start+1;

  exchange(a, sep+1, sep+sep-start+1, end);

  //递归调用exchange方法

  exchange(a, start, sep, end);

  }

  }

  左边子数组长度 >右边子数组长度:

  左右两边交换,中间不动,交换后左边部分完成,右边递归,*start前进短的子数组的长度个单位,*短的子数组长度=end-sep,所以有start=start+end-sep;sep不变,end也不变。

  左边子数组长度 <右边子数组长度:

  左边中间交换,右边不动,交换后左边部分完成,右边递归,start前进短的子数组的长度个单位,短的子数组长度=sep-start+1,所以有start=start+sep-start+1=sep+1。sep也前进短子数组长度个单位,sep=sep+sep-start+1;end不变。

  测试

  int a[]= {10,2,8,3,5,4,7,1};

  ...

  exchange(a, 0,4,a.length-1);

--结束END--

本文标题: 递归与分治算法练习

本文链接: https://www.lsjlt.com/news/228183.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 递归与分治算法练习
      最近刚学习算法设计与分析的课程,所用教材是清华大学出版社王晓东编著的《算法设计与分析》。一道关于递归与分治算法的练习题如下:  刚拿到题目觉得这题目似乎和递归分治没有什么关系,但是O(1)的空间复杂度,以及O(n)的时间复杂度度就限制了...
    99+
    2023-06-02
  • C++递归与分治算法原理示例详解
    目录1. 汉诺塔问题2. 全排列问题3. 利用递归与分治策略寻找最大值4. 归并排序5. 快速排序6. 棋盘覆盖问题1. 汉诺塔问题   递归算法,分为 3 步:...
    99+
    2024-04-02
  • C++ 递归函数在分治算法中的应用?
    分治算法将大问题分解成较小子问题,c++++递归函数可实现分治算法:选择基准元素;分割数组为基准元素两侧;递归排序两部分;合并已排序部分。 C++ 递归函数在分治算法中的应用 分治算法...
    99+
    2024-04-19
    c++ 递归函数 分治算法
  • Java 递归重难点分析详解与练习
    目录递归是什么分析递归的过程递归练习按顺序打印一个数的每一位递归是什么 就是一个方法在执行的时候,自己调用自己。 递归的要求: 1 有一个趋近于终止的条件 2 实现递归要去推导出一个...
    99+
    2024-04-02
  • C++ 函数递归详解:分治法中的递归应用
    递归是一种函数自我调用的技术,适用于可分解成较小规模子问题的问题。分治法采用递归将问题分解成独立子问题,逐步解决。如 findmaximum() 函数递归查找数组中最大值,通过检查基本情...
    99+
    2024-05-03
    c++ 递归
  • 基本算法思想:递归+分治+动态规划+贪
    作者:心叶时间:2018-05-01 19:28 本文对应github地址:https://github.com/yelloxing/... 以上实现了常见算法的java、c语言、javascrpt(或node.js)、python3和g...
    99+
    2023-01-31
    递归 算法 思想
  • C++ 函数的递归实现:递归与非递归算法的比较分析?
    递归算法通过函数自调用解决结构化的问题,优点是简洁易懂,缺点是效率较低且可能发生堆栈溢出;非递归算法通过显式管理堆栈数据结构避免递归,优点是效率更高且避免堆栈溢出,缺点是代码可能更复杂。...
    99+
    2024-04-22
    c++ 递归 堆栈溢出
  • 递归与二分法
    递归 自己调用自己 递归的入口(参数)和出口(return) 树状结构的遍历 import os def func(lujing, n): # "d:/a/" lst = os.listdir(lujing) # 打开文件夹. ...
    99+
    2023-01-30
    递归
  • 例题详解Java dfs与记忆化搜索和分治递归算法的使用
    目录一、dfs(深度优先搜索)1.图的dfs2.树的dfs二、记忆化搜索1.普通递归:O(2^n)2.记忆化搜索: O(n)三、分治四、算法题1.dia和威严 示例2.小红...
    99+
    2024-04-02
  • Java算法设计与分析分治算法
    目录一、前言二、分治算法介绍三、分治算法经典问题3.1、二分搜索3.2、快速排序3.3、归并排序(逆序数)3.4、最大子序列和3.5、最近点对四、结语一、前言 在学习分治算法之前,问...
    99+
    2024-04-02
  • java常见递归练习题有哪些
    小编给大家分享一下java常见递归练习题有哪些,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Java是面...
    99+
    2023-06-14
  • python之递归与二分法
    1. 递归 自己调用自己 递归的入口(参数) 和 出口(return) 树形结构的遍历  import os def func(lujing, n): lst = os.li...
    99+
    2023-01-30
    递归 python
  • Java方法递归的形式和常见递归算法代码分析
    本篇内容介绍了“Java方法递归的形式和常见递归算法代码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!方法递归方法递归的形式什么是方法递...
    99+
    2023-07-05
  • Java分治法与二分搜索算法实例分析
    本文实例讲述了Java分治法与二分搜索算法。分享给大家供大家参考,具体如下:1、分治法分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。递归的解这些子问题,然后将各子问题的解合并得到原问题的...
    99+
    2023-05-30
    java 分治法 二分搜索
  • 什么是递归算法
    这篇文章主要介绍“什么是递归算法”,在日常操作中,相信很多人在什么是递归算法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是递归算法”的疑惑有所帮助!接下来,请跟着小编一...
    99+
    2024-04-02
  • Java递归算法详解
    递归算法是一种通过调用自身来解决问题的方法。在Java中,递归算法通常有以下几个要素:1. 基本情况:递归方法必须有一个基本情况,即...
    99+
    2023-09-14
    Java
  • C# 递归算法详解
    目录1)1、1、2、3、5、8.......用递归算法求第30位数的值?2)编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)斐波那契数列为:0、1、1、2、3、……...
    99+
    2024-04-02
  • C#递归算法和排列算法
    一、递归算法 递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开它。若干次之后,你打开面前的门后,发现只有一...
    99+
    2024-04-02
  • 如何实现大整数乘法运算与分治算法
    本篇内容主要讲解“如何实现大整数乘法运算与分治算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何实现大整数乘法运算与分治算法”吧!普通乘数运算对于乘数运算有...
    99+
    2024-04-02
  • C++ 函数的递归实现:递归与动态规划算法的异同?
    递归是一种函数自行调用的技术,c++++ 中使用 recursion 关键字定义递归函数。递归函数的语法为:returntype functionname(parameters) { i...
    99+
    2024-04-22
    递归 动态规划 c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作