2013-07-25 73 views
0

我写一些Java代码 我写了一个方法和测试输入它正在人数超过5秒的执行 我真的真的想保持小于5秒 任何人都可以建议我怎么可以优化我的方法Java方法优化

private static String getShortestSub(ArrayList<String> paraWordsList, 
     ArrayList<Integer> paraWordsIndexes, 
     ArrayList<Integer> lowFreqIndexes) { 

    long d = System.currentTimeMillis(); 
    // Finding the substring 
    int startTxtIndex = 0, endTxtIndex = 0; 
    int tempLength = paraWordsList.size(); 
    for (int i = 0; i < lowFreqIndexes.size(); i++) 
    { 
     int point = lowFreqIndexes.get(i), startIndex = 0; 
     HashSet<String> frame = new HashSet<String>(); 


     // index is the indexes of paraWordsIndexes 
     startIndex =paraWordsIndexes.indexOf(point); 
     for (int index = paraWordsIndexes.indexOf(point); index >= 0; index--) 
     { 
      if (frame.add(paraWordsList.get(paraWordsIndexes.get(index)))) 
      { 
       startIndex = index; 
       if (frame.size() == K 
         || (paraWordsIndexes.get(startIndex) - point) >= tempLength) 
        index = -1;     
      } 
     } 
     frame.clear(); 

     for (int start = startIndex, index = startIndex; start <= paraWordsIndexes 
       .indexOf(point) && index < paraWordsIndexes.size(); index++) 
     { 
      int tempStart = paraWordsIndexes.get(start), tempEnd = paraWordsIndexes.get(start); 
      int currIndex = paraWordsIndexes.get(index); 
      String word = paraWordsList.get(currIndex); 
      if ((tempStart - point) >= tempLength)   break; 
      if ((tempStart - currIndex) >= tempLength)  break; 
        frame.add(word); 
      if (frame.size() == K) 
      { 
       tempEnd = currIndex; 
       int newLength; 
       if ((newLength = tempEnd - tempStart) > 0) 
        if (tempLength > newLength) 
        { 
         tempLength = newLength; 
         startTxtIndex = tempStart; 
         endTxtIndex = tempEnd; 
         if (K == (tempLength+1)) { 
          i = lowFreqIndexes.size(); 
          break; 
         } 
        } 
       frame.clear(); 
       tempStart = paraWordsList.size(); 
       start++; 
       index = start - 1; 
      } 
     } 
     frame.clear(); 
     System.out.println(System.currentTimeMillis() - d); 
    } 

    String[] result = paraText.split(" "); 
    ArrayList<String> actualParaWordsList = new ArrayList<String>(
      Arrays.asList(result)); 

    return textCleanup(actualParaWordsList.subList(startTxtIndex, 
      endTxtIndex + 1).toString()); 
} 
+0

为什么你要保持它在5秒了吗? – Jeffrey

+1

你有没有试过探查器? http://visualvm.java.net/ – radai

+0

这就是requiremebt(<5秒) – Sravan2023

回答

2

作为第一优化,你可以删除冗余呼叫indexOf()

在外环point变量不改变这样的indexOf()第一个电话是实际需要的只有一个。

// index is the indexes of paraWordsIndexes 
startIndex =paraWordsIndexes.indexOf(point); 

介绍而不是将存储的indexOf()结果和循环

int pointLFIndex = paraWordsIndexes.indexOf(point); // new variable. should not change 
startIndex = pointLFIndex; 

内不会改变然后改变的indexOf(point)所有出现上述变量的新变量。

// you don't need this. change to for (int index = pointLFIndex; ...); 
for (int index = paraWordsIndexes.indexOf(point); index >= 0; index--) 

// use for (int start = ...; start <= pointLFIndex ...; index++) { 
for (int start = ...; start <= paraWordsIndexes.indexOf(point) ...; index++) { 

indexOf()线性搜索您的数组列表。特别是第二次出现是在每次循环迭代时执行的,因此它将成为大型列表的杀手锏。

如果上述内容没有帮助,我不明白为什么你不编辑你的问题来添加一个简单的测试因为很多人也问过你(包括我自己)。

一个简单的场景是这样的:

输入文本"Some words are larger while some other words are smaller"

paraWordsList:含有上述文本 例如字符串分割{“Some”,“words”,...}

paraWordsIndexes:包含索引 等等等等。 {0,3}

lowFreqIndexes:contains blah blah例如,{0,1}

预期输出:它应该返回{}值而不是{} other_value

1

您的代码似乎是复杂的(对 - 如果 - 为)在这种情况下,最好的办法是使用支票探查这里是花更多的时间在执行过程中的代码优化。

既然你没有指定你的IDE,Y将尝试提出一些有趣的工具:

https://profiler.netbeans.org/ http://www.eclipse.org/tptp/

问候

0

那么,这将有助于如果你没有嵌套循环,并且,如果可以最小化每个循环内if语句的数量(特别是如果您有嵌套循环),也会有所帮助。

你能解释你在做什么吗?你的代码不是很明显,也许有一种方法可以完全不同于你的方法。

+0

我不能在文本中解释你真的很复杂。所有我能想到的是一个java优化算法不能改变 – Sravan2023

+0

试试看吧?如果你不能在文本中解释它,那么我不确定你能否在它当前的结构之外进行思考 - 只有你完全理解。我不需要任何特定的东西,只是基本的东西。通常优化来自改变你正在做的事情的过程,而不是像删除if语句那样的小事情。我想试着帮你摆脱那些嵌套的循环,但如果我不知道他们做了什么,我不能这样做。 –

+0

我有一个段落的大词在列表中让我们把它称为paraWordsList。然后我有一些独特的单词列表可以说它是wordsList。 paraWordsList包含单词列表中的单词,并且不包含单词列表中的单词。 我的目标是找到包含wordsList中所有单词的paraWordsList的开始和结束索引,它应该是短的[两个索引之间的词的数量应该小于其他任何这样的发生]。 – Sravan2023