当我准备介绍算法类期中考试时,我会通过教授发布的一些先前的测试,我发现了这个问题:
计算gcd(312,455)两种方法:通过查找每个数的分解,并使用Euclid的算法。每种方法的复杂性是什么?
他的回答是:
gcd(455,312) = gcd(312,143) = gcd(143,26) = gcd(26,13) = gcd(13,0) = 13
factors(312)= {2, 3, 13} factors(455)= {5, 7, 13}
复杂性:
log(n)
sqrt(n)
他是如何解决复杂问题的?
答案 0 :(得分:1)
要分析欧几里德GCD,你必须选择最坏的情况值:我个人发现斐波纳契对最适合这个问题。 E.g。
EGCD(121393, 75025) = 1; // With 24 iterations (or recursive calls).
看看这个“序列”:
对于斐波纳契对,我们注意到:
121393 % 75025 == 121393 - 75025 == 46368.
因此,有一个递减因子121393 / 46368 = **2.61** (more or less);
当然,最坏情况下的运行时间会使用小Oh表示法,因为最好的情况会使用Omega(1),换句话说就是恒定时间,例如,当红利为1000且除数为2时。 / p>
由于我们有一个递减因子,我们可以将递归关系放在如下:
您必须注意,此运行时间与EGCD算法的迭代版本完全相同。
答案 1 :(得分:0)
给定的复杂性是所需算术运算次数的粗略最坏情况界限:
欧几里德算法:对于a >= b
我们gcd(a,b) = gcd(b, a mod b)
min(b, a mod b) < a/2
,所以在最多两个简化步骤后,我们至少将第一个操作数减少{{1} }}。因此,减少步骤的数量受1/2
的基数a
的对数限制,对于某个常数sqrt(2)
为c * log(a)
。
分解:为了测试数字的素数或分解素数的平方,只需检查因子直到数字平方根。如果给定的数字具有较小的因子,那么我们需要更少的可除性测试。因此,所需分区的数量很容易受c
约束。由于sqrt(a)+sqrt(b)
和ld(a)
因素最多可以a
,因此获得gcd的剩余比较和乘法也受ld(a) < sqrt(a)
约束。