3

名前がすべてを物語っていますが、詳しく説明すると、タイムスタンプ付きのベクトルのリストがあります。それらはほとんどソートされていますが、順不同の値がいくつかあります。それらを順番に出力したいのですが、ベクトルはストリーミングで送られてくるので、タイムリーに結果を出力したいのでバッファを大きくしたくありません。

そのため、N 個のベクトルを含む一種の「先読み」リストを保持したいと考えています。新しいベクトルを読み込むと、それをリストに挿入し、リストの一番上から最も古いベクトルをポップして、リストが一定の N ベクトルの長さになるようにします。

リストに挿入するときは、ベクトルをソートしてリスト内の正しい位置に追加する必要があります。これが最も効率的な方法だと思います。

十分な効率が必要ですが、あまりにも長い実装とテストを無駄にしたくありません。したがって、私は簡単な解決策 (既存の C++ 構造体が存在する場合は再利用するなど) と、顕著な速度向上を実現できる場合の実装が難しい解決策の両方に関心があります。私は標準の C++ に固執したいと思いますが、必要なことを正確に実行するブーストまたは同様のライブラリがあれば、念のためそれについて聞きたいです。

ありがとうございました。

編集:すべての提案に感謝します。ただし、タイムスタンプが一意ではないことを言い忘れました。タイムスタンプには秒の精度しかないため、実際には、同じタイムスタンプを持つ複数のベクトルを取得する可能性が非常に高くなります。この場合、必要ではありませんが、順序を維持したいと思います。

4

4 に答える 4

1

簡単なオプション:priority_queue O(lg n)最小値を挿入および抽出し、セット/マルチセット(整数の場合は約3倍)よりもはるかに高速で、メモリフットプリントが小さくなります

入力がほぼソートされている場合は、挿入ソートのバリエーションを使用できます。ソートされた両端キューを保持し、後ろのどこかに物を挿入し、前から分をポップします。

于 2012-07-02T19:26:40.293 に答える
0

std::setクラスを見てください。

于 2012-07-02T18:28:32.497 に答える
0

1つの大きなバッファで1つの大きなソートを実行する場合、Timsortは優れています。部分的なソートを利用することができます。しかし、あなたはそれを必要としないと言いました。

ループ内でソートせずに管理しやすい状態を維持する必要がある場合は、treapや赤黒木などを使用することをお勧めします。

Treapは平均して高速です(最近、Pythonでさまざまな条件下でツリーのデータ構造のパフォーマンスを比較しましたが、Trapは常に平均で最速または2番目に高速であることがわかりました。他の2つは、ワークロードによってはtreapよりも少し速い場合があります。 、しかし一貫してそうではありません)

伝えられるところによると、赤黒木は標準偏差が低い操作時間を提供します(平均してトリープに比べると少し遅いですが、これがリアルタイムまたはインタラクティブなアプリの場合、赤黒木は操作時間の変動性が低いために優れている可能性があります)。

于 2012-07-02T21:09:36.850 に答える