各要素が別の要素を指している大きな配列の要素のサブセットをループする必要があります(大きなグラフの接続されたコンポーネントの検出に起因する問題)。配列対マップの性能
私のalgoは次のようになります: 1.第1要素を考慮してください。 2.次の要素を前の要素が指しているものとみなしてください。 3.新しい要素が発見されなくなるまでループします。 4. 1-3で考慮していない次の要素を検討し、1に戻ります。 考慮する要素の数は要素の総数よりもはるかに少ないことに注意してください。
私が今見るもののために、私はいずれかを実行できます。
//create a map of all element, init all values to 0, set to 1 when consider
map<int,int> is_set; // is_set.size() will be equal to N
または
//create a (too) large array (total size), init to 0 the elements to consider
int* is_set = (int*)malloc(total_size * sizeof(int)); // is_set length will be total_size>>N
を、私はそれが配列の場合のみ一定のですが(Nを記録)マップ内のキーへのアクセスがOであることを知っているが、 mallocがより多くのメモリを必要とする一方で、作成コストがそれほど高くないかどうかはわかりません。
それほど解決策ではありませんが、mallocを使用する代わりに 'int * is_set = new int [total_size];'を実行できますか? – josephthomas
@josephthomasはそれが単なるブロックメモリの割り当てなので何でも変わるのですか? – Arno
あなたの場合、いいえ、あなたの質問はC++とタグ付けされています。それはもっと 'C++スタイル 'です。 mallocとnewの間には違いがあります。 – josephthomas