Java 链表优化
我正在研究这个模拟限制性内切酶和DNA剪接的程序。我使用DnaSequenceNode[s]作为链表节点 我的代码中的一个函数有一个问题,cutSplice()应该创建一个新的DnaStrand,它是当前DnaStrand的克隆,但是每个酶实例都被Splice替换 例如,如果LinkedDnaStrand被实例化为“TTGATCC”,并且 调用cutSplice(“GAT”、“TTAAGG”),则链表应类似于(前面的指针未显示): 第一个->“TT”->“TTAAGG”->“CC”->空 我的功能正常。但是,我的方法cutSplice()拼接200个DNA需要80多秒。我应该把80秒改成2秒 这是我的课程代码: 下面是cutSplice()方法的代码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和剪切拼接(字符串酶,字符串拼接){
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;
}