java - 检查一个数字是否是两个数字的幂的函数的时间复杂度

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

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

最佳答案

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

关于java - 检查一个数字是否是两个数字的幂的函数的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57024841/

相关文章:

java - 语句执行的次数(以 n 为单位)

java - 是否可以在 Java 中使用 Mockito 来模拟语句?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 将 2 个或更多 edittexts 更改为 textview android

algorithm - 有没有一种通用的方法来计算带步骤的for循环的渐近时间复杂度?

java - 我如何使用 Big-O 表示法确定复杂性

java - 在 Windows 上创建的 jar 无法在 Linux 上运行

algorithm - 解决不容易以 MT 形式表示的递归关系

java - 求某些条件下归并排序的时间复杂度

performance - Big O 无缓冲区链表去重速度