再回首--分治算法

谈起分治算法,首先从字面意思理解:就是将一个问题划分成多个较小的问题的算法。其实正应题目的意思。其基本设计思想就是:将一个难以直接解决的大问题分解成一些规模较小的相同问题以便各个击破,分而治之。

设计步骤:1)分解:分解成若干子问题

2)求解:求解个子问题

3)合并:将子解合并成原问题的解。

在自考的时候,我们遇到的二路归并算法就属于一种分治法。当然,要学会算法,就要找到其核心,抓住其核心了,我们也就明白算法是怎么回事了。下面我们通过二路归并算法找到其核心。

例子:给出一列数:4,2,8,3。利用二路归并算法进行升序排列。

解法:1、将前两个数合并成一个小问题,后两个合并成一个小问题:如((4,2)(8,3))可得((2,4)(3,8))

2、分别求其升序。再将其结果合并在一起求其升序。关键点就在这:合并后的结果求升序怎么求。

很简单,将两个结果的最小值进行比较,如2和3相比,找最小的放到第一个位置2,在让剩下的3和上一组的第二个数相比4,得到最小的放到第二个位置3。就像米老师讲的似的:将这两个看成两摞有序的扑克,先分别取出第一张进行比较,找出一个最小的,在拿第二张和第一次比较的那个大的比较。依次循环直到完成。

总结:通过上面的例子,我们可以找到期根本思想:就是两列有序的数从小到大的比较。其通式就可以写成如下形式:

         
      if    L[i]<=R[j]   then

         
       
  A[k]=L[i]  ,  i=i+1

         
      else

         
       
  A[k]=R[j]   ,   j=j+1

时间: 2024-08-10 17:21:24

再回首--分治算法的相关文章

【算法】2 由股票收益问题再看分治算法和递归式

回顾分治算法 分治算法的英文名叫做"divide and conquer",它的意思是将一块领土分解为若干块小部分,然后一块块的占领征服,让它们彼此异化.这就是英国人的军事策略,但我们今天要看的是算法. 如前所述,分治算法有3步,在上一篇中已有介绍,它们对应的英文名分别是:divide.conquer.combine. 接下来我们通过多个小算法来深化对分治算法的理解. 二分查找算法 问题描述:在已排序的数组A中查找是否存在数字n. 1)分:取得数组A中的中间数,并将其与n比较 2)治:

【算法基础】由股票收益问题再看分治算法和递归式

最大子数组问题 最近有一个比较火的话题,股票,那么这一篇就由此引入来进一步学习分治算法.在上一篇博客中已经对插入排序和分治算法做了初步的介绍,建议在看一篇前先看看:[算法基础]由插入排序看如何分析和设计算法 当然了,这篇博客主要用来介绍算法而非讲解股票,所以这里已经有了股票的价格,如下所示. 天 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 股票价格 50 57 65 75 67 60 54 51 48 44 47 43 56 64 71 65 6

分治算法(二)

大家都知道选择排序和冒泡排序,这两个排序都是双重for循环,时间复杂度为O(n^2),显然效率都是比较低的,而运用分治思想的归并排序和快速排序会更高效一些. 1.归并排序 1)原理:假设初始序列含有n个记录,则可以看成是n个有序子序列,每个子序列的长度为1,然后两两归并,得到[n/2]([x]表示不小于x的最小整数)个长度为2或1的有序子序列:再两两归并,--,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法成为2路归并排序.(摘自<大话数据结构>) 可见其运用了典型的分治思想,①分

五大算法之分治算法

一.基本思想 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出.对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法.如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止.这就是分治策略的基本思想. 二.二分法 利用分治策略求解时,所需时间取决于分解后子问题的个数.子问题的规模大小等因素,而二分法,由于其划

《数据结构与算法分析 C语言描述》读书笔记——分治算法

书中用求解最大子序列和的方式介绍了分治算法(divide-and-conquer) 分治算法是一种相对快速的算法 运行时间为O(logN) 最大子序列和的问题如下: 给出一组整数 A1  A2 … AN 求∑jk=i Ak 若所有整数均为负 则最大子序列和为0 e.g. 输入-2, 11,-4, 13, -5, -2 输出20(A2到A4) 分治算法就如同字面描述的一样 先分再治 分 指的是将问题分为两部分几乎相同的子问题 进行递归求解 治 指的是将 分 的解通过简单的手段合并 得到最终解 对于

分治算法(一)

当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出.对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法.如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止.这就是分治策略的基本思想. 1.引例: 如果给你一个装有16枚硬币的袋子,其中有一枚是伪造的,并且那枚伪造硬币的重量和真硬币的重量不同.你能不能用最少

【数据结构】分治算法求解假硬币问题

问题描述: 概念 分治算法的基本思想是将一个大的复杂的问题分解成多个小的.容易解决的问题,通过解决这些小问题进而解决这个大问题. 使用分治算法需要待求解问题能够简化为若干个小规模的相同的问题,通过逐步划分,达到一个易于求解的阶段,而直接进行求解,在程序中可以使用递归方法来进行求解. 哈哈,说起来很抽象,举个例子就好理解了. 一个袋子里有n个硬币,其中一枚是假币,并且假币和真币一模一样,仅凭肉眼无法区分,仅知道假币比真币轻一些,请问如何查找到假币? 分治算法: 我们可以这样做: 将这n个硬币分成两

关于分治算法的个人理解

关于分治算法的个人理解: 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并. 以快速排序为例,先取一个参数.将大于该参数的值放在右边,小于该参数的值放在左边,使该参数处于最正确的位置上. 该案例的基本思想:是将该数组排序问题分成为该数组中的数值与选取的参数值比较大小.即简单的一对一的比较问题. 该比较问题相互独立.具有最优子结构性质,且可以合并. 1.快速排序 public class Test{ p

【万字博文】分析与设计:插入排序和分治算法、递归和迭代的探讨

插入排序及其解决思路 算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的. 就像编程语言中的"Hello World!"程序一般,学习算法一开始学的便是排序算法.排序问题在日常生活中也是很常见的,说得专业点: 输入是:n个数的一个序列<a1,a2,...,an?1,an> 输出是:这n个数的一个全新的序列<a,1,a,2,...,a,n?1,a,n>,其特征是a,1≤a,2≤...≤a,n?1≤a,n 举