我想用这样的属性构建键值存储:
所以界面看起来像这样:
template<class K, class V>
class Index {
...
class iterator_pair...
...
Index(int TTL);
void insert(K key, V value);
V find(K key);
iterator_pair<K, V> get_range(K begin, K end);
void remove_outdated();
};
如何实施此类数据结构?
更新
到目前为止,我已经决定使用TSB树(时间分割b +树)来实现这一点。它几乎完美契合 - 写入和键查找具有对数复杂性;它是写优化的(大多数插入只是写入预先分配的内存缓冲区,分配由许多插入分摊);旧密钥驱逐可以通过删除历史节点来完成,这个节点可以很容易地被标记为快速访问,甚至更多 - 在节点拆分期间可以进行密钥驱逐。
基于RB树的解决方案也很有效,也许我使用它而不是TSB树,因为它易于实现(与TSB树相比)。
答案 0 :(得分:3)
听起来你只需要一个红黑树(可能是连续的键值数组,以满足你的第二个要求),并用一个链接的插入顺序列表覆盖。 (如果您不一定按时间戳插入按键升序,请将其设为fibonacci堆而不是链表。)
顺便说一下,我在倒数第二点假设你的意思是“尝试查找指向已过期项目的密钥并非错误”。
答案 1 :(得分:1)
实际上你可以维护一个排序的std :: deque
这应该适合你所有的标准并允许调整时期(驱逐)