该程序的复杂性是什么?是O(n)吗?

时间:2019-03-31 20:55:52

标签: time-complexity

这是一个简单的程序,我想知道该程序的复杂性。我认为这是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)   

2 个答案:

答案 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),但是由于ilog(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