这段重复减去值的代码的复杂性是啥?
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)。
简而言之:与以对数时间运行的现代实现相比,此代码效率低下。很难在运行时获得一个好的上限,但实际上这并不重要,因为您可能只是重写代码以提高效率。 :-)
希望这会有所帮助!
【讨论】:
以上是关于这段重复减去值的代码的复杂性是啥?的主要内容,如果未能解决你的问题,请参考以下文章