Python麻省理工学院讲座:示例的日志(n)复杂性
这是麻省理工学院python编程课程第8课的一段代码Python麻省理工学院讲座:示例的日志(n)复杂性,python,big-o,Python,Big O,这是麻省理工学院python编程课程第8课的一段代码 def(x): assert type(x) == int and x >= 0 answer = 0 s = str(x) for c in s : answer += int(c) return answer 正如教授所说,这段代码的复杂度是(x)的10倍。 他解释说(正如我所能理解的),每次循环迭代,C可以是十位数字(0-9)中的一位,这将基数10变成对数算术 然而我不
def(x):
assert type(x) == int and x >= 0
answer = 0
s = str(x)
for c in s :
answer += int(c)
return answer
正如教授所说,这段代码的复杂度是(x)的10倍。
他解释说(正如我所能理解的),每次循环迭代,C可以是十位数字(0-9)中的一位,这将基数10变成对数算术
然而我不明白,为什么会这样?原因复杂性实际上取决于列表S的长度,而不是C选择的变化
有人能解释一下吗 花费的时间取决于
x
中作为十进制数的位数。正十进制数x
中的位数为floor(log10(x))+1
(很好地解释了这一点的原因):
因此,正如教授所说,时间复杂度为log10。换句话说,随着x
的增加,我们需要处理的位数随着log10(x)
的增加而增加
他解释说(正如我所能理解的),每次循环迭代,C可以是十位数字(0-9)中的一位,这将基数10变成对数算术
这不是原因。可以采用哪些值
c
并不重要。重要的是它需要多少值——答案是:x
中的每个数字需要一个值。并且x
有O(log10x)个十进制数字。这就是数字表示法的工作原理:在任何基数b中,任何数字n的表示都有logbn+1位。实际上,您已经回答了您的问题:
复杂性实际上取决于列表S的长度,而不是C选择的变化
列表S
的长度是数字x
中的位数。一个数字的位数是其日志的底部加上一
Range of numbers Range of log (base 10) value Number of digits
1 - 9 [0, 1) 1
10 - 99 [1, 2) 2
100 - 999 [2, 3) 3
1000 - 9999 [3, 4) 4
10000 - 99999 [4, 5) 5
所以,不管数字是什么,这里唯一重要的是它的位数,这个数字等于floor(log10(x))+1
这可以推广到任何数字基:整数x
的b
-基表示中的数字n
等于b
-基日志x
加1
的下限值
例如,二进制数中的位数为
Decimal range Binary range Range of log (base 2) value Number of bits
1 1 [0, 1) 1
2 - 3 10 - 11 [1, 2) 2
4 - 7 100 - 111 [2, 3) 3
8 - 15 1000 - 1111 [3, 4) 4
16 - 31 10000 - 11111 [4, 5) 5
谢谢您的详细解释!谢谢,我会记住这是一条公理。
Decimal range Binary range Range of log (base 2) value Number of bits
1 1 [0, 1) 1
2 - 3 10 - 11 [1, 2) 2
4 - 7 100 - 111 [2, 3) 3
8 - 15 1000 - 1111 [3, 4) 4
16 - 31 10000 - 11111 [4, 5) 5