0

私は2つの配列を持っています。配列 1 は医学用語を保持し、配列 2 は平易な英語の用語を保持しています。医療用語の配列には、医療以外の英語の単語がいくつか含まれています (配列 1 に重複しています)。これらは、array1 で 20,000、array2 で 15000 を超えています。2 つの配列を比較し、delphi を使用して配列 1 から重複する単語を削除する最速の方法は何ですか?

4

2 に答える 2

2

配列がソートされていない場合、このアプローチはより高速です。1.array2のすべての単語を辞書に詰め込みます。2. array1を実行し、辞書で各単語を検索し、見つかった場合は削除します。

ステップ1と2はどちらもO(n)時間かかります。

古いバージョンのdelphiを使用している場合は、delphiインストールのMemIni.PasファイルにあるTHashedStringListなどの辞書クラスを使用する必要があります。Nが非常に大きい場合は縮退しますが、20.000エントリの場合は、それでも非常に高速です。

O(1)に数億の文字列を格納および検索できる非常に高速な実装は、ここにあります。記事はドイツ語ですが、コードは英語でわかりやすいものです。

于 2012-12-13T05:29:26.547 に答える
2

配列がソートされている場合は、2 つのポインターp1(およびp2toarray1array2resply) を保持します。array1andの最初の要素を指すようにそれらを初期化しますarray2

array1最初から始まる各エントリについて、それが単語 array2[p2] であるかどうかを確認します。ある場合は、単純に から削除しarray1ます。p2そうでない場合は、までインクリメントします。

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

array1[p1]ヒットした場合は削除します。

時間がかかりO(n)ます。時間の並べ替えアルゴリズムがありますO(nlogn)

于 2012-12-13T03:38:43.477 に答える