2017-11-02 13 views
0

나는 현재 Damerau levenshtein 알고리즘과 유사한 문자열을 ArrayList of ArrayList에 비교해야하는 프로그램을 작성 중이다. 지금, 나는이 일을 해요 방법은 중첩 된 코드 루프를 통해입니다 :중첩 루프보다 나은 대안

Damerau d = new Damerau(); 

for(int i = 0;i<outer.size();i++) { 
    System.out.println(i); 
    String cstring = outer.get(i).get(5); 
    for(ArrayList<String> current : outer) { 
     if(d.distance(cstring , current.get(5)) < 30){ 
      //System.out.println(cstring); 
      outer.get(i).set(0, current.get(0)); 
      break; 
     } 
    } 
} 

을하지만 ArrayList를가 33000 문자열 arraylists 구성으로이 정말 느립니다. 불필요한 비교의 톤을 의미

 
for each outer as cstring : 
    for each outer as current: 
     levenshtein(cstring, current) 

:

+0

데이터베이스에서 데이터를 읽는 경우 모든 데이터를 가져 오는 대신 필요한 데이터 만 가져옵니다. SQL 쿼리는 라인별로 비교하는 것보다 비교적 빠릅니다. 만약 당신이 RDBMS를 사용하지 않는다면 적어도 sqlite 데이터를 덤프하고 쿼리를 사용하여 데이터를 가져 오는 것이 좋습니다. 또 다른 것은 프로파일 러 도구를 사용하고 정확히 어느 라인이 더 많은 시간을 소비하는지 식별합니다. 가능한 경우 작은 목록과 독립적 인 스레드로 데이터를 분할하십시오. –

+0

코드를 벤치마킹하여 가장 많은 시간을 보냈습니까? 하나의 최적화는 내부 루프 반복마다 그것을 인출하는 대신 외부 루프 내에서'outer.get (i) '를 한 번만 가져올 수 있습니다. – Turing85

+0

당신이 이미 체크 한 값에 태그를 붙여서 건너 뛰면 어떨까요? 'out.get (i)'만 설정하는 대신 일치하는 경우'current '도 업데이트 할 수 있습니다. – AxelH

답변

0

그래서 난 당신의 코드를 이해하면 제대로이의 라인을 따라 뭔가. 문자열이 [a, b, c] 인 목록이 있다고 가정하면 테스트 할 조합은 [aa, ab, ac, ba, bb, bc, ca, cb, cc]입니다. 이것은 항상 자신과의 비교 (aa, bb, cc)를 포함하는데, 항상 0이며, 스왑 된 매개 변수 (ab,ba,ac,ca,bc,cb)가있는 levenshtein 함수에 대한 호출은 항상 동일합니다. 따라서 동일한 쌍과 자체 테스트를 건너 뛰면 ab,ac,bc 조합 만 테스트하면됩니다. i + 1에서 내부 루프를 시작하면 코드에서 쉽게이 작업을 수행 할 수 있습니다.