【问题标题】:How to Understand Time Complexity of Happy Number Problem Solution from Leetcode如何从 Leetcode 中理解快乐数问题解决方案的时间复杂度
【发布时间】:2019-11-21 14:49:20
【问题描述】:

我在理解 Leet 代码中快乐数字问题的一种解决方案的时间复杂度分析时遇到了一些困难,对于我对复杂度分析的疑问,我用粗体标记了它们,非常感谢您的建议

问题来了:

链接:https://leetcode.com/problems/happy-number/

问题:

编写一个算法来确定一个数字是否“快乐”。 快乐数字是由以下过程定义的数字:从任何正整数开始,将数字替换为其数字的平方和,然后重复该过程直到数字等于 1(它将保持不变),或者循环在一个不包括 1 的循环中无限循环。这个过程以 1 结束的那些数字是快乐数字。

例子:

输入:19

输出:真

解释:

1^2(1 的平方) + 9^2 = 82

8^2 + 2^2 = 68

6^2 + 8^2 = 100

1^2 + 0^2 + 0^2 = 1

代码如下:

class Solution(object):
    def isHappy(self, n):
        #getnext function will compute the sum of square of each digit of n
        def getnext(n):
            totalsum = 0
            while n>0:
                n,v = divmod(n,10)
                totalsum+=v**2
            return totalsum
        #we declare seen as a set to track the number we already visited
        seen = set()
        #we stop checking if: either the number reaches one or the number was visited #already(ex.a cycle)
        while n!=1 and (n not in seen):
            seen.add(n)
            n = getnext(n)
        return n==1

注意:如果我需要解释代码的工作原理,请随时告诉我

时间复杂度分析:

时间复杂度:O(243 * 3 + logN + loglogN + log loglog N)...=O(logN)。

查找给定数字的下一个值的成本为 O(log n),因为我们正在处理数字中的每个数字,而数字中的数字位数由 logN 给出。 我的疑问:为什么数字中的位数是由 logN 给出的?这里的 N 是什么?特定数字的值还是其他什么?

要计算总时间复杂度,我们需要仔细考虑链中有多少数字,以及它们有多大。

我们在上面确定了一个数字一旦低于 243,它就不可能回升到 243 以上。因此,根据我们非常肤浅的分析,我们可以肯定,一旦一个数字低于 243,它是不可能的它需要超过另外 243 个步骤才能终止。

每个数字最多有 3 位数字。稍加分析,我们可以将 243 替换为 243 以下的最长数链的长度,但是因为常数无关紧要,所以我们不必担心。 我的疑惑:我认为上面这段与243*3的时间复杂度分量有关,但我不明白为什么我们将243乘以3

对于大于 243 的 n,我们需要考虑链中大于 243 的每个数字的成本。通过一点数学,我们可以证明在最坏的情况下,这些成本将是 O(log n) + O(log log n) + O(log log log N)... 幸运的是,O(logN) 是主要部分,而其他部分相比之下都很小(总的来说,它们加起来小于 logN) ,所以我们可以忽略它们。 我的疑问:对于大于 243 的 n,O(log log n) O(log log log N) 背后的原因是什么?

【问题讨论】:

    标签: time-complexity


    【解决方案1】:

    嗯,我对第一个疑问的猜测是,以 10 为底的数字的位数由它的值 (N) 给出,取以 10 为底的对数,四舍五入。例如,1023 将有 floor(log10(1023)) 数字,即 3。所以是的,N 是数字的值。时间复杂度中的log 表示对数,而不是以 2 为底或以 e 为底的对数。

    至于第二个疑问,它可能与将数字减少到 243 以下所需的工作有关,但我不确定。一旦我解决了这个问题,我会编辑这个答案。

    【讨论】:

      【解决方案2】:

      假设NM 数字。比getnext(N) <= 81*M。当N 只有9 时,就会发生相等性。

      • N < 1000,即最多3位时,getnext(N) <= 3*81 = 243。现在,您最多只能拨打getnext(.)O(243) 来确定@​​987654330@ 是否真的很开心。

      • 如果M > 3,则getnext(N)的位数必须小于M。试试getnext(9999)getnext(99999) 等等 [1]。

      注意事项:

      [1] 给N加一个数字最多可以变成10*N + 9,即在末尾加一个9。但位数仅增加到M+1。这是NM 之间的对数关系。因此,N81*M 之间存在相同的关系。

      【讨论】:

      • 解释适用于兔子和乌龟算法,而不是在这里。
      • @PiyushBag,为什么不在这里?
      猜你喜欢
      • 1970-01-01
      • 2023-02-21
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多