当前位置:   article > 正文

算法设计之递归与分治策略_要设计出时间效率较高的“递归-分治”算法,划分子问题的时候要注意什么

要设计出时间效率较高的“递归-分治”算法,划分子问题的时候要注意什么

分治法思想:当计算机求解的问题规模较大,直接求解甚至根本没有办法求解,将该问题划分为若干子问题,使子问题与原问题类型一致但其规模却不断缩小,最终使子问题缩小到容易求解。(由于分治法产生的子问题往往是原问题的较小模式,子问题与原问题类型一致,因此,在分治法中经常使用递归技术求解问题,递归与分治之间相辅相成)。

递归算法缺点:执行效率低,空间消耗多。

递归问题:

  • 斐波那契数列

  1. public static int fibonacci(int n){
  2. if (n <= 1) {
  3. return 1;
  4. }
  5. else {
  6. return fibonacci(n-1) + fibonacci(n-2);
  7. }
  8. }

递归求解:递归主要表现在函数在定义自身的同时对自身进行调用,算法中必须有一个明确的递归边界,即递归出口。

递归主要包含两个执行阶段:①自上而下的递归进层阶段(递推阶段);②自下而上的出层阶段(回归阶段)。递归函数中信息传递和控制转移必须通过来实现。

求n个数的最大最小值:

方法一:从n个数中找最大/最小值可通过两步来完成。①经n-1次比较找出最大值;②从其余n-1个数经n-2次比较找出最小值。这种常规方法一共进行2n-3次比较。

方法二:分治法解决。记n个数的集合为S,将其平分为元素个数为n/2的两个集合S1和S2。首先,分别在S1、S2中找出最大最小值,分别记为maxS1、minS1、maxS2、minS2,之后通过两次比较,从所找到的4个数重找出S中最大最小值。从S1和S2中分别找出最大最小值的方法可以按以上思想递归进行。

 

  1. import java.util.Arrays;
  2. public class maxAndMinOfArr {
  3. public static void main(String[] args) {
  4. int[] arr = {45,23,34,78,4,0,74,90,901};
  5. int[] result = maxMin(arr);
  6. System.out.println("max: " + result[0]);
  7. System.out.println("min: " + result[1]);
  8. }
  9. private static int[] maxMin(int[] arr) {
  10. if (arr.length == 2) {
  11. int[] result = new int[2];
  12. int max = Math.max(arr[0], arr[1]);
  13. int min = Math.min(arr[0], arr[1]);
  14. result[0] = max;
  15. result[1] = min;
  16. return result;
  17. }
  18. else if (arr.length == 1) {
  19. int[] result = new int[2];
  20. result[0] = arr[0];
  21. result[1] = arr[0];
  22. return result;
  23. }
  24. else {
  25. int[] result1 = new int[2];
  26. int[] arrLeft = Arrays.copyOfRange(arr, 0, arr.length/2);
  27. int[] arrRight = Arrays.copyOfRange(arr, arr.length/2, arr.length);
  28. result1 = maxMin(arrLeft);//左半部分的最大值和最小值
  29. int[] result2 = new int[2];
  30. result2 = maxMin(arrRight);//右半部分的最大值和最小值
  31. int[] result = new int[2];
  32. result[0] = Math.max(result1[0], result2[0]);
  33. result[1] = Math.min(result1[1], result2[1]);
  34. return result;
  35. }
  36. }
  37. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/987422?site
推荐阅读
相关标签
  

闽ICP备14008679号