`

【算法复习二】传统基本算法(迭代、递归、分治)

 
阅读更多

一,迭代与递推

1)迭代法也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。迭代算法一般用于数值计算。迭代法应该是我们早已熟悉的算法策略,程序设计语言课程中所学的累加、累乘都是迭代算法策略的基础应用。例如:斐波那契数列

例子:兔子繁殖问题

一对兔子从出生后第三个月开始,每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死,一月份抱来一对刚出生的小兔子,问一年中每个月各有多少只兔子。

•问题分析

因为一对兔子从出生后第三个月开始每月生产一对小兔子,则每月新下生的小兔子的对儿数显然由前两个月的小兔子的对儿数决定。则繁殖过程如下:

一月 二月 三月四月 五月 六月……

1 11+1=2 2+1=3 3+2=5 5+3=8 ……

•数学建模(斐波那契数列)

y1=y2=1,yn=yn-1+yn-2,n=3,4,5,……

2)倒推法的概念

•倒推法:是对某些特殊问题所采用的违反通常习惯的,从后向前推解问题的方法。例如,在不知前提条件的情况下,由结果倒过来推解它的前提条件,从而求解问题。又如,由于存储的要求,而必须从后向前进行推算。另外,在对一些问题进行分析或建立数学模型时,从前向后分析问题感到比较棘手,而采用倒推法,则问题容易理解和解决。

例子:穿越沙漠问题

用一辆吉普车穿越1000公里的沙漠。吉普车的总装油量为500加仑,耗油率为1加仑/公里。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库。该吉普车以最少的耗油量穿越沙漠,应在什么地方建油库,以及各处的贮油量。

问题分析

贮油点问题要求要以最少的耗油量穿越沙漠,即到达终点时,沙漠中的各临时油库和车的装油量均为0。这样只能从终点开始向前倒着推解贮油点和贮油量。

数学模型

根据耗油量最少目标的分析,下面从后向前分段讨论。

第一段长度为500公里且第一个加油点贮油为500加仑。

第二段中为了贮备油,吉普车在这段的行程必须有往返。

下面讨论怎样走效率高:

1)首先不计方向这段应走奇数次(保证最后向前走)。

2每次向前行进时吉普车是满载

3)要能贮存够下一加油点的贮油量,路上耗油又最少。

综上分析

从终点开始分别间隔 500500/3500/5500/7……(公里)设立贮油点,直到总距离超过1000公里。每个贮油点的油量为50010001500……


•终极解释:

1)从终点推,到终点必须正好没油,且中途加油站也耗光。所以距离终点500公里有一个500加仑储油点

2)第二个,要想把第一个储油点,储500加仑,最少需要三次,且汽车需要满载油,则距离为500*2 - 3X=500 得距离X=500/3 储油量:500*2=1000

3)第三个,距离计算公式:500*3 -5x =1000 -->x=500/7 储油量:3*500=1500

二,分治与递归

1)治法在每一层递归上都有三个步骤:

1划分:把输入的问题实例划分为若干子问题,尽量使子问题的规模大致相同。

2求解:若子问题规模较小而容易被解决则直接解,否则,当问题的规模大于某个预定义的阀值时,求解步骤由个递归调用组成。

3合并:将各个子问题的解合并为原问题的解。

分治和递归的关系

治与递归像一对孪生兄弟,经常同时应用在算法设计之中。因为从分治法的算法框架中可以看出,分治法设计出的算法一般是一个递归过程。

2)二分治的基本思想

在算法设计中每次一个问题分解成的子问题个数一般是固定的,每个子问题的规模也是平均分配的。当每次都将问题分解为原问题规模的一半时,称为二分治法。二分法是分治法较常用的分解策略,数据结构课程中的折半查找、归并排序等算法都是采用此策略实现的。

例题:二分治法求最大、最小值

例题:线性时间求数组,第k小元素

问题分析

这个问题可以通过排序来解决,最好的排序算法的复杂性是On*log(n)),下面我们要利用分治法,找到复杂性为On)的算法。但这个问题不能用简单的二分法分解成完全独立、相似的两个子问题。因为在选出分解后第一组的第k小的数据和第二组的第k小的数据,不能保证在这两个数据之一是原问题的解。

例如:

求一组数据中的第2小数据:(-2,11,-4,13,-5,-3)

若用二分法将实例中的数据分解为两组(-2,11,-4),13,-5,-3),第一个子问题的解是-2,第二个子问题的解是-3,两个子问题的解不能简单地得到原问题的解。原问题的解是-4

解决方法

方案一,新建一个k数组,对k数组排序,然后每次将最大数跟余下数组中每一个数比较,“余下数”小则删除k数组中最大,然后将“余下数”插入k数组,遍历到最后,k数组中最大数为所求。

方案二,分治算法求解(******)


分享到:
评论

相关推荐

    递归与分治算法

    3. **递归分治**:根据二分查找的结果,缩小搜索范围,重复上述过程,直到找到最终的解。 4. **时间复杂度**:整个算法的时间复杂度为\( O(n \log Sum) \),其中\( n \)是序列的长度,\( Sum \)是序列所有元素的...

    牛顿迭代算法与递归算法的概念和区别

    在算法的世界里,牛顿迭代算法和递归算法各有千秋,它们是解决问题的两种重要思路。理解它们的概念和区别对于选择正确的工具来解决特定问题至关重要。 牛顿迭代算法,也称为牛顿-拉弗森方法,是一种迭代逼近技术,...

    迭代与递归算法

    例如,"递归和迭代的区别.doc"可能阐述了递归如何通过递归公式解决斐波那契序列或其他分治策略问题,如分治法的基本思想文档所讨论的那样。递归在解决某些问题时有其独特的优势,因为它能够简化代码结构,但需要注意...

    递归与分治算法的设计

    递归与分治算法是计算机科学中非常重要的概念,它们在解决复杂问题时起到了关键作用。递归是一种自相似的解决问题的方法,它通过调用自身来处理问题的子集,直至达到基本情况,然后逐步合并结果以得出最终答案。分治...

    递归与迭代算法及其在JAVA语言中的应用.pdf

    例如,在数据挖掘中,递归分治算法可用于决策树的构建;在神经网络的反向传播算法中,迭代思想则是求解权重调整的关键所在。Java作为一种支持多种技术应用的语言,结合递归和迭代算法,能帮助开发者在这些领域中构建...

    老师多年积累,很详细全面的算法讲解——递归,分治

    在计算机科学中,递归与分治是两种重要的算法设计策略。它们在解决复杂问题时,能够将大问题分解为小问题,通过解决小问题来推导出大问题的解。接下来,我们将深入探讨这两种方法。 首先,递归是一种函数或程序调用...

    acm递归算法总结竞赛

    8. **递归与分治策略**:递归往往是分治算法的实现方式,如快速排序、归并排序等,通过将问题分解为独立的子问题来解决。 9. **递归的应用**:在ACM竞赛中,递归算法广泛应用于图论(如深度优先搜索)、树结构处理...

    .net 递归算法 .net 递归算法.net 递归算法

    - **分治算法**:快速排序、归并排序等排序算法利用了递归。快速排序通过选取一个基准值,将数组分为小于和大于基准值的两部分,然后分别对这两部分进行递归排序。 - **动态规划**:一些优化问题,如斐波那契数列、...

    digui.rar_分治法_经典算法_递归 算法

    在计算机科学领域,分治法和递归是两种非常重要的算法设计策略,它们在解决复杂问题时发挥着关键作用。本文将深入探讨这两种方法,并结合经典的算法实例进行讲解。 首先,我们来理解“分治法”(Divide and Conquer...

    合并排序递归和非递归算法

    合并排序是一种基于分治策略的高效排序算法,它将大问题分解为小问题来解决,然后将小问题的结果合并以得到最终的解决方案。这个过程既可以用递归方式实现,也可以用非递归方式实现。 首先,让我们来看看递归版本的...

    算法复习要点整理

    分治法的效率分析涉及递归算法的时间复杂度计算,通常通过建立递推式来求解。通用的分治递推式反映了问题分解的比例和子问题求解的次数,通过求解这些递推式,我们可以得到算法的时间复杂度。分治法在许多重要算法中...

    算法设计—递归实验报告

    本实验报告旨在通过一系列详细的实验过程,深入探讨递归算法在二分检索问题中的应用,以及如何通过递归程序设计掌握分治法的解决策略。 在实验开始之前,首先需要对二分检索问题有一个清晰的理解。二分检索是在有序...

    数据结构与算法(JAVA篇)之递归算法(二)

    递归的二分查找是分治算法的一个实例。分治算法的核心思想是将一个问题分解成若干个规模较小的相同问题,然后再逐个解决这些子问题。分治法的基本步骤包括: 1. **分解**:将原问题分解成若干个规模较小的子问题。 ...

    第12讲 递归和迭代.pptx

    枚举算法,递归与分治策略,递归与迭代的思想、求最大值最小值、线性查找、二分查找与冒泡排序以及选择与交换排序、插入和希尔排序。本课程除了强调经典的算法理论和模型,亦兼顾编程实践能力。力图使得学员面对复杂...

    内部资料——算法复习整理.doc

    【算法基础概述】 算法是计算机科学中的核心概念,它...总结来说,算法分析与设计涵盖递归、分治、动态规划和贪心策略,这些都是理解和设计高效算法的基础。理解这些概念和方法对于解决实际的计算机科学问题至关重要。

    ACM算法设计之递归与分治

    在算法设计领域,递归与分治是两种非常重要的策略,尤其在解决复杂问题时,它们能提供简洁而高效的解决方案。ACM(国际大学生程序设计竞赛)中,掌握这两种方法对于提升解题能力至关重要。 首先,让我们理解递归的...

    使用分治策略递归和非递归和递推算法解决循环赛日程表课程设计报告.docx

    **算法设计与分析课程设计报告** 一、常用算法 ...以上就是关于循环赛日程表问题的算法设计与分析,包括分治策略的递归和非递归实现以及递推算法的实现。在实际应用中,应根据具体情况选择合适的算法。

    低买高卖分治算法

    - `低买高卖.cpp`文件中,很可能包含了C++代码实现,通过递归或迭代的方式实现了上述分治策略。例如,可能会定义一个函数如`int maxProfit(vector<int>& prices)`,该函数接收股票价格数组并返回最大利润。 - `低...

    使用C++,请给出此题的递归算法及非递归算法。

    递归在解决分治策略、树遍历等问题时特别有用,而非递归算法则更适合处理那些可以通过简单循环解决的问题。 总结来说,C++中的递归算法和非递归算法各有优势和应用场景。在实际编程中,理解这两种方法的原理,结合...

    算法艺术-分治与递归

    在算法设计中,分治思想是一种非常重要的方法,它可以将复杂的问题分解成多个小问题,然后通过递归或迭代的方式解决这些小问题。今天,我们将探讨分治思想在算法设计中的应用,包括 Karatsuba 快速乘法、Strassen ...

Global site tag (gtag.js) - Google Analytics