次のようなデータ構造があります。
struct X {
float value;
int id;
};
それらのベクトル(サイズN(100000と考えてください)、値でソート(プログラムの実行中は一定のまま):
std::vector<X> values;
今、私は関数を書きたい
void subvector(std::vector<X> const& values,
std::vector<int> const& ids,
std::vector<X>& out /*,
helper data here */);
これは、渡されたID (サイズM < N ( Nの約 0.8 倍) )で指定された、並べ替えられた値のサブセットでoutパラメータを埋めます。関数パラメーターからのヘルパー データ) または 1 回だけ実行される何かは完全に問題ありません)。
これまでの私の解決策: idを含む
ルックアップテーブルlutを作成 ->値のオフセット(準備、したがって一定の実行時間)
create 、サイズ N、各 id の無効な id ( Nで線形)で埋められ、 tmpを介して ( Mで線形)
ループ
にコピーされます、項目をoutにコピー ( Nで線形)std::vector<X> tmp
values[lut[id]]
tmp[lut[id]]
これはNで線形です ( Mよりも大きいため) が、一時変数と繰り返されるコピーは私を悩ませます。これよりも速くする方法はありますか?MはNに近いため、O( M log N ) は好ましくないことに注意してください。
編集: http://ideone.com/xR8Vpは、前述のアルゴリズムのサンプル実装であり、目的の出力を明確にし、線形時間で実行可能であることを証明します。問題は、一時変数を回避するか、高速化する可能性についてです他の方法では、線形ではないものは高速ではありません:)。