我有一个视频文件,它由许多连续的二进制数据帧组成。每帧也有一个唯一的时间戳(不是它在文件中的序号,而是一个值,由相机在录制时提供)。另一方面,我有一个 API 函数,它根据该帧的序号检索该帧。让事情变得更复杂一些 - 我有一个玩家,他提供了时间戳,并且应该获取该帧的二进制数据。
另一个可悲的事情是:时间戳不是连续的。它们可以是连续的,但不能保证,因为围绕最大无符号短大小可能会发生回绕。所以时间戳序列可以是 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 应该能够通过时间戳获取二进制帧。但是,在内部,我只能通过帧序号来获取帧。因此,如果我被要求输入时间戳m
,我需要遍历n
帧,以找到带有时间戳的帧m
。
为了优化它,我选择创建一个索引文件,它可以让我在时间戳和帧序号之间进行匹配。这是我的问题:
目前我的索引文件由 size 的二进制对组成2*sizeof(unsigned int)
,其中包含时间戳和帧序号。播放器稍后会从该文件中stl map
创建key==timestamp
, value==frame sequential number
。
有什么方法可以更有效地做到这一点吗?我是否应该将索引文件创建为某些数据结构的转储,以便稍后在打开剪辑时由剪辑播放器将其加载到内存中,这样我就可以 O(1) 访问帧?您还有其他建议吗?
升级版:
我已经更新了名称和要求(时间戳不一定是连续的,并且帧数由 MAX_UNSIGNED_SHORT 值限制)。还要感谢所有已经抽出时间并给出答案的人。插值搜索是一个有趣的想法,尽管我自己从未尝试过。我想问题将是运行时之间O(1)
和O(log log N)
运行时的增量。