C++ 在循环条件内,哪一个更有效,i<;sqrtN(预先计算)或i*i<;N、 在C++;?
假设对于给定的整数N,我需要运行N次的循环平方根 在C++中,我可以用这两种方式来做,比如-< /P> (一)C++ 在循环条件内,哪一个更有效,i<;sqrtN(预先计算)或i*i<;N、 在C++;?,c++,loops,conditional-statements,C++,Loops,Conditional Statements,假设对于给定的整数N,我需要运行N次的循环平方根 在C++中,我可以用这两种方式来做,比如-< /P> (一) long-long-sqrtN=std::sqrt(N); for(长i=1;i
long-long-sqrtN=std::sqrt(N);
for(长i=1;i
for(长i=1;i*i
我发现std::sqrt()具有O(logn)复杂性。
另外,我相信数字的乘法只是一个常数时间运算
所以,感觉第二个版本更快。但是,对于非常大的n值,第二个版本中的恒定时间可能非常重要
因此,我不确定哪种方法更有效
我发现std::sqrt()具有O(logn)复杂性。另外,我相信数字的乘法只是一个常数时间运算
到目前为止还不错。你错过了一个细节。第一次调用sqrt
一次,第二次在每个循环迭代中计算i*i
。因此,它实际上是O(logn)
vsO(sqrt(n))
,即计算循环外的边界获胜,因为logn
要真正了解什么更有效,渐近复杂性只能为您提供当您将n
增加到无穷大时会发生什么的第一个提示。对于实际情况,您应该查看编译器和概要文件的输出
我要强调的是,复杂性主要是理论意义上的。对于真正的代码,没有办法进行分析和测量。O(N)
算法胜于O(logN)
算法的可能性不大,因为渐近复杂性完全忽略了任何常数因子
PS:不要过早地进行优化。为可读性编写代码,并将优化留给编译器。只有当您测量并发现计算循环的界限花费了太多时间时,您才需要做一些事情。考虑<<代码> I*i是一个单指令,而循环的主体可能远不止于此(参见AdDHLS定律)。
我发现std::sqrt()具有O(logn)复杂性。另外,我相信数字的乘法只是一个常数时间运算
到目前为止还不错。你错过了一个细节。第一次调用sqrt
一次,第二次在每个循环迭代中计算i*i
。因此,它实际上是O(logn)
vsO(sqrt(n))
,即计算循环外的边界获胜,因为logn
要真正了解什么更有效,渐近复杂性只能为您提供当您将n
增加到无穷大时会发生什么的第一个提示。对于实际情况,您应该查看编译器和概要文件的输出
我要强调的是,复杂性主要是理论意义上的。对于真正的代码,没有办法进行分析和测量。O(N)
算法胜于O(logN)
算法的可能性不大,因为渐近复杂性完全忽略了任何常数因子
PS:不要过早地进行优化。为可读性编写代码,并将优化留给编译器。只有当您测量并发现计算循环的界限花费了太多时间时,您才需要做一些事情。考虑<代码> i*i是一个单指令,而循环的主体可能远不止于此(参见AMDAHLS定律)。 < P>我相信你已经回答了你的大部分问题:
- 计算
的平方根具有N
复杂性O(Log(N))
- 计算
的平方可能发生得非常快,但您需要进行i
次,因此复杂性大于sqrt(N)
O(sqrt(N))
由于
O(Log(N))
小于O(sqrt(N))
,我认为第一种方法是最快的。我相信你自己已经回答了大部分问题:
- 计算
的平方根具有N
复杂性O(Log(N))
- 计算
的平方可能发生得非常快,但您需要进行i
次,因此复杂性大于sqrt(N)
O(sqrt(N))
由于
O(Log(N))
比O(sqrt(N))
小,我认为第一种方法是最快的。这样想吧——计算平方根只发生一次。当您多次执行循环时,这个时间基本上是隐藏的。然而,平方运算的复杂度与循环迭代次数成线性关系,即O(sqrt(N)),对于较大的N,则速度较慢。这样想吧——计算平方根只发生一次。当您多次执行循环时,这个时间基本上是隐藏的。然而,平方运算的复杂度与循环迭代次数成线性关系,即O(sqrt(N)),对于较大的N,平方运算的速度会较慢。为什么不运行基准测试?sqrt
可以只是一条汇编指令,比如@Evg:…这可能仍然非常昂贵。汇编指令的数量不是性能的良好指标。@DevSolar,同意。重点是sqrt(n)
不一定是O(logn)
。还要注意++i
比i++
快;-)为什么不运行benchmark?sqrt
可以只是一条汇编指令,比如@Evg:…这可能仍然非常昂贵。汇编指令的数量不是性能的良好指标。@DevSolar,同意。重点是sqrt(n)
不一定是O(logn)
。还要注意++i
比i++
快;-)
long long sqrtN = std::sqrt(N);
for (long long i=1; i < sqrtN; i++) {
// some piece of code
}
for (long long i=1; i * i < N; i++) {
// some same piece of code
}