用java中的线程计算fibonacci

时间:2011-10-06 10:58:41

标签: java multithreading fibonacci

import java.math.BigInteger;
import java.util.concurrent.*;

public class MultiThreadedFib {

private ExecutorService executorService;

public MultiThreadedFib(final int numberOfThreads) {
  executorService = Executors.newFixedThreadPool(numberOfThreads);
}

public BigInteger getFibNumberAtIndex(final int index) 
  throws InterruptedException, ExecutionException {

  Future<BigInteger> indexMinusOne = executorService.submit(
    new Callable<BigInteger>() {
      public BigInteger call() 
      throws InterruptedException, ExecutionException {
        return getNumber(index - 1);
      }
  });

  Future<BigInteger> indexMinusTwo = executorService.submit(
    new Callable<BigInteger>() {
      public BigInteger call() 
      throws InterruptedException, ExecutionException {
        return getNumber(index - 2);
      }
  });

  return indexMinusOne.get().add(indexMinusTwo.get());
}

public BigInteger getNumber(final int index) 
throws InterruptedException, ExecutionException {
  if (index == 0 || index == 1)
    return BigInteger.valueOf(index);

  return getFibNumberAtIndex(index - 1).add(getFibNumberAtIndex(index - 2));
  }
}

im gonig用java线程计算fibonacci序列以减少计算时间但是答案是错误的虽然它似乎是真的。 另一个问题是在将数字35的新线程启动到顶部时发生的内存不足异常。 请帮我 很多问候......

3 个答案:

答案 0 :(得分:4)

你说你这样做是为了提高性能。有几个问题:

  • 你永远不会通过使用线程减少计算时间 方式。
  • 如果你关心性能,递归是一个坏主意 这个问题。

只需要一个线程,一个简单的循环和两个变量,你就会有一些难以击败性能的东西(不使用a closed-form solution,就是这样)。

答案 1 :(得分:2)

请参阅Fibonacci numbers (Java),记忆递归。这可以让您了解如何实施快速解决方案。

答案 2 :(得分:1)

您需要限制线程数。我建议你只使用两个线程:一个用于查找索引 - 1,另一个用于查找索引 - 2.当这些方法中的每一个递归地找到先前的索引 - 1和索引 - 2时,在现有线程中执行此操作。 / p>

public BigInteger getNumber(final int index) 
    throws InterruptedException, ExecutionException {
   if (index == 0 || index == 1)
     return BigInteger.valueOf(index + 1);

   return getNumber(index - 1).add(getNumber(index - 2));
}

最后,我相信前两个Fibonacci数字(根数)是1&amp; 2,不是0&amp; 1.请注意,我将getNumber更改为返回index + 1并递归调用自身而不是返回服务。

1 + 2 = 3 + 2 = 5 ...

0 + 1 = 1(错误)

这个alg的另一个问题是,由于重新计算了值,因此需要做很多工作。例如,如果您正在寻找

F5 = F4 + F3

线程1:F4 = F3 + F2

线程2:F3 = F2 + F1

请注意,您计算F3两次。事实上,你正计算两次每个数字。