我是渐近符号的新手,这是算法。对于时间复杂性最坏的情况是什么?为什么?
F(A,B) { //A and B are positive
while A>0
print(A mod B)
A=A div B
}
答案 0 :(得分:0)
时间的复杂性:
F(A,B) { //A and B are positive
while A>0
A=A/B
}
等于循环执行的次数,让我们调用l
并且等于B必须将A除以多少次以使“A> 0”为假。
从question开始,我们知道:
Knuth的书“计算机程序设计的艺术”(第2卷)4.3.1中的算法D在O(m)步骤中执行任何长除法,其中
m
是A的位数,所以我们有一个上限。
因此,时间复杂度为:* O(l * m)*
现在这个:
print(A mod B)
假设IO是常量(这当然在real-wolrd中是不正确的),你需要模数本身的复杂性,来自this,我们知道它是:
O(log A log B)
并将运行l
次。
因此,我们有:
O(l *(m + log A log B))
答案 1 :(得分:0)
这不是一个很好的问题。首先,如果B是单位,算法永远不会完成。据推测B必须是2或更大。所以我们有O(log A)步骤。但现在的问题是该部门本身是否是一个“运作”。如果A和B是无界的,那么它本身也必须是对数的。但通常代码将在一个处理器上运行,该处理器实现32位或64位的所有分区,并且它不能将数字除以范围。所以我们通常说分歧是“操作”。
如果我们说除法是对数而B是小的那么我们就是O(log A)^ 2。