2012-12-13 11 views
0

두 배열이 있습니다. Array1은 의학 용어를 보유하고 있으며 array2는 일반 영어 용어를 사용하고 있습니다. 의학 용어 배열에는 일부 비 의학 영어 단어가 포함되어 있습니다 (array1에 복제 됨). 이것들은 array1이 20,000이고 array2가 15000을 넘습니다. 두 배열을 비교하고 delphi를 사용하여 array1에서 중복 단어를 제거하는 가장 빠른 방법은 무엇입니까? 당신의 배열을 정렬하는 경우, 두 pointers-- p1p2array1array2 resply을 유지델파이에서 두 배열을 비교하고 하나에서 중복을 제거하는 방법

답변

2

배열이 정렬되지 않은 경우이 방법이 더 빠릅니다. 1. array2의 모든 단어를 사전에 넣습니다. 2. array1을 실행하고 사전에서 각 단어를 찾아서 찾으면 제거하십시오.

1 단계와 2 단계 모두 O (n) 시간이 소요됩니다.

이전 버전의 델파이를 사용하는 경우 델파이 설치의 MemIni.Pas 파일에있는 THashedStringList와 같은 사전 클래스를 사용해야합니다. 그것은 매우 큰 N을 위해 타락하지만 20.000 엔트리와 같이 매우 빠릅니다.

O (1)에서 1 억 개의 문자열을 저장하고 찾을 수있는 매우 빠른 구현은 here입니다. 이 기사는 독일어이지만 코드는 영어로 이해할 수 있습니다.

2

. 을 초기화하여 array1array2의 첫 번째 요소를 가리 키도록합니다.

첫 번째부터 시작하여 array1의 각 항목에 대해 단어가 array2 [p2]인지 확인하십시오. 해당하는 경우 array1에서 제거하십시오. 그렇지 않은 경우, 증가 p2 당신이 히트를 발견하는 경우 array1[p1]을 제거

((array1[p1] >= array2[p2]) and (array1[p1] < array2[p2+1])), 

까지.

시간은 O(n)입니다. O(nlogn) 시간에 정렬 알고리즘이 있습니다.

관련 문제