【问题标题】:What is the complexity of this code that repeatedly subtracts values?这段重复减去值的代码的复杂性是什么?
【发布时间】:2013-10-08 20:21:10
【问题描述】:

我有这段代码,想知道它的时间复杂度:

    int N,M; // let N and M be any two numbers 
    while(N != M && N > 0 && M > 0){
       if(N > M)N -= M;
       else M -= N;
    }

我不知道如何分析,因为 M 和 N 的值以不寻常的方式减少。有没有标准的方法来解决这个问题?

【问题讨论】:

  • 如果 N==1 和 M==0 你会得到一个无限循环。
  • 对不起,我更正了

标签: c++ algorithm complexity-theory big-o time-complexity


【解决方案1】:

此代码是Euclidean algorithm 的幼稚实现。在每次迭代中,您从较大的数字中减去较小的数字,因此您可以将算法划分为“阶段”。每个阶段都包括从较大的数字中减去尽可能多的较小数字的副本,直到较大的数字低于较小的数字。 (这与古希腊人知道的关于调用 anythpharesis 的过程有关)现代版本可能只是用较小的数字修改较大的数字,已知该数字在 O(log min{M, N}) 步(这是现代欧几里得算法)并在每一步上花费 O(1) 时间,假设数字表示为整数。

在这种情况下,我们知道会有 O(log min{M, N}) 个阶段,但每个阶段不会花费恒定的时间。使用anythpharesis 背后的几何直觉,可以构造成对的数字,其中每个单独的阶段需要很长时间才能终止,所以我知道的最好的界限是运行时间是 O(N + M)。

简而言之:与以对数时间运行的现代实现相比,此代码效率低下。很难在运行时获得一个好的上限,但实际上这并不重要,因为您可能只是重写代码以提高效率。 :-)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2022-12-05
    • 2016-11-05
    • 2018-12-12
    • 2012-08-14
    • 2016-08-02
    • 1970-01-01
    相关资源
    最近更新 更多