【问题标题】:Fibonacci using Threads使用线程的斐波那契
【发布时间】:2010-12-05 09:32:25
【问题描述】:

以下code 尝试并行化斐波那契数问题。怎么修改才能限制线程数。

我知道斐波那契不是线程的自然候选者。但想知道如何使用线程对其进行优化。

public class Fib extends Thread
{
    private int x;
    public int answer;

    public Fib(int x) {
        this.x = x;
    }

    public void run() {
        if( x <= 2 )
            answer = 1;
        else {
            try {
                Fib f1 = new Fib(x-1);
                Fib f2 = new Fib(x-2);
                f1.start();
                f2.start();
                f1.join();
                f2.join();
                answer = f1.answer + f2.answer;
            }
            catch(InterruptedException ex) { }
        }
    }

    public static void main(String[] args)
        throws Exception
    {
        try {
            Fib f = new Fib( Integer.parseInt(args[0]) );
            f.start();
            f.join();
            System.out.println(f.answer);
        }
        catch(Exception e) {
            System.out.println("usage: java Fib NUMBER");
        }
    }
}

【问题讨论】:

  • 我喜欢早上做作业的味道...
  • 我不确定您是否可以编写多线程斐波那契生成器,因为序列中的每个元素都是最后一个元素的函数。
  • 它对合并排序很有帮助。
  • Mariah:参见此处给出的封闭式公式:en.wikipedia.org/wiki/Fibonacci_number;确实有一个序列的任意元素的表达式(封闭形式的公式就是那个)。
  • (当然,知道这种情况会将您的问题从寻找斐波那契数列转移到处理更高幂并找到任意精度的黄金比例;但我想我将这项研究留给您: )

标签: java multithreading


【解决方案1】:

将每次对 fib() 的调用分成两个调用是低效的 - 斐波那契数列的计算应该在线性时间内完成。请参阅this question 的回复。

也就是说,如果您仍想使用线程,那么记忆和/或使用未来的结果是必不可少的。


【讨论】:

  • 由于每个结果都依赖于前一个结果,因此没有可以并行执行的独立操作。
【解决方案2】:

您可以为线程创建一些工厂,其中将包含当前线程数/线程的 poll 或 smt。这个工厂的主要问题是 - 线程创建。

【讨论】:

    【解决方案3】:

    斐波那契是创建大量线程的常见示例,因为它易于理解和实现,这使得它非常适合家庭作业,但应该注意的是,这也可能是使用一个线程比尝试使用更快的最佳示例多个线程。这是一个坏主意的原因是拥有许多线程的开销与呈指数增长的结果成正比。

    简而言之,最佳线程数是 1。一旦你知道了这一点,你的代码就会变得简单得多。

    如果您想优化您的代码,您应该开始在循环中从第一个值开始构建您的值。即从 1, 1, 2, 3, 5, 8 开始...这也会成倍减少您拨打的电话次数。

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      相关资源
      最近更新 更多