両方のリストのすべての要素を実際に調べずに、2 つのリストの共通要素を見つけるにはどうすればよいですか? つまり、1 つの要素をリスト全体と比較する傾向がある通常の走査方法を使用しないということです。
追加の詳細:
1.リストはソートされています
2. 2 番目のリストで最小数の要素をトラバースして、共通要素を見つけたい
両方のリストのすべての要素を実際に調べずに、2 つのリストの共通要素を見つけるにはどうすればよいですか? つまり、1 つの要素をリスト全体と比較する傾向がある通常の走査方法を使用しないということです。
追加の詳細:
1.リストはソートされています
2. 2 番目のリストで最小数の要素をトラバースして、共通要素を見つけたい
List<Integer> list1 = new ArrayList<Integer>();
List<Integer> list2= new ArrayList<Integer>();
List<Integer> list3 = new ArrayList<Integer>(list2);
list3.retainAll(list1);
list3
は と の共通要素のみをlist1
持ちlist2
ます。
これは、明らかにリストをトラバースする最適化されたライブラリ メソッドの 1 つにすぎません。
注: カバーの下をトラバースします。トラバーサルなしでは実行できません
最初のリストのすべての要素について、2 番目のリストを完全にトラバースしたくないということだと思います。
1 つの方法は、両方のリストを並べ替えてから、それらを同時に読み取り、不一致の場合はまたは他のイテレータに進み、一致の場合は両方に進むことです。
別の方法は、1 つのリストをソートしてから、他のリストのすべての要素をバイナリ検索することです。
外側と内側のループでリストをトラバースする単純なO(n ^ 2)ソリューションではなく、O(n)ソリューションを求めているようです。
1つの方法は、リストの1つをトラバースし、その要素をハッシュテーブルに配置することです。次に、他のリストをトラバースし、要素ごとに、要素がハッシュテーブルに存在するかどうかを確認します。これはO(n)ソリューションになりますが、もちろんスペースを消費します。