Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在循环条件内,哪一个更有效,i<;sqrtN(预先计算)或i*i<;N、 在C++;?_C++_Loops_Conditional Statements - Fatal编程技术网

C++ 在循环条件内,哪一个更有效,i<;sqrtN(预先计算)或i*i<;N、 在C++;?

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

假设对于给定的整数N,我需要运行N次的循环平方根

在C++中,我可以用这两种方式来做,比如-< /P> (一)

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)
    vs
    O(sqrt(n))
    ,即计算循环外的边界获胜,因为
    logn

    要真正了解什么更有效,渐近复杂性只能为您提供当您将
    n
    增加到无穷大时会发生什么的第一个提示。对于实际情况,您应该查看编译器和概要文件的输出

    我要强调的是,复杂性主要是理论意义上的。对于真正的代码,没有办法进行分析和测量。
    O(N)
    算法胜于
    O(logN)
    算法的可能性不大,因为渐近复杂性完全忽略了任何常数因子

    PS:不要过早地进行优化。为可读性编写代码,并将优化留给编译器。只有当您测量并发现计算循环的界限花费了太多时间时,您才需要做一些事情。考虑<<代码> I*i是一个单指令,而循环的主体可能远不止于此(参见AdDHLS定律)。

    我发现std::sqrt()具有O(logn)复杂性。另外,我相信数字的乘法只是一个常数时间运算

    到目前为止还不错。你错过了一个细节。第一次调用
    sqrt
    一次,第二次在每个循环迭代中计算
    i*i
    。因此,它实际上是
    O(logn)
    vs
    O(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
    }