私は2つの配列を持っています。配列 1 は医学用語を保持し、配列 2 は平易な英語の用語を保持しています。医療用語の配列には、医療以外の英語の単語がいくつか含まれています (配列 1 に重複しています)。これらは、array1 で 20,000、array2 で 15000 を超えています。2 つの配列を比較し、delphi を使用して配列 1 から重複する単語を削除する最速の方法は何ですか?
2 に答える
配列がソートされていない場合、このアプローチはより高速です。1.array2のすべての単語を辞書に詰め込みます。2. array1を実行し、辞書で各単語を検索し、見つかった場合は削除します。
ステップ1と2はどちらもO(n)時間かかります。
古いバージョンのdelphiを使用している場合は、delphiインストールのMemIni.PasファイルにあるTHashedStringListなどの辞書クラスを使用する必要があります。Nが非常に大きい場合は縮退しますが、20.000エントリの場合は、それでも非常に高速です。
O(1)に数億の文字列を格納および検索できる非常に高速な実装は、ここにあります。記事はドイツ語ですが、コードは英語でわかりやすいものです。
配列がソートされている場合は、2 つのポインターp1
(およびp2
toarray1
とarray2
resply) を保持します。array1
andの最初の要素を指すようにそれらを初期化しますarray2
。
array1
最初から始まる各エントリについて、それが単語 array2[p2] であるかどうかを確認します。ある場合は、単純に から削除しarray1
ます。p2
そうでない場合は、までインクリメントします。
( (array1[p1] >= array2[p2]) and (array1[p1] < array2[p2+1]) ),
array1[p1]
ヒットした場合は削除します。
時間がかかりO(n)
ます。時間の並べ替えアルゴリズムがありますO(nlogn)
。