Algorithm 可编码公共素数时间复杂度?

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=

关于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=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)
算法存在吗?我不相信它存在。