顾名思义,“分治”名字本身就已经给出了一种强有力的算法设计技术,它可以用来解决各类问题。在它最简单的形式里,一个分治算法把问题实例划分成若干子实例(多数情况是分成两个),并分别递归地解决每个子实例,然后把这些子实例的解组合起来,得到原问题实例的解。
为了阐明这个方法,考虑这样一个问题:在一个整数组A[1...n]中,同时寻找最大值和最小值。为了简化问题,不妨假定n是2的整数幂。一中直接的算法如下面所示,它返回一个数对(x,y),其中x是最小值,y是最大值:
x ← A[1]; y ← A[1]
for i ← 2 to n
if A[i] < x then x ← A[i]
if A[i] > y then y ← A[i]
end for
return (x,y)
显然,由以上方法执行的元素比较次数是2n-2。
下面我们来看一下用分治策略:将数组分割成两半,A[1...n/2]和A[(n/2)+1...n],在每一半中找到最大值和最小值,并返回这两个最小值中的最小值及这两个最大值的最大值。
过程 Min-Max
输入 n个整数元素的数组A[1...n],n为2的幂
输出 (x,y), A中的最大元素和最小元素
算法描述 minmax(low, high)
if high - low = 1 then
if A[low] < A[high] then return (A[low], A[high])
else return (A[high], A[low])
end if
else
mid ← ⌊(low + high)/2⌋
(x1, y1 ) ← minmax(low, mid)
(x2, y2 ) ← minmax(mid + 1, high)
x ← min { x1, x2 }
y ← min { y1, y2 }
return (x, y)
end if
这个算法要注意一点,我们已经假定n是2的整数幂。不然的话,算法里面的递归调用会进入死循环...
下面是此算法的Java实现:
Pairs.java 这个类用来保存最大值和最小值:
public class Pairs
{
private int minValue;
private int maxValue;
public Pairs(int minValue, int maxValue)
{
this.minValue = minValue;
this.maxValue = maxValue;
}
public static Pairs valueOf(int minValue, int maxValue)
{
return new Pairs(minValue, maxValue);
}
public int getMaxValue()
{
return maxValue;
}
public int getMinValue()
{
return minValue;
}
}
DivideAndConquer.java 包含实现 Min-max 算法的类:
public class DivideAndConquer
{
public static Pairs minMax(int[] array, int low, int high)
{
if (high - low == 1)
{
int minValue = Math.min(array[low], array[high]);
int maxValue = Math.max(array[low], array[high]);
return Pairs.valueOf(minValue, maxValue);
}
int middle = (low + high) / 2;
Pairs pairs1 = minMax(array, low, middle);
Pairs pairs2 = minMax(array, middle + 1, high);
return Pairs.valueOf(Math.min(pairs1.getMinValue(), pairs2.getMinValue()),
Math.max(pairs1.getMaxValue(), pairs2.getMaxValue()));
}
}
Program.java 包含程序的入口方法,这里面还对传入的数组进行了判断,是否为null或者数组长度为2的幂:
当然也可以不用设置low=0, high=array.length - 1,只要 (high - low + 1) 是2的幂就可以了
public class Program
{
public static void main(String[] args)
{
int[] array = new int[] { 332, 566, 51, 70, 98, 19, 24, 637,
53456, 3321, -235, -34, 5, 45, 77, 36 };
if (array == null || !isValidPower(array.length))
{
System.err.println("Invalid Array!");
return;
}
Pairs pairs = DivideAndConquer.minMax(array, 0, array.length - 1);
String message = String.format("Min Value: %d\nMax Value: %d",
pairs.getMinValue(), pairs.getMaxValue());
System.out.println(message);
}
// 这个方法判断传入的参数是否为2的幂(不包括0和负数)
private static boolean isValidPower(int power)
{
if (power < 2)
return false;
while (power >= 2)
{
if (power % 2 != 0)
return false;
power /= 2;
}
return true;
}
}
分享到:
相关推荐
在本案例中,我们将讨论如何利用分治法在C++中找到数组中的最大值和最小值。 首先,让我们了解分治法的基本步骤: 1. **分解**:将原始问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题。 2. **解决...
* 编写一个求出最大值和最小值的分治算法。 实验内容: 我们知道,如果数组大小为 1,则可以直接给出结果,如果大小为 2,则一次比较即可得出结果,于是我们找到求解该问题的子问题,即数组大小 。到此我们就可以...
### 分治算法在求解最大值与最小值问题中的应用 #### 一、分治算法原理及背景 分治算法是一种高效的问题解决策略,它通过将一个复杂的问题分解成若干个相同或相似的小问题来逐步求解。这些小问题彼此独立且与原...
在本题中,我们关注的是如何运用分治算法来找到一组数字中的最大值和最小值,以及如何找出第k个最小元素。这两个问题都可以通过分治思想进行有效解决。 首先,寻找最大值和最小值。传统的做法是遍历整个数组,但...
总结来说,这个示例展示了如何利用分治策略来解决求最大值和最小值的问题。通过不断将问题分解,直至子问题规模足够小(即数组长度为1或2),然后逐层回溯并更新全局解,最终得到原问题的答案。这种方法具有较高的...
在“分治法求解序列最大最小元素”的问题中,我们将探讨如何利用这种策略找到一个序列中的最大值和最小值。 首先,分解阶段,我们需要将给定的序列分割成两个或更多的子序列,每个子序列大约包含原序列的一半元素。...
这种方法在处理诸如排序、查找以及计算最大值等算法问题时尤为有效。本文将详细探讨如何利用分治法在C++中实现寻找数组中的最大值。 ### 分治法原理 分治法的基本思想是将原问题划分为两个或更多的相同或相似的子...
在算法设计实验中,有一道题目的要求是使用分治法(Divide and Conquer)来求解一个数组中的两个最大值与两个最小值。与蛮力法不同,分治法通过将问题分解成若干子问题来解决,这些子问题的规模比原问题小,并且具有...
但这通常适用于已排序的数组,对于求解最大值和最小值,其优势并不明显。 5. **数据结构选择**:有时候,问题的背景可能允许使用特定的数据结构,如堆(最大堆和最小堆),这样可以在常数时间内找到最大值和最小值...
常规的做法是遍历一次,分别求出最大值和最小值,但我这里要说的是分治法,将数组分成左右两部分,先求出左半部份的最大值和最小值,再求出右半部份的最大值和最小值,然后综合起来求总体的最大值及最小值。...
在本例中,我们将讨论如何使用分治法在Java中找到数组中的最大值和最小值。 首先,我们需要了解分治法的基本步骤: 1. **定义递归函数**:在这个问题中,我们需要创建一个名为`findMinMax`的递归函数,它接受一个...
本文将基于给定的代码片段,深入探讨如何在C++中寻找数组中的最大值和最小值,以及背后的算法原理。 ### C++求最大最小值的核心知识点 #### 1. 函数定义与调用 在提供的代码中,有两个关键函数:`max()`和`min()`...
2. **最大值与最小值的查找**:通常,求解最大值和最小值的蛮力方法是遍历数组,比较每个元素,记录最大值和最小值。但分治算法提供了一个更高效的解决方案。算法`MaxMin(A[l..r], Max, Min)`通过递归将数组分成两半...
在本实验中,我们用分治法求解数组中的最大值和最小值,以此来深入理解分治算法。 **二、算法设计** 1. **基础情况**:当数组只有一个或两个元素时,最大值和最小值可以直接确定。如果只有一个元素,最大值和...
**求最大值和最小值**的一个例子是,对于给定的n个实数,通过分治法可以将数据集分成两半,递归地找出子集的最大值和最小值,然后比较这两个子集的最大值和最小值,从而确定整个集合的最大值和最小值。这个过程减少...
否则,继续将数组分为左右两部分,并分别求出左右子数组的最大值和最小值,最终通过宏`MAX`和`MIN`计算出整个数组的最大值和最小值。 ##### 其他代码片段 代码中还包含了另一个不完整的`main`函数和其他未使用的...
在这个实验中,我们应用分治算法来找到数组中的最大值和最小值。具体实现中,我们首先处理基础情况,即数组只有一个或两个元素时,直接返回该元素作为最大值和最小值。然后,当数组元素大于等于3时,我们将数组分为...
线性规划是运筹学的一个分支,用于寻找变量的最大值或最小值,其目标函数和约束条件均为线性的。网络流问题,如最大流最小割问题,是线性规划在图论中的应用,广泛应用于网络设计和调度问题。 8. **NP完全性理论与...
在求解数组中的最大值和最小值时,我们可以利用分治法的思路: **寻找最大值:** 假设我们有一个数组`arr`,我们可以首先比较数组的第一个元素`arr[0]`和第二个元素`arr[1]`,将较大的值作为当前最大值。接着,...