【问题标题】:Why is this solution to Reverse Integer (Leet Code) O((log10(n))?为什么这个解决方案是反向整数(Leet Code)O((log10(n))?
【发布时间】:2020-05-08 03:46:38
【问题描述】:

有问题的problem 要求反转一个 32 位有符号整数。这是Java中给定的解决方案:

    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
}

​根据解的解释,它的时间复杂度是O(log10(n)),因为x中大约有log10(x)个数字。直观地说,while 循环似乎有 n-1 次迭代,其中 n 是位数。 (即:7 位数字需要 6 次迭代)但是,解决方案和给定的复杂性意味着 n 是整数本身而不是位数。谁能帮助我直观地理解为什么上述解决方案是 log10(n) ?

【问题讨论】:

  • 仅供参考,大 O 对日志不敏感。 O(log10(n)) = O(log(n)/log(10)) = O(log(n))。不过与您的问题完全无关

标签: java big-o logarithm


【解决方案1】:

如果 x 是整数,则 floor(log10(x)) + 1 等于 x 中的位数。

让 log(10)x = 某个数字 y。那么 10^y = x.
例如,

log(10) 10 = 1   
log(10) 100 = 2  
log(10) 1000 = 3 
...

当 x 不是 10 的完美幂时:

floor( log(213) ) = 2

如果这不能回答您的问题,请告诉我。

【讨论】:

  • 对于“O(log10(n))”与“O(log10(n) - 1)”,随着“n”变大,“-1”项变得无关紧要。跨度>
  • @Ella 同意。除了 10 的完美积分幂之外的例子会让你的解释更清楚。例如,floor( log(213) ) = 2
【解决方案2】:
Let's say the x = 123.

int rev = 0;

rev = rev * 10 + x % 10; // rev = 3,   1st iteration.

x = x/10;              // x = 12

rev = rev * 10 + x % 10;  // rev = 3 * 10 + 2 = 32,  2nd iteration

x = x/10;              // x = 1

rev = rev * 10 + x % 10;  // rev = 32 * 10 + 1 = 321, 3rd iteration.

x = 0 so the  loop terminates after 3 iterations for 3 digits.

循环中的条件检查以查看反转的值是否会超过 32 位数字可以容纳的值。

所以它是log10(n) 正是因为您在问题中陈述的原因。数字n 到给定基数的日志是将base 提升回数字n 所需的exponent。并且指数是数字中number of digits 的近似值。

根据您的评论,也可以说“对于任何数字n,其中mnumber of digits in n,时间复杂度是O(m)。”

【讨论】:

  • 如果迭代次数与位数直接相关,为什么我们不能直接说它是 O(n),其中 n 是位数而不是数字本身?跨度>
  • 你可以。但是大 O 符号是用数字表示的,而不是位数。因此,要获得位数,您需要获取数字的 Log。
【解决方案3】:

给定的反向算法在最坏的情况下需要 log_10(x) 次迭代。换句话说,如果给定的输入 x 由 k 个十进制数字组成,则它需要 k 次迭代。但是说这个算法是 O(log_10(x)) 是有误导性的。这不是对数算法。如果输入大小不直观(例如,测试给定整数是否为素数),我们需要严格应用输入大小的正确定义。在大 O 分析中,输入大小定义为写入输入所需的字符数。由于我们通常将整数编码为二进制数字,因此该算法的输入大小 n 约为 log_2 x。因此,x 大约为 2^n。最坏情况复杂度 W(x) = log_10 (x) = log_10(2^n) = n log_10(2)。所以逆向算法的大O是O(n)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多