std :: map似乎找到了不存在的元素

时间:2018-06-04 19:03:23

标签: c++ fibonacci

所以我尝试使用doubling formula 10^9+7F[0]=0创建一个简单的程序来计算第n个斐波纳契数mod [{1}}。程序似乎可以在我的计算机上使用编译器VS2010和CodeBlocks与MinGW一起工作但是在ideone上测试我的程序会为每个输入返回0。似乎在第一次迭代之后,F.find(n)实际上找到了不应该存在的元素。这是我的代码(在VS2010中,我刚刚更改了包含)。

F[1]=1

2 个答案:

答案 0 :(得分:9)

你有这样的表达式问题:

F[n/2-1] = fib(n/2-1)%1000000007;

由于operator[]std::map的评估顺序未定义,因此可以在fib(n/2-1)之前调用它,并在那里创建一个空元素。您应该将缓存值存储在计算它的函数中。

使用与std::map::operator[]相同的key来调用std::map::find也是浪费。

可能的解决方法:

   auto p = F.emplace( n, 0 );
   if( p.second ) { 
       // element was not there
       // calculate and store at p.first->second
   }
   return p.first->second;

答案 1 :(得分:0)

另一种可能的解决方法是添加两个临时变量 unsigned long long a,b;并更改行

F[n/2-1] = fib(n/2-1)%1000000007;
F[n/2] = fib(n/2)%1000000007;

a = fib(n/2-1)%1000000007;
b = fib(n/2)%1000000007;
F[n/2-1] = a;
F[n/2] = b;

这样,map是否创建元素然后分配值并不重要。它还可以优化以下行

return F[n] = (F[n/2-1]*F[n/2-1]+F[n/2]*F[n/2])%1000000007;

避免搜索F [n / 2-1]和F [n / 2]进入

return F[n] = (a*a+b*b)%1000000007;