2

一連の電圧データを保存する必要のあるアプリケーションがあります。各エントリは、ペア{時間、電圧}のようなものです。

時間は必ずしも連続的ではありません。電圧が動かなければ、私は何も読みません。

問題は、getVoltageOfTimestamp(float2second(922.325))のようにタイムスタンプを検索する関数も必要なことです。

私の解決策は、ペアを格納する両端キューを用意し、30秒ごとにサンプリングを実行して、インデックスをマップstd::mapに格納することです。

したがって、getVoltageOfTimestamp(float2second(922.325))内で、目的の時間に最も近いinterval_of_30_secondsを見つけてから、dequeのポインターを対応する_index_of_dequeに移動し、そこから繰り返して正しい電圧を見つけます。

ここにもっと「コンピューター科学者」の解決策があるかどうかはわかりませんが、誰かが私に手がかりを与えることができますか?

4

4 に答える 4

1

std::dequeタイムスタンプは昇順であるため、バイナリ検索を使用できます。

速度を最適化したい場合は、std::map<Timestamp, Voltage>. 要素を見つけるupper_boundには、マップ上で を使用して、 で見つかった要素よりも前の要素を返すことができますupper_bound。このアプローチでは、より多くのメモリを使用します (std::map<Timestamp, Voltage>オーバーヘッドがあり、各エントリを個別に割り当てるため)。

于 2010-01-21T08:33:34.360 に答える
1

別のマップを使用するのではなく、deque で直接バイナリ検索を実行して、クローゼットのタイムスタンプを見つけることができます。std::map の複雑さの要件を考えると、バイナリ検索を行うことは、マップ ルックアップ (両方とも O(log N)) と同じくらい効率的であり、余分なオーバーヘッドは必要ありません。

于 2010-01-21T08:21:27.457 に答える
0

C++ ox conepts を使用してもよろしいですか? そうでない場合deque<tuple<Time, Voltage>>は、仕事をします。

于 2010-01-21T08:40:26.113 に答える
0

二分探索を改善する方法の 1 つは、データのサンプルを特定することです。サンプルが 30 ミリ秒ごとであると仮定すると、取得した読み取り値を vector/list に保存します。もう一方の配列では、配列のインデックスを 30 秒ごとに挿入します。タイムスタンプが与えられたら、最初の配列に移動してリスト内の要素のインデックスを見つけ、そこに移動してその前後のいくつかの要素を確認します。

お役に立てれば。

于 2010-01-26T05:46:40.263 に答える