算法分析之分治法学习总结(一)
一)解决问题的类型:当我们要解决一个输入规模(n)很大的问题时,直接处理往往比较困难或者根本无法
求解,我们希望把输入规模缩小,即分成很多份,分别解决了,并且这些小问题容易合起来从而解决整个问
题。
二)解题关键:
1)如何分:我们往往先把输入分成两个与原来相同的子问题,如果规模还太大,我们
对这些子问题再做上述处理,直到这些子问题容易解决为止.
2)合并子问题:往往分治法的难点在于分完之后怎么合并.合并策略决定了算法的优劣,合并问题根据具体问题而
定,没有固定的方法
3)分治问题往往用到递归算法.
三)几种类型的分治问题:
1)把问题分成字问题后,如果某个子问题解决了则整个问题也就解决了,无须合并.
典型事例:二分检索问题(前提是一组按照关键码排好顺序对象,不妨设按升序排列)
二分检索的解题思路是先看看中间那个数,如果这个数是要查找的,那么ok,问题解决,否则如果比key大,那么
在前一半继续上述过程,否则在后一半继续上述过程,直到找到或者查找失败.
程序代码:(设为int型数)
void BinarySearch(int a[],int low,int high,int key)
{
if(low >= high) return;
int mid = (low + hight) / 2;
if(a[mid] == key) return mid;
else if(a[mid] > key)
return BinarySearch(a[],low,mid,key);
else if(a[mid] < key)
return BinarySearch(a[],mid,low,key);
}
2)把问题分了之后,再经过合并最终解决问题.
典型事例:归并排序问题:
这个问题就象我们在一个很长的队,现在要按大小个排好,我们把这个队分成两个(如果还是太长,可以再分,
先看分成两个的问题,这样容易看清合并过程),我们把这两队分别排好,然后合成一队,合并的过程很简单,就
是弄一个新的队,从那两个个队的排头分别出列,比一下矮的站在第一个位置,高的在一边等着,等另一个队现
在的排头出列,再比一下,矮的排在第二个位置,高的站在一边,重复上述过程,直到有一个队变空,然后把另一个
队拉过来接在新队的队尾,这就排好了整个队了.
归并排序,就是把一组待排的关键值可比的东西,我们把他分成两个小组,如果问题规模还不够小,我们继续
分,直到容易解决为止,然后把小的组排好续,然后合并成一组.
算法过程:
void mergeSort(int a[],int low,int high)
{
if(low >= high)
return;
int mid = (low + high) / 2;
mergeSort(a,low,mid);
mergeSort(a,mid+1,high);
merge(a,low,mid,high);
}
void merge(int a[],int low,int mid,int high)//合并过程
{
int []b = new int[high-low+1] ;
int i = low,j=mid+1,k=0;
while(i <= mid && j <= high)
{
if(a[i] < a[j])
{
b[k++] = a[i];
i++;
}
else
{
b[k++] = b[j];
j++;
}
}
if(i > mid)
for(int m=j;m<=high;m++)
b[k++] = a[m];
else
for(m=i;m=mid;m++)
b[k++] = a[m];
for(m=low,int n=0;m<=high;m++)
{
a[m] = b[n++];//排好的元素再拷贝到a中
}
}
分享到:
相关推荐
总结来说,“分治法求解序列最大最小元素”是一种利用分治策略来高效找出序列中最大和最小元素的算法。通过分解、解决和合并三个步骤,我们可以递归地处理序列的子集,最终在对数时间内找到答案。这种方法不仅适用于...
分治法是一种常见的算法设计策略,其核心思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。在计算机科学中,分治法被广泛应用于排序...
在学习分治法时,我们需要掌握设计有效算法的分治策略,理解递归的概念,分析递归算法的时间复杂度。此外,还需要学习如何将问题分解成若干个规模较小的子问题,并将解组合成原始问题的解。 在本章节中,我们将学习...
分治法是一种重要的算法设计策略,它将一个复杂的问题分解为多个相对简单的子问题来解决。在本案例中,我们探讨的是如何运用分治法来处理大整数乘法问题。大整数乘法在密码学、计算几何、计算生物学等领域都有广泛...
在计算机科学领域,分治法(Divide and Conquer)是一种高效的问题解决策略,它将一个复杂的大问题分解成若干个相同或相似的子问题,直到这些子问题变得足够简单,可以直接求解为止。这种方法在处理诸如排序、查找...
例如,快速排序算法就是分治法的一个经典应用,它巧妙地结合了分解、解决和合并三个步骤,而且在大多数情况下具有优秀的平均性能,尽管在最坏情况下时间复杂度为O(n^2),但通过随机化选择枢轴元素,可以确保在实际...
通过上述分析,我们可以看出这段代码实现了基于分治法的格雷码生成算法。它首先通过递归的方式生成低位的格雷码,然后通过简单的变换操作得到更高位的格雷码。这种方法不仅简洁高效,而且易于理解和实现,非常适合...
这些问题都属于算法设计与分析的范畴,通过解决这些问题,我们可以深入理解分治法和其他算法策略。 1. **串匹配问题**: - **BF算法**(Brute Force算法)是最简单的字符串匹配算法,它通过逐个字符比较目标串S和...
《吉林大学算法分析习题课答案》是一份与算法分析相关的学习资料,主要针对的是吉林大学算法分析课程的习题解答。这份压缩包文件包含了课件等教学资源,旨在帮助学生理解和掌握算法分析的核心概念、方法和技巧。下面...
实验中,我们将学习如何使用分治法来实现快速排序算法,并对其性能进行分析。 一、实验目的 本实验的目的是通过上机实验,要求掌握分治算法的问题描述、算法设计思想、程序设计。给定任意几组数据,利用分治法的...
在本例中,我们将使用分治法实现归并排序算法,这是一种高效的排序方法,其时间复杂度为O(n log n)。 #### 归并排序原理 归并排序是一种稳定的排序算法,它基于分治策略。归并排序的基本过程是: 1. **递归划分**...
在计算机科学中,分治法是一种重要的算法设计策略,它将复杂的问题分解为多个较小的部分,分别解决后再组合成原问题的解。在本例中,我们讨论的是如何使用VB6.0(Visual Basic 6.0)编程语言来实现分治法解决平面中...
其中,“分治法”是一种重要的算法设计思想,它通过将一个大问题分解成若干个规模较小但结构相同的小问题来解决整个问题。本文将详细介绍如何运用分治法解决“棋盘覆盖”这一经典问题,并给出相应的Java实现代码。 ...
分治法是一种递归算法设计技术,其核心思想是将大问题分解成若干个规模较小的子问题,递归地求解这些子问题,最后将子问题的解合并得到原问题的解。在凸包问题中,分治法的基本步骤包括: 1. **划分**:将点集分成...
这个问题在数据结构、算法分析和优化等领域有广泛的应用,例如在金融数据分析、网络流量分析等场景。在这个压缩包文件"Maxsum.zip"中,包含的资源可能涉及到几种不同的解决方案,包括蛮力法、分治法和动态规划法。 ...
《算法分析与设计》实验报告主要探讨了四种重要的算法策略:分治法、动态规划、回溯法和贪心法。这些方法在解决复杂计算问题时具有重要作用。 首先,我们聚焦于分治法。分治法是一种将大问题分解为小问题的策略,...
课件"算法分析与设计"为学生提供了一个全面的学习资源,包含了该领域的基础知识和实践技巧。 一、算法基础 1. 算法定义:算法是一系列明确的步骤,用于解决特定问题或执行特定任务。它是一个有限的输入集合,确定的...
2018年的算法分析与设计真题可能涵盖了动态规划、贪心算法、分治策略、回溯法、分支限界法等高级算法,同时也可能涉及数据结构,如树、图、栈、队列、链表等。这些内容不仅要求考生具备扎实的理论基础,还需要有良好...
总结来说,《算法分析与设计课件PPT》是一份全面且实用的学习资源,它将引导你走进算法的世界,提升你的编程思维,帮助你成为更优秀的程序员。通过深入研究和实践其中的每一个案例,你将能够更好地应对编程挑战,...
《数据结构与算法分析C语言描述》第二版是由Mark Allen Weiss所著的一本权威书籍,旨在深入讲解数据结构及其组织方法以及算法分析的基本原理。随着计算机硬件性能的不断提升,软件系统面临的数据量也越来越大,因此...