バイナリ データの多数の連続したフレームで構成されるビデオ ファイルがあります。各フレームには一意のタイムスタンプもあります (これはファイル内の連続番号ではなく、記録時にカメラによって提供される値です)。一方、そのフレームの連番に基づいてそのフレームを取得する API 関数があります。物事をもう少し複雑にするために、タイムスタンプが提供され、そのフレームのバイナリデータを取得する必要があるプレーヤーがいます。
ここでもう 1 つ悲しいことがあります。タイムスタンプは連続していません。それらは連続することができますが、保証されていません。したがって、一連のタイムスタンプは、54567、54568、...、65535、65536、... または
54567、54568、 ...、65535、0、1、... のいずれかになります。
したがって、次のようになります。
Frame 0
timestamp 54567
binary data
........
Frame 1
timestamp 54569
binary data
........
Frame 2
timestamp 54579
binary data
.
.
.
Frame n
timestamp m
binary data
0 <= n <= 65536 (MAX_UNSIGNED_SHORT)
0 <= m <= MAX_UNSIGNED_INT
クリップ プレーヤー API は、タイムスタンプによってバイナリ フレームを取得できる必要があります。ただし、内部的には、フレームの連番だけでフレームを取得できます。したがって、timestamp を求められた場合は、timestampを持つフレームを見つけるために、フレームm
を反復処理する必要があります。n
m
最適化するために、インデックス ファイルを作成することにしました。これにより、タイムスタンプとフレームの連続番号が一致します。そして、ここに私の質問があります:
現在、私のインデックス ファイルは2*sizeof(unsigned int)
、タイムスタンプとフレームの連続番号を含む size のバイナリ ペアで構成されています。Player は後で、そのファイルから , を使用して作成しstl map
ます。key==timestamp
value==frame sequential number
より効率的に行う方法はありますか?インデックス ファイルを何らかのデータ構造のダンプとして作成し、後でクリップを開くときにクリップ プレーヤーによってメモリにロードできるようにする必要があります。これにより、フレームへの O(1) アクセスが可能になります。他の提案はありますか?
更新:
名前と要件を更新しました (タイムスタンプは必ずしも連続しているわけではなく、フレーム番号は MAX_UNSIGNED_SHORT 値で制限されています)。また、すでに時間を割いて回答してくれたすべての人に感謝したいと思います。補間検索は興味深いアイデアですが、自分で試したことはありません。O(1)
問題は、実行中と実行中のデルタになると思いO(log log N)
ます。