`
zpsailor
  • 浏览: 43729 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

通过Java浅例学习分治法

阅读更多

   我理解的分治法的基本思想就是将一个规模很大,难以直接求解的问题,分成合适的模块,这样便于对每一个模块进行直接求解。每一个模块要在形式上和原型一致,而在规模上要比原型容易求解,这就是分治策略。基于这种策略,我们很自然的想到利用递归求解。确实,在分治法求解问题的过程中,合理的使用递归可以起到很不错的效果。下面我要分享的两个小程序就是基于分治的思想,使用递归完成的二分检索和归并排序程序。

  

package fenzhi;

/**
 * 使用分治法的思想查找最大值
 * 
 * @author Administrator
 * 
 */
public class FindMax {

	// 返回最大值的方法
	public int returnMax(int array[]) {
		int length = array.length;
		int first;
		int second;
		if (length == 1) {
			return array[0];
		} else if (length == 2) {
			return Math.max(array[0], array[1]);
		} else if (length < 1) {
			return 0;
		} else {   //这里将一个数组一分为二,然后各个求解
			first = length / 2;
			second = length - length / 2;
			int firstArray[] = new int[first];
			int secondArray[] = new int[second];
			for (int i = 0; i < first; i++) {
				firstArray[i] = array[i];
			}
			for (int j = first; j < length; j++) {
				secondArray[j - first] = array[j];
			}
			return Math.max(returnMax(firstArray), returnMax(secondArray));
		}
	}

	public static void main(String[] args) {

		FindMax findMax = new FindMax();
		int array[] = { 5, 12, 1, 36, 9, 2, 14, 30, 21, 56,80,12,33};
		long start = System.currentTimeMillis();
		int max = findMax.returnMax(array);
		long end = System.currentTimeMillis();
		System.out.println("这个数组中的最大值是:" + max);
		System.out.println("本次查找耗时: " + (end - start) + " ms");
	}

}

    上面的程序使用二分法查找一个数组的最大值,这是一个简单的程序,但我认为已经能很好的解释分治法的思想了。下面一个程序将通过一个归并排序来进一步说明。这些都只是简单的应用,但是理解了这个思想后,可以在很多实际的应用中让我们的程序变得更加有效。

 

package fenzhi;

//归并排序
public class MergerSort {

	public int[] sort(int array[]) throws Exception {

		int newArray[];
		int length = array.length;
		int first, second;
		newArray = new int[length];
		if (length == 1) {
			return array;
		} else if (length == 2) {
			newArray[0] = Math.min(array[0], array[1]);
			newArray[1] = Math.max(array[0], array[1]);
			return newArray;
		} else {// 这里用到了分治法的思想,将一个数组一分为二
			first = length / 2;
			second = length - length / 2;
			int firstMark = 0;//用来标记第一个数组取到的下标
			int secondMark = 0;//用来标记第二个数组取到的下标
			int mark = 0;
			int firstArray[] = new int[first];
			int secondArray[] = new int[second];
			for (int i = 0; i < first; i++) {
				firstArray[i] = array[i];
			}
			for (int j = first; j < length; j++) {
				secondArray[j - first] = array[j];
			}
			firstArray = this.sort(firstArray);
			secondArray = this.sort(secondArray);
			while (mark < length) {
				if (firstMark < first && secondMark < second) {
					if (firstArray[firstMark] <= secondArray[secondMark]) {
						newArray[mark] = firstArray[firstMark];
						firstMark++;
					} else {
						newArray[mark] = secondArray[secondMark];
						secondMark++;
					}
				} else if (firstMark < first && secondMark >= second) {
					newArray[mark] = firstArray[firstMark];
					firstMark++;
				} else if (firstMark >= first && secondMark < second) {
					newArray[mark] = secondArray[secondMark];
					secondMark++;
				} else {
					throw new Exception("error");
				}
				mark++;
			}
		}
		return newArray;
	}

	public static void main(String[] args) {
		MergerSort mergerSort = new MergerSort();
		int array[] = { 5, 12, 1, 36, 9, 2, 14, 30, 21, 56, 80, 12, 33 };
		long start = System.currentTimeMillis();
		long end = System.currentTimeMillis();
		try {
			array = mergerSort.sort(array);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("排序后的数组为:");
		for (int i = 0; i < array.length; i++) {
			System.out.print(array[i] + "\t");
		}
		System.out.println("本次查找耗时: " + (end - start) + " ms");
	}

}

 

分享到:
评论
6 楼 fxsc 2010-04-04  
分治法的核心是先分再合,很多时候难点在合并结果
5 楼 zpsailor 2010-03-31  
FeiXing2008 写道
还有好多问题那样子喔

噢 ~~  什么问题呢?
4 楼 iooyoo 2010-03-31  
用递归最好首先考虑下问题规模对效率的影响,问题规模要适中,递归的核心模块逻辑也不要太大
3 楼 FeiXing2008 2010-03-31  
还有好多问题那样子喔
2 楼 zpsailor 2010-03-30  
little_bill 写道
非常好用。谢谢分享。
学习!学习! 分治法

呵呵 客气了 我也是抱着学习的态度分享一点小程序而已,如果对你有帮助,我非常高兴
1 楼 little_bill 2010-03-30  
非常好用。谢谢分享。
学习!学习! 分治法

相关推荐

    java实现分治法寻找最近点对

    使用java编写 用分治法实现对于平面上最近点对的查找 使用Swing作为界面

    分治法求最近点对

    **标题解析:**“分治法求最近点对”指的是使用分治策略来解决寻找二维空间中距离最近的两个点的问题。...通过深入学习和实践,可以提升对分治法和Java编程的理解,同时也能锻炼到算法设计和问题解决的能力。

    java编程实现分治法归并排序

    通过本文的学习,我们了解了分治法的基本思想及其在归并排序中的应用。归并排序是一种非常实用的排序算法,它利用分治策略高效地对数组进行排序。Java代码示例展示了如何实现归并排序,并通过实际运行结果验证了算法...

    java另类分治法凸包问题

    总之,这个Java程序巧妙地利用了分治法的思想,通过不断旋转和比较点集,找到了二维平面上点集的凸包,并且保证了输出的顶点顺序是顺时针的。这种方式不仅解决了凸包问题,还处理了特殊情况,如多点共线,显示出了...

    算法课程设计——分治法(java实现)

    算法课程设计——分治法(java实现) 本课程设计报告的主要内容是对分治法的详细分析和讲解,并使用 Java 语言对其进行实现。分治法是一种经典的排序算法,它的主要思想是将问题分解为两个子序列,然后对子序列进行...

    大矩阵相乘 分治法 java实现 源代码

    总的来说,Strassen算法是利用分治法优化矩阵乘法的一种策略,虽然在实际应用中可能受限于其复杂性和常数因子,但仍然是理解和学习算法设计思想的一个重要例子。通过Java实现,我们可以更好地掌握这一算法,并将其...

    分治法-棋盘覆盖 java

    通过本文的学习,我们不仅掌握了分治法的基本思想及其在棋盘覆盖问题中的应用,还了解了其实现细节及背后的理论依据。这为我们解决类似的组合问题提供了有力的工具。未来,在遇到更多复杂问题时,分治法仍将是值得...

    java 快速排序 折半查找的界面实现 (递归与分治法)

    在Java编程中,这两种算法都可以通过递归和分治策略进行实现,以提高效率和可读性。下面我们将深入探讨这两个算法的原理、实现方式以及它们在Java中的应用。 首先,快速排序是一种高效的排序算法,由C.A.R. Hoare在...

    分治法求众数.doc

    总结一下,本实验通过分治法和快速排序的启发,设计了一个高效的求解众数的算法。它避免了完全排序,减少了时间复杂度,同时利用递归策略缩小搜索范围,提高了算法效率。在实际编程中,这种思想可以广泛应用于解决...

    实验4 分治法1

    2. **提高应用分治法设计算法的技能**:通过解决具体问题,学生将学习如何将问题适当地分解,并使用分治策略来编写代码。 **实验任务** 实验要求学生运用分治法解决三个基础题目和一个提高题目: 1. **元素选择**...

    最短距离点对分治法实现 Java

    在计算机科学中,寻找两点之间的最短路径是一个常见的问题,特别是在图论和几何算法中。分治法是一种解决复杂问题的策略,它将大...通过完成这个项目,不仅可以加深对分治法的理解,还能提升Java编程和GUI设计的能力。

    最大子段和问题 蛮力法 分治法 动态规划法

    分治法通常用于处理复杂的问题,通过将大问题分解成小问题来解决。在最大子段和问题上,我们可以尝试将数组分为两部分,然后分别找出左半部分、右半部分以及跨越整个数组的最大子段和。然而,分治法并不适用于这个...

    用分治法求最大最小值JAVA为例

    在本例中,我们将讨论如何使用分治法在Java中找到数组中的最大值和最小值。 首先,我们需要了解分治法的基本步骤: 1. **定义递归函数**:在这个问题中,我们需要创建一个名为`findMinMax`的递归函数,它接受一个...

    分治法求最大值和最小值

    在这篇实验报告中,我们将通过分治法来解决最大值和最小值的问题。分治法是一种将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 实验目的: * 加深对分治算法原理及实现过程...

    分治法求解最大值

    数据结构的分治法求解最大值,数据结构的分治法求解最大值

    利用分治法求解空中飞行管理问题

    而分治法通过逐步将问题分解成若干小问题并分别求解,然后再将这些解合并,可显著提高求解效率,其时间复杂度可降低至O(nlogn)。 分治法的适用条件有四点。首先,问题规模较小时容易直接解决;其次,原问题能够分解...

    分治法的应用

    分治法的计算效率通常可以通过递归方程进行分析。假设一个规模为n的问题被分成了k个规模为n/m的子问题去解决,其中m通常等于k。递归方程的形式通常是T(n) = kT(n/m) + f(n),其中f(n)表示分解和合并子问题所需的时间...

    分治法求两个大整数相乘

    本篇将介绍如何通过分治法来实现两个大整数的乘法。 #### 二、分治法简介 分治法是一种将复杂问题分解成若干个相似但规模较小的子问题,并递归解决这些子问题,最终将子问题的解组合成原问题解的算法策略。其基本...

    分治法实现矩阵相乘

    总结来说,分治法实现矩阵相乘是通过将大问题分解为多个小问题来求解的策略,它能够帮助我们理解和设计更高效的算法。然而,实际应用时还需要考虑算法的内存消耗和计算效率,以及特定硬件环境的影响。对于大型矩阵的...

Global site tag (gtag.js) - Google Analytics