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