《算法技术手册》一3.6.2 分治

本文介绍了一种常用的算法——分治法,并通过一个具体的例子详细解释了其工作原理。分治法将一个问题分解为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。文中还对比了分治法与直接遍历两种求解最大值的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3.6.2 分治

分治通常是将一个规模为n的问题划分成两个独立的子问题,其中每个子问题的规模约为n/2。大部分时候分治策略是递归形式的,并且会有简单易懂的基本条件用于结束递归。此外,在计算出两个较小问题的解之后,还必须要有一些计算来根据子问题的解计算出原问题的解。
下面来看一个例子:求包含n个数的数组中的最大元素。例3-2展示了如何将原问题分解成两个子问题并通过递归求解。通常,最大值一般是两个子集各自的最大值中比较大的那一个。仔细观察尾递归触发的条件,即子集中只有一个元素vals[left]返回。
例3-2:递归分治求数组中最大值
/* 开始使用递归函数 /
public static int maxElement(int[] vals) {
if (vals.length == 0) {

throw new NoSuchElementException("No Max Element in Empty Array.");

}
return maxElement(vals, 0, vals.length);
}

/** 计算vals[left, right)的最大元素

  • 注意vals[right]并不在计算之列 */
  1. int maxElement(int[] vals, int left, int right) {

if (right - left == 1) {

return vals[left];

}

// 计算子问题
int mid = (left + right) / 2;
int max1 = maxElement(vals, left, mid);
int max2 = maxElement(vals, mid, right);

// 合并处理:从子问题的解中得到当前问题的解
if (max1 > max2) { return max1; }
return max2;
}
例3-2中分治算法的时间复杂度是O(n),因为子问题解的合并处理在常数时间内就能完成。如果这一步需要O(n)时间,那么整体的时间复杂度将会上升至O(n log n)。当然,我们也可以不用分治算法,直接遍历数组并且记下当前所找到的最大值。所以,就当是一个小小的提示吧:分治算法并不总是最快的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值