Algorithm 可编码公共素数时间复杂度?
关于Codibility中的任务,我有几个时间复杂性问题。问题如下: 素数是一个正整数X,它正好有两个不同的 除数:1和X。前几个素整数是2,3,5,7,11和 十三, 素数D称为正整数p的素数因子,如果存在 存在一个正整数K,使得D*K=P。例如,2和5 是20的素因子 给你两个正整数N和M。目的是检查 整数N和M的素因子集是否完全相同 一样 例如,假设:Algorithm 可编码公共素数时间复杂度?,algorithm,primes,prime-factoring,Algorithm,Primes,Prime Factoring,关于Codibility中的任务,我有几个时间复杂性问题。问题如下: 素数是一个正整数X,它正好有两个不同的 除数:1和X。前几个素整数是2,3,5,7,11和 十三, 素数D称为正整数p的素数因子,如果存在 存在一个正整数K,使得D*K=P。例如,2和5 是20的素因子 给你两个正整数N和M。目的是检查 整数N和M的素因子集是否完全相同 一样 例如,假设: A[0] = 15 B[0] = 75 A[1] = 10 B[1] = 30 A[2] = 3 B[2] = 5 N=
A[0] = 15 B[0] = 75
A[1] = 10 B[1] = 30
A[2] = 3 B[2] = 5
- N=15,M=75,素因子是相同的:{3,5}李>
- N=10,M=30,素因子不一样:{2,5}不等于{2,3,5}李>
- N=9和M=5,素数因子不一样:{3}不是 等于{5}
class Solution { public int solution(int[] A, int[] B); }
给定Z整数的两个非空数组A和B,返回
A[K]和B[K]的素因子所对应的位置K的个数
它们完全一样
例如,假设:
A[0] = 15 B[0] = 75
A[1] = 10 B[1] = 30
A[2] = 3 B[2] = 5
函数应该返回1,因为只有一对(15,75)具有相同的素因子集
为以下假设编写有效的算法:
- Z是[1..6000]范围内的整数;数组的每个元素
- B是[1..2147483647]范围内的整数
class Solution {
public int solution(int A[], int B[]) {
int result = 0;
for (int i = 0; i < A.length; i++){
int gcdOfAAndB = gcd(A[i], B[i]);
if (
factorsOfRemainderAreTheSameOfGCD(A[i], gcdOfAAndB) &&
factorsOfRemainderAreTheSameOfGCD(B[i], gcdOfAAndB)
) {
result++;
}
}
return result;
}
public boolean factorsOfRemainderAreTheSameOfGCD(int input, int gcdOfAAndB) {
int factorsNotInGCD = input / gcdOfAAndB;
while (gcdOfAAndB % factorsNotInGCD != 0){
int gcd = gcd(gcdOfAAndB, factorsNotInGCD);
if (gcd == 1)
return false;
factorsNotInGCD /= gcd;
}
return true;
}
public int gcd(int a, int b) {
if (a % b == 0){
return b;
}
return gcd(b, a % b);
}
}
类解决方案{
公共整数解决方案(整数A[],整数B[]{
int结果=0;
for(int i=0;i
我假设算法的时间复杂度为:
O(Z*(log(log(M+N)+N)*log(N)+log(log(M+N)+M)*log(M))
,因为:
- while循环中的GCD以
的方式执行李>log(log(M+N)+输入)
- while循环本身显然有一个对数增长率:factorsNotInGCD在每次迭代中至少减半李>
- 因此,我得出结论,它们组合表示
李>log(log(M+N)+input)*log(input)
- 由于while循环执行了两次,一次用于N和M,我们将它们相加,得到
(log(log(log(M+N)+N)*log(N)+log(log(M+N)+M)*log(M)
- 最后,Z表示要测试的N和M的数量
我的问题是:
- 我对算法时间复杂度的假设正确吗?如果不正确,正确的时间复杂度是多少
- Codibility说它检测到的时间复杂度是
,我想知道如何实现这一点O(Z*log(max(A)+max(B))**2)
事先非常感谢我相信您的分析是正确的。在我看来,Codibility只是根据测量值进行估算。他们测量的值范围不够广,无法提取对数因子。@B非常感谢您的回答,您是否认为即使这可能是一个估算值,这样的
(Z*log(最大值(A)+最大值(B))**2)
算法存在?我不相信它存在。我相信你的分析是正确的。在我看来,Codibility只是根据测量值进行估计。它们测量的值范围不够广,无法提取对数因子。@b非常感谢你的回答,即使这可能是一个估计值,你相信吗,这样的O(Z*log(max(A)+max(B))**2)
算法存在吗?我不相信它存在。