나는 현재 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)
:
데이터베이스에서 데이터를 읽는 경우 모든 데이터를 가져 오는 대신 필요한 데이터 만 가져옵니다. SQL 쿼리는 라인별로 비교하는 것보다 비교적 빠릅니다. 만약 당신이 RDBMS를 사용하지 않는다면 적어도 sqlite 데이터를 덤프하고 쿼리를 사용하여 데이터를 가져 오는 것이 좋습니다. 또 다른 것은 프로파일 러 도구를 사용하고 정확히 어느 라인이 더 많은 시간을 소비하는지 식별합니다. 가능한 경우 작은 목록과 독립적 인 스레드로 데이터를 분할하십시오. –
코드를 벤치마킹하여 가장 많은 시간을 보냈습니까? 하나의 최적화는 내부 루프 반복마다 그것을 인출하는 대신 외부 루프 내에서'outer.get (i) '를 한 번만 가져올 수 있습니다. – Turing85
당신이 이미 체크 한 값에 태그를 붙여서 건너 뛰면 어떨까요? 'out.get (i)'만 설정하는 대신 일치하는 경우'current '도 업데이트 할 수 있습니다. – AxelH