阶乘和谜,时间复杂度调查

时间:2018-08-06 09:55:43

标签: python python-3.x time-complexity asymptotic-complexity

您说foo函数的时间复杂度是什么(相对于n)?

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 

1 个答案:

答案 0 :(得分:2)

O(n log(n))

说明:

每个while循环都从111...1 == n/9n运行。这意味着while循环运行n*8/9次。 O(n * some_constant)== O(n)

在每次迭代中,总和超过i中的所有数字。 log10(n) - 1中有i个数字。 O(log10(n)-1)== O(log(n))

嵌套这两个使 O(n log(n))

请注意,以上说明并未考虑如果使用i == sum(...),循环可能会提前中断。这是因为sum(digit_factorial(int(x)) for x in str(i))的上限是9! * number_of_digits,当i大于7左右时,它总是小于number_of_digits