函数的时间复杂度,该函数检查一个数字是否为两个数字的幂

时间:2019-07-14 05:26:57

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

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

eq

其中A> 0和P>1。我认为此解决方案的复杂度为O({complexity

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

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;
}

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

2 个答案:

答案 0 :(得分:2)

感谢纠正解决方案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))。我认为这是最有效的解决方案。

答案 1 :(得分:0)

更好的解决方案是对素数进行因式分解,然后查看质数的幂是否具有不等于1的GCD。 如果您不懂我写的内容,可以用代码更好地解释。