分治算法,多么简单的思想!可是它无处不在。btree,b+树中都有它的身影!
1、分治算法:分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
2、二分法:利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是经常采用的一种有效的方法,例如二分法检索。
3、解题步骤:分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
4、实例说明:
a)、利用分治算法求最大最小数:
package sunfa.idea;
import java.util.Arrays;
/**
* 当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解法在时间上相当长,或者根本无法直接求出。对于这类问题,
* 我们往往先把它分解成几个子问题
* ,找到求出这几个子问题的解法后,再找到合适的方法,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题
* ,以此类推,直至可以直接求出解为止。这就是分治策略的基本思想。
*
*/
public class BranchDemo1 {
public static void main(String[] args) {
BranchDemo1 demo1 = new BranchDemo1();
int[] a = { 1, 3, 2, 4, 5, 6, 3, 2, 10, 12, 9 };
Arrays.sort(a);
System.out.println(Arrays.toString(a));
demo1.simpleMinMax(a);
System.out.println("branchMinMax:");
MinMaxBean bean = branchMinMax(a, 0, a.length-1);
System.out.println("max:" + bean.max + ",min:" + bean.min);
}
// 普通算法
public static void simpleMinMax(int[] a) {
MinMaxBean bean = new MinMaxBean();
bean.max = a[0];
bean.min = a[0];
for (int i = 1; i < a.length; i++) {
if (bean.max < a[i])
bean.max = a[i];
if (bean.max < a[i])
bean.min = a[i];
}
System.out.println("max:" + bean.max + ",min:" + bean.min);
}
//分治算法求最大最小数
public static MinMaxBean branchMinMax(int[] a, int low, int hihg) {
MinMaxBean bean = new MinMaxBean();
//2 求解
if (low > hihg - 2) {//如果问题规模较小,此处小于等于2个则直接求解
if (a[low] < a[hihg]) {
bean.max = a[hihg];
bean.min = a[low];
} else {
bean.max = a[low];
bean.min = a[hihg];
}
System.out.println("区间["+low+","+hihg+"] [max:"+bean.max+",min:"+bean.min+"]");
} else {//否则对问题进行分解
int mid = (low + hihg) >>> 1; //1 分解
//3 合并
MinMaxBean b1 = branchMinMax(a, low, mid);
MinMaxBean b2 = branchMinMax(a, mid + 1, hihg);
bean.max = b1.max > b2.max ? b1.max : b2.max;
bean.min = b1.min < b2.min ? b1.min : b2.min;
}
return bean;
}
}
class MinMaxBean {
int max;
int min;
}
b)利用二分法查找数组中某个数或对象的索引
java.util.Arrays源码:
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
int midVal = a[mid];
if (midVal < key)
low = mid + 1;
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
在对象数组中的二分法查找:
private static int binarySearch0(Object[] a, int fromIndex, int toIndex,
Object key) {
int low = fromIndex;
int high = toIndex - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
Comparable midVal = (Comparable)a[mid];
int cmp = midVal.compareTo(key);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
分享到:
相关推荐
分治算法是计算机科学中一种重要的解决问题的策略,它的核心思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个过程通常与递归...
讨论可能包括如何分析分治算法的时间复杂度,以及在某些输入下如何保证算法的效率。 4. 实际应用中的分治法和递归。可能涵盖实际编程场景,如网络爬虫、图像处理、机器学习中的决策树等。 综上所述,"digui.rar...
**分治算法详解** 分治算法是计算机科学中一种重要的问题解决策略,它将一个大问题分解成若干个规模较小的相同或相似的子问题,然后递归地解决这些子问题,最后将子问题的解合并得到原问题的解。这种方法能够有效地...
【分治算法】是一种重要的计算机科学中的算法设计策略,它将复杂的问题分解成若干个规模较小的相同问题,再将这些小问题的解合并得到原问题的解。这个过程可以递归地应用到子问题上,直至子问题足够简单可以直接求解...
学 习a c m 分 治算法 的入门 教程简单易学acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法acm分治算法vacm分治算法acm...
### 数学建模十大算法之分治算法:深入解析与应用 #### 分治算法概览 在数学建模与计算机科学领域,分治算法(Divide and Conquer)是一种核心的解决问题策略,广泛应用于各种复杂问题的求解过程中。其基本思想是...
分治算法是计算机科学中的一个核心概念,它是一种解决问题的策略,通过将复杂问题分解为较小的、相同或相似的子问题来解决。这个过程通常涉及三个主要步骤:分解、解决和合并。分治法充分利用了问题的结构特性,使得...
2. **分治算法**:分治策略是将一个大问题分解为两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。典型的分治算法包括快速排序、归并排序和大数乘法等。 3. **...
本文主要介绍了Java基于分治算法实现的棋盘覆盖问题,简单描述了棋盘覆盖问题,并结合具体实例形式分析了Java基于分治算法实现棋盘覆盖问题的相关操作技巧。 知识点一:分治算法的基本概念 分治算法是一种将复杂...
分治算法是一种重要的算法设计思想,其核心在于将一个难以直接解决的大问题划分成若干个小问题,递归地解决这些小问题,最后再将小问题的解合并以解决原来的大问题。在本课程件中,将从多个方面对分治算法进行详细...
分治算法是一种重要的算法设计策略,其基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治法通常涉及以下三个步骤: 1. **...
分治算法不仅应用于简单的搜索问题,它同样适用于许多其他类型的计算问题,比如合并排序(Merge Sort)算法和快速排序(Quick Sort)算法,都是分治策略的典型应用。合并排序算法将数组分成两半,递归地对每一半进行...
递归是分治算法中最常见的实现方式,因为递归本身就是一种不断将问题分解直至子问题足够简单可以直接求解的过程。然而,在使用递归时也要注意避免不必要的重复计算和栈溢出的风险。在实际应用中,分治法往往与其他...
分治算法提供了一种更高效、更优雅的解决方案。分治法的基本思想是将复杂的问题分解为多个较小的子问题,然后逐个解决,最终将子问题的解合并得到原问题的解。 在大数相乘中,分治算法通常表现为Karatsuba算法或...
### 分治算法求解数组中第二大的元素 #### 背景介绍 在计算机科学领域,寻找数组中的最大或次大元素是常见的问题之一。这类问题不仅有助于理解数据结构的基本概念,也是评估算法效率和复杂度的良好案例。本文将探讨...
分治算法的基本思想是将一个复杂的问题分解成两个或更多的相同或相似的子问题,直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并。 本篇内容旨在通过一个具体的实例——从键盘输入一组整数,并利用...
分治算法是计算机科学中一种重要的算法思想,它的基本策略是将一个复杂的问题分解成两个或更多的相同或相似的子问题,再将子问题分解为更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的...
贪心算法、分治算法和动态规划的区别 贪心算法、分治算法和动态规划是三种常用的算法设计策略,每种算法都有其特点和应用场景。下面我们将对这三种算法进行详细的比较和分析。 分治算法 分治算法是一种将原问题...
在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解...