Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 链表优化_Java_Optimization_Linked List - Fatal编程技术网

Java 链表优化

Java 链表优化,java,optimization,linked-list,Java,Optimization,Linked List,我正在研究这个模拟限制性内切酶和DNA剪接的程序。我使用DnaSequenceNode[s]作为链表节点 我的代码中的一个函数有一个问题,cutSplice()应该创建一个新的DnaStrand,它是当前DnaStrand的克隆,但是每个酶实例都被Splice替换 例如,如果LinkedDnaStrand被实例化为“TTGATCC”,并且 调用cutSplice(“GAT”、“TTAAGG”),则链表应类似于(前面的指针未显示): 第一个->“TT”->“TTAAGG”->“CC”->空 我的功

我正在研究这个模拟限制性内切酶和DNA剪接的程序。我使用DnaSequenceNode[s]作为链表节点

我的代码中的一个函数有一个问题,cutSplice()应该创建一个新的DnaStrand,它是当前DnaStrand的克隆,但是每个酶实例都被Splice替换

例如,如果LinkedDnaStrand被实例化为“TTGATCC”,并且 调用cutSplice(“GAT”、“TTAAGG”),则链表应类似于(前面的指针未显示):

第一个->“TT”->“TTAAGG”->“CC”->空

我的功能正常。但是,我的方法cutSplice()拼接200个DNA需要80多秒。我应该把80秒改成2秒

这是我的课程代码:

下面是cutSplice()方法的代码

公共DNA和剪切拼接(字符串酶,字符串拼接){
DnaStrand newStrand=null;
String original_Dna=this.toString();
字符串new_Dna=原始_Dna.replaceAll(酶,剪接);
String[]剪接\u split=new\u Dna.split(剪接);//拆分新的Dna字符串DnaStrand
newStrand=null;
int i=0;
if(原始Dna.起始于(酶)){
newStrand=新链接的NAstrand(拼接);
}否则{
newStrand=newlinkeddnastrand(拼接分割[0]);
newStrand.append(拼接);
}
对于(i=1;i
是否有人看到任何可能对该函数处理200个DNA样本所需的时间产生重大影响的东西?

当然,使用string方法是很舒服的,但是在转换为string、返回到sequence以及(如前面的注释中所指出的)使用基于regex的string函数时,您正在浪费时间

直接操作链表肯定会花费更少的时间,尽管这需要您自己实现替换算法:

@覆盖
公共LinkedNastrand剪切拼接(字符串酶,字符串拼接)
{
LinkedNastrand strand=新LinkedNastrand();
DnaSequenceNode end=null;
DnaSequenceNode开始=顶部;
int pos=0;
脱氧核糖核酸序列tmpStart,tmpEnd;
对于(DnaSequenceNode current=top;current!=null;current=current.next)
{
如果(当前值!=酶特征(位置))
{
tmpStart=tmpEnd=newDNasequencenode(begin.value);
对于(DnaSequenceNode n=begin.next;n!=current.next;n=n.next)
{
DnaSequenceNode c=新的DnaSequenceNode(n.值);
tmpEnd.next=c;
c、 上一个=tPend;
tmpEnd=c;
}
}
else如果(++pos==enzyme.length())
{
tmpStart=tmpEnd=新的DNA序列(拼接字符(0));
对于(int i=1;i
我并不是说没有任何进一步优化的机会,但这应该比原始版本快得多。我用你给出的例子成功地测试了它,如果你还发现了一个bug,你可以自己修复它

注1:我确实明确地从字符串创建了一个新序列(而不是使用构造函数),以获得序列的结尾,而无需再次迭代


注2:我假设存在一个构造函数
DnaSequenceNode(char值)
,并且DnaSequenceNode有一个成员
public char值
。如果这些假设中的任何一个失败,您可能必须适当地调整代码。

也许您应该提供一个工作测试。我们可以使用您正在使用的任何数据输入运行它,这导致了80秒的运行时间。首先:为什么您要自己实现一个链表,然后使用字符串。这对我来说没有任何意义。解决问题的最简单方法是:启动(它包含在Oracle的JDK中),学习使用它并分析代码。你会发现热点,如果你需要帮助解决这些问题,可以提出一个新问题。您还将学习分析应用程序,这是所有程序员都需要知道的。我注意到的一点是,您正在使用
split()
replaceAll()
,它们都使用正则表达式,您可能不需要正则表达式,并且需要额外的处理能力。您可以使用
replace()
而不是
replaceAll()
来使用非regexp版本。对于
split()。
public DnaStrand cutSplice(String enzyme, String splicee) {
    DnaStrand newStrand = null;
    String original_Dna = this.toString();
    String new_Dna = original_Dna.replaceAll(enzyme, splicee);
    String[] splicee_split = new_Dna.split(splicee); // splits the new DNA string DnaStrand
    newStrand = null;
    int i = 0;
    if (original_Dna.startsWith(enzyme)) {
        newStrand = new LinkedDnaStrand(splicee);
    } else {
        newStrand = new LinkedDnaStrand(splicee_split[0]);
        newStrand.append(splicee);
    }
    for (i = 1; i < splicee_split.length - 1; i++) {

        String node = splicee_split[i];
        newStrand.append(node);
        newStrand.append(splicee);

    }
    newStrand.append(splicee_split[splicee_split.length - 1]);

    if (original_Dna.endsWith(enzyme)) {
        newStrand.append(splicee);
    }


    return newStrand;
}