Algorithm 这个检查数字k是否可以表示为n^p的方法的时间复杂度是多少

Algorithm 这个检查数字k是否可以表示为n^p的方法的时间复杂度是多少,algorithm,time-complexity,Algorithm,Time Complexity,以下方法的时间复杂度?我将其计算为log(n)*log(n)=log(n) public int isPower(int A) { if (A == 1) return 1; for (int i = (int)Math.sqrt(A); i > 1; i--){ int p = A; while (p % i == 0) { p = p / i; } if (p

以下方法的时间复杂度?我将其计算为log(n)*log(n)=log(n)

public int isPower(int A) {
    if (A == 1) 
        return 1;

    for (int i = (int)Math.sqrt(A); i > 1; i--){
        int p = A;

        while (p % i == 0) {
            p = p / i;
        }

        if (p == 1) 
            return 1;
    }

    return 0;
}
最坏情况复杂性:

for(…)
运行
sqrt(A)

然后,
while(…)
依赖于
A=p_1^e1*p_2^e_2*.*p_n^e_n
,所以它是
Max(e_1,e_2,…,e_n)
最坏情况,或者大致
Max(log_p_1(A),log_p_2(A),…)

最多
,而(…)
将大致执行
log(A)

因此,总体粗略最坏情况复杂度=
sqrt(A)*log(A)
不考虑常数因子

最糟糕的情况是,数字
A
是不同整数的乘积,即
A=n_1^e_1*n_2^e_2*。

平均案例复杂度:

在给定范围内,如果随机选择一个数字,则更可能是不同整数的乘积,即a=n_1^e_1*n_2^e_2..。因此,平均情况复杂度与最坏情况复杂度大致相同,即
sqrt(A)*log(A)

最佳案例复杂性:

当数字
A
实际上是一个整数/素数的幂时,即
A=n^e
时,情况最复杂。那么这种情况下的算法所需的时间就更少了。我把它作为计算最佳案例复杂性的练习

另一种理解方法是,检查一个数字是否为素数/整数的幂,必须有效地将该数字分解为素数分解(这是在该算法中完成的),这实际上具有相同的复杂性(例如,请参见)


所以应该像cs.stackexchange一样支持mathjax:p

您可以从
sqrt(A)迭代到2
。然后你试着去分解。对于素数,您的代码迭代sqrt(A)次。这是最好的例子。如果数字为2^30,则执行您的代码 sqrt(2^30)*30表示sqrt(n)*对数(n)次


因此,您的代码复杂性:
sqrt(n)*log(n)

您想要k=n*p或k=n^p?@GolamMazidsajib好的捕获。