我知道大O表示法衡量一个函数的效率,但我真的不知道如何计算它。
def method(n)
sum = 0
for i in range(85)
sum += i * n
return sum
答案是否为O(f(85))?
答案 0 :(得分:4)
此功能的复杂性为O(1)
RAM模型中的基本数学函数在恒定时间内发生。该函数中的主要术语是
for i in range(85):
因为85是常数,所以复杂性由O(1)
表示答案 1 :(得分:3)
你有4个“动作”的功能,计算它的大O我们需要为每个动作计算大O并选择max:
所以,只要lenI和lenN是常数(通常为32或64位),max(lenI,lenN) - >,可能的最大O是#2,即1 * O(#3)。 32/64,因此您的函数的总复杂度为 O(1 * 1)= O(1)
如果我们有很大的数学,即N的位长可以非常长,那么我们可以说 O(位长N)
注意:位长N实际上是 log2(N)
答案 2 :(得分:1)
理论上,复杂度为O(log n)。随着n
的增长,读取数字和执行乘法需要更长的时间。
然而,实际上,n
的值受到约束(存在最大值),因此可以在O(1)时间内读取它并对其执行操作。由于我们以固定的次数重复O(1)运算,因此复杂度仍为O(1)。
注意O(1)表示恒定时间 - O(85)并不意味着任何不同。如果在序列中执行多个常量时间操作,则结果仍为O(1),除非序列的长度取决于输入的大小。执行O(1)操作1000次仍然是O(1)
,但执行n
次O(n)
。
如果你想真正安全地玩,只要说O(∞)
,这绝对是一个正确的答案。 CS老师在实践中往往不太欣赏它。
答案 3 :(得分:0)
在谈论复杂性时,总应该说什么操作应该被视为恒定时间(初始协议)。这里可以考虑整数乘法或不变。无论如何,该示例的时间复杂度优于O(n)。但这是老师对学生的伎俩 - 有点儿。 :)