这两种算法都给出相同的输出,但是与第二种算法(.36)相比,第一种算法花费了几乎两倍的时间(> .67)。这怎么可能?您能告诉我两种算法的时间复杂度吗?如果它们相同,为什么时间会不同?
第一种算法:
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 :(得分: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])
经常出问题的方式。
其他阅读:Why is it faster to process a sorted array than an unsorted array?