【发布时间】: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