【发布时间】:2014-01-09 20:52:39
【问题描述】:
我正在研究斐波那契范围计算算法。
我已经尝试过简单的方法 - 增加 for 循环和矩阵相乘,还尝试使用 Task、Parallel 和其他 TPL 功能重构它们。
但最简单的(for 循环中的增量)仍然胜过所有其他的。
public static IEnumerable<int> FibonacciSimple(uint x)
{
int prev = -1;
int next = 1;
for (uint i = 0; i < x; i++)
{
int sum = prev + next;
prev = next;
next = sum;
yield return sum;
}
}
这是否意味着 CLR 关心所有这些并且没有挑战的空间,或者有什么可以玩的?
【问题讨论】:
-
您是在问为什么它不能作为并行任务运行得更快?如果是这样,那是由于斐波那契数列的迭代性质。使用变量 next 和 prev(在 for 循环之外)强制执行有效的串行执行。
-
提到的是最简单最快的。我对可以改进的方式感兴趣
-
斐波那契不能并行化,除非你提前知道一些相邻的斐波那契数对
-
Binet's 允许您计算斐波那契数,而不是通过 prev + next 而是通过您想要的索引。这可以很容易地并行化。示例实现:en.wikibooks.org/wiki/Algorithm_Implementation/Mathematics/…
-
此外,指数版本可以轻松并行化。 :-)
标签: c# .net task-parallel-library fibonacci