まず第一に、私は長い答えをお詫びします。私が間違っている場合は、いつでも私を訂正してください。ここでは、ソリューションを解決するためのいくつかのオプションを比較しています
オプション1<ArrayList>:
あなたのコードでは、ArrayList.removeAll
メソッドを使用して、removeAllのコードを調べます。
removeAllのソースコード
public boolean removeAll(Collection<?> c) {
return batchRemove(c, false);
}
batchRemove
だから、メソッドに何があるかを知る必要があります。こちらがリンクです。あなたが見ることができるならここで重要な部分
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
contains
次に、メソッドの単なるラッパーであるメソッドを調べてみましょうindexOf
。リンク。indexOfメソッドには、O(n)操作があります。(ここでは一部に注意してください)
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
だから全体的にそれは
O(n ^ 2)
での操作removeAll
オプション2<HashSet>:
以前、ここに何かを書きましたが、ある時点で間違っていたようですので、これを削除します。ハッシュセットに関する専門家からの提案を参考にしてください。あなたの場合、ハッシュマップがより良い解決策になるかどうかはわかりません。だから私は別の解決策を提案しています
オプション3<私の提案あなたが試すことができます>:
ステップ1:データがソートされている場合、このステップは必要ありません。それ以外の場合は、減算するリストをソートします(2番目のリスト)
ステップ2:ソートされていないリストのすべての要素について、2番目のリストでバイナリ検索を実行します
ステップ3:一致するものが見つからない場合は別の結果リストに保存しますが、一致するものが見つかった場合は追加しないでください
ステップ4:結果リストが最終的な答えです
オプション3のコスト:
ステップ1:ソートされてO(nlogn)
いない場合
ステップ2: O(nlogn)
時間
ステップ3: O(n)
スペース
****
したがって、全体的なO(nlogn)時間とO(n)スペース
****