【问题标题】:Time complexity of a function which check if a number is power of two numbers检查一个数字是否是两个数字的幂的函数的时间复杂度
【发布时间】:2019-07-14 05:26:57
【问题描述】:

我写了一个解决方案来检查一个数字(N)是否可以表示为

其中 A > 0 和 P > 1。我认为这个解决方案的复杂度是 O()

但我不确定日志的基础,也没有数学解释,我只是了解循环的工作原理,帮助我得出结论。

public int isPower(int A) {
    for (int i = 2; i <= Math.sqrt(A); i++) {
        for (int j = 2; j <= (Math.log(A) / Math.log(i)); j++) {
            if ((int)Math.pow(i, j) == A)
                return 1;
        }
    }
    return (A == 1) ? 1: 0;
}

我正在准备面试,任何解决方案都将不胜感激,并将帮助我更好地准备。另外,如果您认为这个问题可以比我的算法更快地完成,请告诉我。

【问题讨论】:

  • @AshvinSharma 有什么问题?
  • 检查问题的前两行。

标签: java time-complexity big-o complexity-theory


【解决方案1】:

感谢您更正解决方案 Ashwin。

您不需要再次完全迭代第二个循环,并且只能进行一次值检查。示例代码将如下所示。

public int isPower(int a) {
        if (a == 1) {
            return 1;
        }
        for (long i = 2; i * i <= a; i++) {
            final double value = Math.log(a) / Math.log(i);
            if (value - (int) value < 0.00000001) {
                return 1;
            }
        }
        return 0;
    }

这个解的复杂度 O(sqrt(n))。我认为这是最有效的解决方案。

【讨论】:

  • 感谢您的解决方案。您能否确认它是否适用于Integer.MAX_VALUE
  • 更新:它确实在工作,但在我的机器上花了 92554 毫秒 vs 14 毫秒(我的算法)。
  • 另外,最好将变量“i”更改为 long 以避免溢出。我已经更新了答案,你可以再试一次吗?
  • 是的,早就成功了,现在它肯定比我的快:) 谢谢
【解决方案2】:

更好的解决方案是将数字分解为素数,然后查看素数的幂是否具有不等于 1 的 GCD。 如果你不明白我写的内容,我可以用代码更好地解释。

【讨论】:

  • 使用 GCD 它将是 O(log(n)),但是我如何使用 gcd 检查功率?如果你能写一个程序,那就更容易理解了。 :)
  • 您只需为每个质数创建一个新变量,然后查看它们重复了多少次
猜你喜欢
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2010-10-10
  • 2019-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多