这段重复减去值的代码的复杂性是啥?

Posted

技术标签:

【中文标题】这段重复减去值的代码的复杂性是啥?【英文标题】: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 你会得到一个无限循环。 对不起,我更正了 【参考方案1】:

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

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

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

希望这会有所帮助!

【讨论】:

以上是关于这段重复减去值的代码的复杂性是啥?的主要内容,如果未能解决你的问题,请参考以下文章

这段代码的时间复杂度是多少(来自 leetcode)?

C ++和Java中的字符串连接复杂性[重复]

这段简单的代码有多复杂?

O(n)是啥

以下算法在未排序数组中找到最小值的复杂性

如何确定这段代码的时间复杂度?