Python 阶乘数字和之谜,时间复杂性调查
您认为Python 阶乘数字和之谜,时间复杂性调查,python,python-3.x,time-complexity,asymptotic-complexity,Python,Python 3.x,Time Complexity,Asymptotic Complexity,您认为foo函数的时间复杂度是多少(相对于n) digital\u FACTORIAL=[1] 对于范围(1,10)内的x: 数字因数附加(数字因数[x-1]*x) def数字_阶乘(x): 返回数字\u阶乘[x] def foo(位数): n=10**位数 i=n//9 而我str(i)和i
foo
函数的时间复杂度是多少(相对于n
)
digital\u FACTORIAL=[1]
对于范围(1,10)内的x:
数字因数附加(数字因数[x-1]*x)
def数字_阶乘(x):
返回数字\u阶乘[x]
def foo(位数):
n=10**位数
i=n//9
而我str(i)和i
O(n日志(n))
说明:
每个while
循环从111…1==n/9
运行到n
。这意味着while循环运行n*8/9次。O(n*some_常量)==O(n)
在每次迭代中,总和覆盖i
中的所有数字。在i
中有log10(n)-1
位。O(log10(n)-1)=O(log(n))
将这两个元素嵌套在一起会生成O(n log(n))
注意,上面的解释没有考虑到如果i==sum(…)
,循环可能提前中断。这是因为str(i)中x的sum(digital_factorial(int(x))的上界是9!*当位数
大于7左右时,位数总是小于i
。交叉过账:。请每个社区都应该有一个诚实的回答,而不浪费任何人的时间。做跨社区帖子的正确方法是什么?(因此,两个社区都有机会回答这个问题)。正确的方法是避免跨社区发帖;网站软件不是为此而设计的。相反,你应该选择一个最适合你的问题的网站。请参阅我提供的链接。如果你有两个不同的问题需要从两个不同的角度回答,你可以在不同的网站上发布每一个问题(但仅仅是回答同一个问题,然后稍微重写它可能不是目的)。我实际上错过了这个I=n/9
,很好的回答。谢谢你的回答,没问题!n/9
只是一个很好的数字技巧,可以让解释更简单一些。重要的是认识到n
和i(开始)
之间的距离呈线性增长。另一种方法是注意i=111..1
的范围是110..0==1.1*n/10
和120..0==1.2*n/10
。
DIGIT_FACTORIAL = [1]
for x in range(1, 10):
DIGIT_FACTORIAL.append(DIGIT_FACTORIAL[x-1]*x)
def digit_factorial(x):
return DIGIT_FACTORIAL[x]
def foo(number_of_digits):
n = 10**number_of_digits
i = n//9
while i != sum(digit_factorial(int(x)) for x in str(i)) and i < n:
i += 1
if i < n:
return i
return None