2013-07-25 3 views
0

Я пишу некоторые кода Java я написал метод и для тестового входа он принимает Morethan 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

Thats the 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: содержит строку раскол выше текста например, { "Некоторые", "слова", ...}

paraWordsIndexes: содержит индексы -бла-бла, например, {0, 3}

lowFreqIndexes: содержит бла-бла, например.{0, 1}

Ожидаемый результат: он должен возвращать {значение}, но не {} other_value

1

Ваш код, как представляется сложным (- если - для) в этом случае наилучшим образом оптимизировать его с помощью профилировщика для проверки, где находится код, который принимает больше времени в процессе исполнения.

Поскольку вы не укажете свой IDE, у попытается предложить некоторые интересные инструменты:

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

С наилучшими пожеланиями

0

Ну, было бы полезно, если у вас не было вложенных циклов, и это также помогло бы, если бы вы могли минимизировать количество операторов if в каждом цикле (особенно если у вас есть вложенные циклы).

Можете ли вы объяснить, что вы пытаетесь сделать? Ваш код не совсем очевиден, и, возможно, есть способ сделать это совершенно иначе, чем ваш подход.

+0

Я не могу объяснить вам в тексте, что он действительно сложный. Все, что я могу придумать, это оптимизация java, поскольку нельзя изменить его. – Sravan2023

+0

Попробуйте? Если вы не можете объяснить это в тексте, то я не уверен, что вы сможете думать об этом за пределами его нынешней структуры, которую вы только полностью понимаете. Мне не нужно ничего конкретного, просто основы. Часто оптимизация исходит из изменения процесса выполнения вами, а не для таких вещей, как удаление оператора if. Я хочу попытаться помочь вам избавиться от этих вложенных циклов, но я не могу этого сделать, если не знаю, что они делают. –

+0

У меня есть большие слова абзаца в списке, которые можно назвать parariesList. и тогда у меня есть список уникальных слов, которые можно сказать как wordList. paraWordsList содержит слова, которые находятся в словахList и ТАКЖЕ не в словахList. Моя цель - найти начальный и конечный индекс paraWordsList, который содержит все слова в словахList, и он должен быть коротким [означает, что между двумя индексами количество слов должно быть меньше любых других подобных случаев]. – Sravan2023