【发布时间】:2020-10-13 01:26:28
【问题描述】:
在没有素数的情况下计算 LCM 的最差时间复杂度是多少? 我的 C++ 算法:
int a, b, a2, b2;
cin >> a;
cin >> b;
a2 = a;
b2 = b;
while(a!=b) {
if(a>b) b+=b2;
if(b>a) a+=a2;
}
cout << a << " X " << b << endl;
【问题讨论】:
在没有素数的情况下计算 LCM 的最差时间复杂度是多少? 我的 C++ 算法:
int a, b, a2, b2;
cin >> a;
cin >> b;
a2 = a;
b2 = b;
while(a!=b) {
if(a>b) b+=b2;
if(b>a) a+=a2;
}
cout << a << " X " << b << endl;
【问题讨论】:
在最坏的情况下,您的 LCM 可能是a*b。
因此,在这种最坏的情况下,在 while 循环中计算 LCM 的过程中,将 a 增加到 LCM 的步数是 (a*b - a)/a = b-1 并且将 b 增加到 LCM 的步数是 @ 987654326@ = a-1
所以你的时间复杂度将是O(max(a,b))
【讨论】:
LCM(a,b) 是 a*b/GCD(a,b)
GCD(a,b) 可以用 Euclid's algorithm 或 the binary GCD algorithm 在 O(log(a+b)) 时间内计算出来,
【讨论】: