这是一个简单的程序,我想知道该程序的复杂性。我认为这是O(n),因为它在for循环中只有一个操作。
a = int(input("Enter a:"))
b = int(input("Enter b:"))
sol = a
for i in range(a,b):
sol = sol & i+1
print("\nSol",sol)
答案 0 :(得分:2)
是的,它是O(n)。您必须记住,O(n)表示操作数随输入大小而增长。也许您担心for循环中的&和(i + 1)操作。您需要记住的是,这些操作是恒定的,因为它们都是在32位整数上执行的。因此,唯一改变程序运行时间的参数是for循环的实际迭代次数。
如果假设n = b-a,则该程序为O(n)。实际上,如果您细分了实际运行时:
每个循环:1个AND运算,1个加法运算 现在执行(b-a)迭代,因此每个循环2次操作,(b-a)次= 2 *(b-a) 如果我们假设n = b-a,那么运行时间将变为2 * n,即O(n)。
答案 1 :(得分:0)
我假设您定义了n := b - a
。复杂度实际上是n log(n)
。循环中只有1个操作,因此复杂度为n * Time(operation in loop)
,但是由于i
由log(n)
位组成,因此复杂度为O(n log(n))
编辑:
我现在考虑n := b
。它不会影响我的原始答案,并且更有意义,因为它是输入的大小。 (对于一些n=1
来说,a,a+1
毫无意义)
为提高效率,请注意您计算了(a)&(a+1)&(a+2)&..&(b)
。
因此,我们只需要在0
的二进制表示中设置1
而不是b
的所有位置中,一些0
的表示形式。我们如何知道是否将数字设置为a <= k < b
?我留给你:)
可以在0
时间内完成log(n)
的二进制表示形式的大小。
因此,在这种情况下,我们知道时间是b