2013-07-11 70 views
2

我知道這個名字有很多線程。我有一個代碼來生成ngrams。但想知道在處理數千個字符串時能否以更好的速度進行改進?提高ngram代的方法?

例字符串= 「abcdefghijkl1245ty789」

public static String[] ngrams(String s) { 
     int len=12; 
     String[] parts = s.split("(?!^)"); 
     String[] result = new String[parts.length - len + 1]; 
     for(int i = 0; i < parts.length - len + 1; i++) { 
      StringBuilder sb = new StringBuilder(); 
      for(int k = 0; k < len; k++) { 
       sb.append(parts[i+k]); 
      } 
      result[i] = sb.toString(); 
     } 
     return result; 
    } 

上面的代碼得到的字符串,生成給定長度的ngrmas。在我的情況下,其12

+0

如果你有輸入字符串的大量具有合理的可能性重複輸入字符串,那麼你可能要考慮這種方法的記憶,因爲輸出只依賴於輸入。 – Dancrumb

回答

6

不確定:

public static String[] ngrams(String str, int length) { 
    char[] chars = str.toCharArray(); 
    final int resultCount = chars.length - length + 1; 
    String[] result = new String[resultCount]; 
    for (int i = 0; i < resultCount; i++) { 
     result[i] = new String(chars, i, length); 
    } 
    return result; 
} 

變化我提出:

  • 代替經由正則表達式分裂,我用String#toCharArray()這確實單個陣列複製,因此多更快
  • 而不是重建所產生的字符串從StringBuilder,我用an appropriate String constructor,這再次,只有一個陣列拷貝
  • (性能不需要,但仍然)我將方法簽名更改爲具有length作爲我測試原因的參數。隨意更改它 - 只要確保您將方法從ngrams()重命名爲ngrams12()什麼的。

或跌落時,一切都完全和使用一個天真的做法與String#substring(),做引擎蓋下一個類似的工作:

public static String[] ngramsSubstring(String str, int length) { 
    final int resultCount = str.length() - length + 1; 
    String[] result = new String[resultCount]; 
    for (int i = 0; i < resultCount; i++) { 
     result[i] = str.substring(i, i+length); 
    } 
    return result; 
} 

順便說一句,如果你曾經使用未來的正則表達式,嘗試編譯一次,並重新使用它,而不是每次使用該方法時編譯它。例如,你的代碼看起來像:

private static final Pattern EVERY_CHAR = Pattern.compile("(?!^)"); 

,然後,在方法,而不是String#split,你會使用

String[] parts = EVERY_CHAR.split(str); 
+0

隨時提問任何問題! –

+0

感謝您的答覆。關於子字符串選項,我讀了一些討論,使用子串原因每次創建新的字符串對象?所以不會在處理大量用於生成ngram的子字符串操作時導致堆空間錯誤? – Balaram26

+0

@ Balaram26我不知道我的理解是否正確。你的解決方案,以及我的每一次創建一個新的'字符串'實例,每次他們分配給'結果[我]'。此外,你的解決方案將創建一個'StringBuilder'對象。還有一些'char []'拷貝。在Java 7 update 6之前,'substring()'共享原始字符數組,因此會節省大量內存(和'char []'分配和拷貝)。 –