【问题标题】:Simple Divide and Conquer Example简单的分而治之的例子
【发布时间】:2013-02-03 16:35:16
【问题描述】:

这是我的测试分治程序,但它给了我一个错误。我正朝着正确的方向前进?

public class getSum {
    static int sum = 0;
    public static void main(String[] args) {
            int[] numbers = {2,2,2,2,2,2,2,2};
            int amount = 0;
           amount = sumArray(0,numbers.length,numbers);
           System.out.print(amount);
    }

    public static int sumArray(int first, int last, int[] A){
        int index = last - first;
        if(index == 1){
            return sum;
        }else if(index <= 4 && index > 1){
            for(int i = first; first < last; i++){
                sum += A[i];
            }
            return sum;
        }
        return (sumArray(first, last / 2, A) + sumArray(last / 2, A.length, A));
    }
}

这是错误 线程“主”java.lang.StackOverflowError 中的异常 在 getSum.sumArray(getSum.java:16)

我正在寻找一个简单的示例,将 16 个数组分解为基本情况 4。我无法完全理解如何吐出数组,然后再次拆分它。然后最后合并所有的拆分。

【问题讨论】:

  • 任何特定的语言?
  • c++、java 或类似的东西。我只需要了解

标签: divide-and-conquer


【解决方案1】:

您可以使用递归进行分而治之。你不断在较小的数组上递归,直到找到匹配项,然后爬上递归树。

例如:使用递归函数isIn(Number x, Array a)查找一个数字是否在数组中

Boolean isIn(Number x, Array a) {

   n = a.size
   if n==1 then return a[0]==x
   else
      return isIn(x, a[0:n/2]) or isIn(x,a[n/2:n])
}

您可以看到问题如何被拆分为两个较小的问题,依此类推,直到它达到停止条件“n==1”,然后它开始在调用树上返回结果。 这是伪代码,您必须使概念适应您使用的编程语言

【讨论】:

    【解决方案2】:

    无法完全理解如何吐出数组,然后再次拆分。

    使用递归你可以做到这一点。

    【讨论】:

    • 我不知道该怎么做。
    • @Bhusha_Firake 我在上面添加了一个分而治之的测试。看起来我在正确的轨道上吗?
    猜你喜欢
    • 2011-10-10
    • 2013-11-09
    • 2013-01-16
    • 2013-01-31
    • 2013-02-02
    • 2023-03-14
    • 1970-01-01
    • 2017-01-12
    • 2017-06-07
    相关资源
    最近更新 更多