代码之家  ›  专栏  ›  技术社区  ›  cglacet

阶乘数字和谜,时间复杂性调查

  •  1
  • cglacet  · 技术社区  · 8 年前

    你认为时间复杂度如何? 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 回复  |  直到 8 年前
        1
  •  2
  •   Ben Jones Tim Goetz    8 年前

    O(n对数(n))

    说明:

    while 循环从 111...1 == n/9 n . 这意味着while循环运行 n*8/9 时代。O(n*某个常数)== O(n) .

    在每次迭代中,总和在 i . 有 log10(n) - 1 数字输入 . O(对数10(n)-1)== O(对数(n)) .

    把这两个做窝 O(n对数(n)) .

    注意,上面的解释没有考虑到如果 i == sum(...) . 那是因为 sum(digit_factorial(int(x)) for x in str(i)) 9! * number_of_digits 它总是小于 什么时候 number_of_digits 大于7左右。