2013-03-12 11 views
11

2つのArrayListsを減算して、他のリストにない子を持つことができます。これらのリストをもっと速く引くにはどうすればいいですか?

私はそれをこのように実行します。

removeIDs=(ArrayList<Integer>) storedIDs.clone(); 
removeIDs.removeAll(downloadedIDs); 

downloadIDs=(ArrayList<Integer>) downloadedIDs.clone(); 
downloadIDs.removeAll(storedIDs); 

問題は、両方のリストが5000childsを含み、それは私のandroidphoneに、ほぼ4秒かかるということです。

これを行うには速い方法がありますか? は、より高速なセットを使用していますか?(私はリストの重複した値を持っていけない)

注文を維持する必要がない限り、私は、Androidアプリ

答えて

7

代わりのArrayListの使用HashSetのを開発しています。

要素を削除するには、一覧実装の完全な一覧をスキャンする必要があります。比較のためのHashSetは、ハッシュコードの計算とターゲットバケットの識別だけです。

1

より速くセットする必要があります。今は、基本的にn^2ループを実行しています。 removeIDsのすべての要素をループし、そのIDがダウンロードIDに含まれているかどうかを確認します。これは、リスト全体を検索する必要があります。ダウンロードしたIDがHashSetのように検索するために速く格納されていた場合、これははるかに高速になり、O(n^2)の代わりにO(n)になります。 Collections APIにはもっと速いものがあるかもしれませんが、わかりません。

通常のHashSetの代わりにLinkedHashSetを使用することができますが、要素の挿入/削除のためにメモリオーバーヒアとパフォーマンスヒットが追加されます。

1

整数IDが比較的小さい範囲に収まらない限り、私はHashSetの推奨に同意します。その場合、私はHashSetとBitSetのそれぞれを使用してベンチマークを行い、実際には自分の環境でデータの方が速い方を使用します。

0

リストが必要な場合はLinkedListを選択できます。あなたのケースでは、@Chrisが述べたように、ArrayList実装は各削除のすべての要素を移動します。

LinkedListを使用すると、ランダムな追加/削除のパフォーマンスが大幅に向上します。このpostを参照してください。

1

まず、私は長い答えのために私の謝罪をしています。いつでも私が間違っていたら、いつでも私を訂正することができます。あなたがArrayList.removeAllメソッドを使用してコードで

のremoveAll

のソースコードのコードに見ることができます:ここで私は解決策

OPTION 1 < ArrayListには>解決のいくつかのオプションを比較していますremoveAll

public boolean removeAll(Collection<?> c) { 
     return batchRemove(c, false); 
    } 

はそうbatchRemove方法であるかを知る必要があります。ここはlinkです。ここで重要な部分あなたが

for (; r < size; r++) 
     if (c.contains(elementData[r]) == complement) 
       elementData[w++] = elementData[r]; 

を見ることができる場合は、今indexOf方法の単なるラッパーであるcontains方法を検討することができます。 link。 indexOfメソッドには、O(n)操作があります。(ここで注意する部分だけ)すべての上だから、

for (int i = 0; i < size; i++) 
      if (elementData[i]==null) 
        return i; 

はそれがremoveAll

OPTIONで

はO(n^2)

操作で2 < HashSet>: 以前ここに何か書きましたが、私はいくつかのpoinに間違っていたようですこれを取り除く。ハッシュセットについての専門家からの提案をうまく活用してください。あなたの場合、hashmapがより良い解決策になるかどうかはわかりません。だから私は>

OPTION 3 <私の提案あなたが試すことができ、別の解決策を提案しています:

ステップ1:をあなたのデータは、その後、他のこのステップの必要はあなたが差し引きますリストをソートしないソートされている場合(第2のリスト)

ステップ2:未分類リストのすべての要素のためのは、第二のリスト

ステップ3でバイナリ検索を実行します:は一致が見つからない場合は、別の結果リストに保存するが、一致が見つかった場合、その後

ステップ4追加していけない:

結果リストは、オプション3のあなたの最終的な答え

コストですステップ1:ソートされていない場合O(nlogn)時間

ステップ2:O(nlogn)時間

ステップ3:O(n)空間

**

ので全体O(nlogn)時間とO(n)の空間

**

関連する問題