这两种算法中有效的一种算法
Efficient one algorithm of these two algorithms
这两种算法都给出了相同的输出,但第一种算法的时间(>.67)几乎是第二种算法的两倍(.36)。这怎么可能?你能告诉我这两种算法的时间复杂度吗?如果它们是一样的,为什么时间不同?
第一种算法:
for (int i =0 ;i<n;i++){
cin>>p[i];
if(i>0){
if(p[i-1]>p[i]){
cout<<p[i]<<" ";
}
else{
cout<<"-1"<<" ";
}
}
}
第二种算法:
for (int i =0 ;i<n;i++){
cin>>p[i];
}
for (int i =0 ; i<n-1;i++){
if(p[i]>p[i+1]){
cout<<p[i]<<" ";
}
else{
cout<<"-1"<<" ";
}
}
现代处理器中的时间复杂性几乎是无用的性能统计数据。
在这种情况下,我们有一个从0到n-1的算法——O(n)——第二个算法,从0到n-1两次——常数下降,所以它仍然是O(n)。第一个算法有一个额外的if
语句,它将恰好为假一次,一个好的编译器将消除它。我们最终得到了相同数量的输入、相同数量的输出、相同数量(有点)的数组访问和相同数量的if (a>b)
。
第二个有而第一个没有的是决定论。一个循环决定了第二个循环的一切。所有的输入都在第一个循环中被读入。这意味着CPU可以提前准确地看到将要发生的事情,因为它掌握了所有的数字,因此准确地知道if
的每个分支将如何运行,并且可以100%准确地预测,加载缓存,并填充管道,使一切都提前准备好,而不会错过任何节拍。
算法1不能做到这一点,因为直到循环的下一次迭代才知道下一个输入。除非输入模式是可预测的,否则很多时候都会猜测if(p[i-1]>p[i])
的错误。
附加阅读:为什么处理排序数组比处理未排序数组更快?
相关文章:
- 为什么一种算法在相同的时间复杂度下比另一种算法更快?
- 是否有一种 STL 算法可以最后找到,但它也适用于指针?
- 我是 c++ 的新手,有没有一种算法可以找到 3d 数组中最接近的 0 的距离?
- 有没有一种算法可以将 LAPACK 排列更改为真正的排列?
- 这是河内算法的递归塔是一种不知情的搜索
- 有没有一种方法可以使用弗洛伊德-沃歇尔算法给出最短路径,其中存在负权重循环而不允许重叠边缘?
- 如何编写一种算法,该算法在哪个行中显示出在哪个行中显示(我使用的是std :: map)
- 了解一种神秘地起作用的递归二进制搜索算法
- 寻找一种单一的定时方法来测试各种算法,不包括它们的输入
- 这两种算法中有效的一种算法
- 是否有一种算法可以查找字符串中任何指定字符的第一次出现
- 一种用于排序和洗牌等值条目的快速算法(最好是STL的)
- 是否有一种更有效的方法来执行此算法
- 需要一种在平面表示中进行数组索引的算法
- 变换-一种变异序列算法
- 有没有一种算法可以使用opencv来分离图像的前景和背景
- 如何设计一种算法,将两个浮点数相乘而不带"*"?
- 是否只有一种方法可以实现气泡排序算法
- 是一种值得在这里实现的排序算法
- C++11通过两种算法中的一种来完成任务