优化代码:斐波那契算法
optimizing code: fibonacci algorithm
我正在研究一个非常大的数字(100k个数字)的斐波那契算法。我需要让它运行得更快,但就几秒钟,我就没主意了。有什么办法能让它快一点吗?谢谢你的帮助。
#include <iostream>
using namespace std;
int main() {
string elem_major = "1";
string elem_minor = "0";
short elem_maj_int;
short elem_min_int;
short sum;
int length = 1;
int ten = 0;
int n;
cin >> n;
for (int i = 1; i < n; i++)
{
for (int j = 0; j < length; j++)
{
elem_maj_int = short(elem_major[j] - 48);
elem_min_int = short(elem_minor[j] - 48);
sum = elem_maj_int + elem_min_int + ten;
ten = 0;
if (sum > 9)
{
sum -= 10;
ten = 1;
if (elem_major[j + 1] == NULL)
{
elem_major += "0";
elem_minor += "0";
length++;
}
}
elem_major[j] = char(sum + 48);
elem_minor[j] = char(elem_maj_int + 48);
}
}
for (int i = length-1; i >= 0; i--)
{
cout << elem_major[i];
}
return 0;
}
无论您对给定代码执行了多么好的优化,如果不更改底层算法,您只能略微优化它。你的方法具有线性复杂性,对于较大的值,它很快就会变慢。一个更快的斐波那契数实现是通过对矩阵平方进行矩阵幂运算:
0 1
1 1
这种方法将具有对数复杂度,这是渐近更好。对这个矩阵执行几次幂运算,您会注意到n + 1
st斐波那契数位于其右下角。
我建议您使用类似于cpp-bigint (http://sourceforge.net/projects/cpp-bigint/)的大数字。代码应该是这样的
#include <iostream>
#include "bigint.h"
using namespace std;
int main() {
BigInt::Rossi num1(0);
BigInt::Rossi num2(1);
BigInt::Rossi num_next(1);
int n = 100000;
for (int i = 0; i < n - 1; ++i)
{
num_next = num1 + num2;
num1 = std::move(num2);
num2 = std::move(num_next);
}
cout << num_next.toStrDec() << endl;
return 0;
}
在我的机器上的快速基准测试:
time ./yourFib
real 0m8.310s
user 0m8.301s
sys 0m0.005s
time ./cppBigIntFib
real 0m2.004s
user 0m1.993s
sys 0m0.006s
我会节省一些预先计算的点(特别是因为你正在寻找非常大的数字)
假设我保存了第500和501个fib号码。如果有人问我第600个小谎是什么?我会从502开始计算,而不是从1开始。这真的会节省时间。
现在的问题是你要保存多少点以及如何选择要保存的点?
这个问题的答案完全取决于应用和可能的分布。
相关文章:
- 读取最后一行代码算法 - c++ 时出现问题
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 如何知道用于实现标准代码段的确切数据结构和算法,例如在C++STL中?
- 由于指针算法错误,代码在 memcpy 中崩溃
- 为什么此代码上的排序算法不调用类的交换版本?
- 对于代码中指定的边界之外的值,对角差算法的输入不正确
- "使用算法;不要为多步骤逻辑编写代码"?
- 这条代码线在双方图算法中通过BFS做什么
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- 尝试在C++中"blur"矩阵;有缺陷的算法或代码?
- C - 哈希算法代码什么都没有返回
- 在避免代码重复和冲突名称的同时,如何实现多个版本的同一算法
- C++算法:如何提高此代码的效率?[大O]
- 我需要一个测试案例来证明我的算法/代码错误
- 快速排序算法代码
- Johnson trotter置换算法代码
- 克鲁斯卡尔算法代码因未知原因而崩溃
- 分离配置代码和算法代码的最佳做法
- 以下 Prim 算法代码的运行时间
- 排序算法代码中的未知问题