O(log(n)) 是这个函数的正确 Big O 表示法吗?
Is O(log(n)) the correct Big O notation for this function?
我编写了一个函数来确定给定数字是否为质数。我有以下代码
def prime(n):
if n == 1:
return n
elif n > 1:
for i in range(2, (1+floor(sqrt(n)))):
if n % i == 0:
return False
return True
我"calculated"大O表示法是O(log(n)),但我不确定它是否正确。
取模、floor、sqrt都是O(1)时间。 Python 中的大多数基本算术和数学运算的运行时间为 O(1)。
决定运行时间的最相关因素是循环(或嵌套循环)。
在这种情况下,你有
for i in range(sqrt(N))
这意味着您的程序将不得不执行循环内的所有内容 sqrt(N) 次。这将为您提供 O(sqrt(N)).
的运行时间
Modulo 不是 O(log(n))
,它只是标准整数除法的一部分,并且是 O(1)。您正在进行 sqrt(n)
次迭代,因此它是 O(sqrt(n))
。如果模实际上是 O(log(n) 你的结果将是 O(sqrt(n)log(n))
而不是 O(log(n))
因为它重复了 sqrt(n) 次。Floor 肯定是 O(1),sqrt 取决于实现,但我'我很确定它会是 python 中的 O(1)。
如果您有两个单独的循环:一个使用 O(sqrt(n))
,另一个使用 O(n^2)
,那么整个算法将是 O(n^2)
,因为 n^2
比 [=] 增长得快得多11=] 并且您将两者相加而不是相乘。当你在另一个循环中有一个循环时,你乘法,如果它们彼此跟随,你将它们相加,你不能丢弃乘法中增长较慢的部分。
我编写了一个函数来确定给定数字是否为质数。我有以下代码
def prime(n):
if n == 1:
return n
elif n > 1:
for i in range(2, (1+floor(sqrt(n)))):
if n % i == 0:
return False
return True
我"calculated"大O表示法是O(log(n)),但我不确定它是否正确。
取模、floor、sqrt都是O(1)时间。 Python 中的大多数基本算术和数学运算的运行时间为 O(1)。
决定运行时间的最相关因素是循环(或嵌套循环)。
在这种情况下,你有
for i in range(sqrt(N))
这意味着您的程序将不得不执行循环内的所有内容 sqrt(N) 次。这将为您提供 O(sqrt(N)).
的运行时间Modulo 不是 O(log(n))
,它只是标准整数除法的一部分,并且是 O(1)。您正在进行 sqrt(n)
次迭代,因此它是 O(sqrt(n))
。如果模实际上是 O(log(n) 你的结果将是 O(sqrt(n)log(n))
而不是 O(log(n))
因为它重复了 sqrt(n) 次。Floor 肯定是 O(1),sqrt 取决于实现,但我'我很确定它会是 python 中的 O(1)。
如果您有两个单独的循环:一个使用 O(sqrt(n))
,另一个使用 O(n^2)
,那么整个算法将是 O(n^2)
,因为 n^2
比 [=] 增长得快得多11=] 并且您将两者相加而不是相乘。当你在另一个循环中有一个循环时,你乘法,如果它们彼此跟随,你将它们相加,你不能丢弃乘法中增长较慢的部分。