次の問題があります。順序付けされていない2つのリストで同じ要素のペアを見つける必要があります。これらの2つのリストについては、「ほぼ等しい」ということです。たとえば、特定の要素のみがいくつかのインデックスによってシフトされます(これらのオブジェクトは整数ではなく、この例では整数を使用しています)。
[1,2,3,5,4,8,6,7,10,9]
[1,2,3,4,5,6,7,8,9,10]
私の最初の試みは、両方のリストを反復処理し、各オブジェクトの一意のキーに基づいて2つのHashMapを生成することです。次に、2回目のパスで、両方のマップから要素をプルします。これによりO(2N)
、空間と時間が得られます。
私は別のアプローチを考えていました。両方のリストの現在の要素へのポインターと、各リストのcurrentlyUnmatchedセットを保持します。擬似コードは次の種類のsthになります。
while(elements to process)
elem1 = list1.get(index1)
elem2 = list2.get(index2)
if(elem1 == elem2){ //do work
... index1++;
index2++;
}
else{
//Move index of the list that has no unamtched elems
if(firstListUnmatched.size() ==0){
//Didn't find it also in the other list so we save for later
if(secondListUnamtched.remove(elem1) != true)
firstListUnmatched.insert(elem1)
index1++
}
else { // same but with other index}
}
上記はおそらくうまくいきません...私はあなたがこのアプローチについてどう思うかを大まかに知りたかっただけです。基本的に、これは各リストの側にハッシュセットを維持します。サイズは<<問題サイズです。誤って配置された要素の数が少なく、「ギャップ」が小さい場合、これは〜O(N)である必要があります。とにかく、お返事をお待ちしております。
編集:一致/不一致として見つけたオブジェクトに対して操作(複数の操作でも)を実行する必要があるため、2つのオブジェクトリストの設定された共通部分を単純に返すことはできません