Java 无法通过密码查询测试时的性能

Java 无法通过密码查询测试时的性能,java,performance,Java,Performance,请检查代码并告诉我如何提高性能?这个性能问题让我对Codibility很生气。下面是问题和我的代码 谢谢你从现在起的帮助 测试: 询问描述 DNA序列可以表示为由字母A、C、G和T组成的字符串,这些字母对应于序列中连续核苷酸的类型。每个核苷酸都有一个影响因子,它是一个整数。A、C、G和T型核苷酸的影响因子分别为1、2、3和4。您将回答以下几个问题:给定DNA序列特定部分所含核苷酸的最小影响因子是什么 DNA序列以非空字符串S=S[0]S[1]…S[N-1]的形式给出,由N个字符组成。有M个查询,

请检查代码并告诉我如何提高性能?这个性能问题让我对Codibility很生气。下面是问题和我的代码

谢谢你从现在起的帮助

测试:

询问描述 DNA序列可以表示为由字母A、C、G和T组成的字符串,这些字母对应于序列中连续核苷酸的类型。每个核苷酸都有一个影响因子,它是一个整数。A、C、G和T型核苷酸的影响因子分别为1、2、3和4。您将回答以下几个问题:给定DNA序列特定部分所含核苷酸的最小影响因子是什么

DNA序列以非空字符串S=S[0]S[1]…S[N-1]的形式给出,由N个字符组成。有M个查询,它们在非空数组P和Q中给出,每个查询由M个整数组成。第K个查询为0≤ K

例如,考虑字符串s= cAgcTa和数组p,q,以便:

P[0] = 2    Q[0] = 4
P[1] = 5    Q[1] = 5
P[2] = 0    Q[2] = 6
P[0] = 2    Q[0] = 4
P[1] = 5    Q[1] = 5
P[2] = 0    Q[2] = 6
这些M=3问题的答案如下:

位置2和4之间的DNA部分含有两次核苷酸G和C,其影响因子分别为3和2,因此答案为2。 位置5和5之间的部分包含一个单核苷酸T,其影响因子为4,因此答案为4。 位置0和6之间的部分整个字符串包含所有核苷酸,特别是影响因子为1的核苷酸A,因此答案为1。 编写一个函数:

类解决方案{public int[]solutionString S,int[]p,int[]Q;}

给定一个由N个字符组成的非空字符串S和两个由M个整数组成的非空数组p和Q,返回一个由M个整数组成的数组,指定所有查询的连续答案

结果数组应作为整数数组返回

例如,给定字符串S=CAGCCTA和数组p,Q,以便:

P[0] = 2    Q[0] = 4
P[1] = 5    Q[1] = 5
P[2] = 0    Q[2] = 6
P[0] = 2    Q[0] = 4
P[1] = 5    Q[1] = 5
P[2] = 0    Q[2] = 6
函数应该返回值[2,4,1],如上所述

为以下假设编写有效的算法:

N是[1..100000]范围内的整数; M是[1..50000]范围内的整数; 数组P,Q的每个元素都是[0..N]范围内的整数− 1]; P[K]≤ Q[K],其中0≤ K 我的解决方案:

  public static int[] solution(String S, int[] firstArray, int[] secondArray) {
    String subStr="";
    int[] result = new int[firstArray.length];
    for(int i=0; i < firstArray.length; i++)  {
        subStr = S.substring(firstArray[i], secondArray[i] + 1);
        if(subStr.contains("A")) { result[i] = 1; }
        else if(subStr.contains("C")){ result[i] = 2; }
        else if(subStr.contains("G")){ result[i] = 3;
        } else if(subStr.contains("T")){ result[i] = 4;
        }
    }
返回结果;
}

您的解决方案非常复杂。 外环:forint i=0;i 为了提高性能,您的解决方案需要去掉内部循环。一种方法是将S转换成一种形式,我们可以直接访问相关值,而不是迭代,即构造subStr

将S转换为可直接访问的相关信息的一种方法是在序列中的每个位置存储4个核苷酸A/C/G/T的最后可观察位置

例如,如果S=CGGT,我们可以将其转换为-1表示尚未观察到:

Idx A, C, G, T  
0  [-1, 0,-1,-1]  
1  [-1, 0, 1,-1]  
2  [-1, 0, 2,-1]  
3  [-1, 0, 2, 3]
有了这个矩阵,我们现在可以直接访问它来获得相关的值。在这种情况下,如果我们试图获得subStr GG的相关值,即P[0]=1和Q[0]=2, 然后我们只需要访问索引2。在这种情况下,[-1,0,2,-1]告诉我们,只有G在指数1之后最后一次被观察到,因此,最小影响是G到其影响因子的映射

构建矩阵的过程非常复杂。通过P和Q进行迭代是非常复杂的。由于没有嵌套循环,因此总体复杂度为+M

下面是Python实现的一个片段:

def solution(S,P,Q):
    l = len(S)    
    lastSeen = [[-1,-1,-1,-1] for x in range(l)]
    for x in range(len(S)):
        for i,j in enumerate(list("ACGT")):
            if S[x] == j:
                lastSeen[x][i] = x
            elif x>0: 
                lastSeen[x][i] = lastSeen[x-1][i]

    res = []
    for x in range(len(P)):
        startIdx = P[x]
        relevantLastSeen = lastSeen[Q[x]]
        res.append((min([i+1 for i,x in enumerate(relevantLastSeen) if x>=startIdx])))

    return res