私は現在解決策を持っていますが、この問題になるほど効率的ではないと感じています。この。C++を使用して2つのソートされた配列の一致するインデックスのインデックスを見つける最も効率的な方法
私は2つの配列(例:std :: vectors)を持っています。両方の配列には、ソートされているが値が疎な固有の整数値しか含まれていません。つまり、1,4,12,13 ...私が求めているのは、同じだ。たとえば、array1の値は1,4,12,13で、array2の値は2,12,14,16です。最初の照合値インデックスは配列2で1です。配列内のインデックスは、このインデックスを使用して "一致する"データを含む他の配列を持つため、重要です。
私は配列を使用することに限定されず、マップも可能です。私は2つの配列を1回だけ比較しています。彼らは最初のマッチの後に再利用されません。いずれかの配列では、値が小さいものから多いもの(30万以上)がありますが、必ずしも同じ数の値を持つとは限りません(これにより、はるかに簡単になります)。
ひどい場合はO )。マップを使用すると、より良いO(ログN)が得られますが、私はまだ値のマップ、インデックスのペアに配列を変換しているでしょう。
私は現在コンテナのタイプ変換を行わない必要があります。 2つの配列のうちの小さいほうにループします。小配列(array1)の現在の要素と大配列(array2)の現在の要素を比較します。 array1要素の値がarray2要素の値より大きい場合は、array1の要素の値(whileループ)を超えないように、array2のインデックスを増やします。次に、array1要素の値がarray2要素よりも小さい場合は、次のループ反復に進み、再び開始します。さもなければ、それらは等しくなければならず、私は、一致する値のいずれかの配列にインデックスを持ちます。
このループでは、すべての値が一致する場合はO(N)、一致しない場合はさらに悪いO(2N)になります。だから、もっと速いものがあるのだろうか? 2つの配列がどれくらいの頻度で一致するかを知るのは難しいですが、ほとんどの配列がより多くのものにマッチします。
私は問題を十分に説明していただき、これを改善するためのフィードバックやヒントをいただければ幸いです。
コード例は:
std::vector<int> array1 = {4,6,12,34};
std::vector<int> array2 = {1,3,6,34,40};
for(unsigned int i=0, z=0; i < array1.size(); i++)
{
int value1 = array1[i];
while(value1 > array2[z] && z < array2.size())
z++;
if (z >= array2.size())
break; // reached end of array2
if (value1 < array2[z])
continue;
// we have a match, i and z indices have same value
}
結果は、配列が既にソートされているので、あなただけ使用することができる配列1 = [1,3]および配列2 = [2,3]
コードはどこですか? – Christophe
現在のソリューションのサンプルコードを追加 – scottiedoo
私は興味があります、あなたはこのアルゴリズムが必要なコンテキストは何ですか? – user2079303