具有TTL的数据结构

时间:2013-11-18 13:21:34

标签: c++ algorithm data-structures

我想用这样的属性构建键值存储:

  • O(log N)插入复杂度并写入优化;
  • 顺序写入的插入速度更快(键按间隔顺序排列);
  • O(log N)密钥查找复杂性;
  • O(log N + M)键范围查询复杂度;
  • o(N)过时的关键驱逐复杂性;
  • 所有密钥都有与之关联的时间戳,旧项目会定期逐出;
  • 必须通过调用某个函数或方法明确地完成关键驱逐;
  • 如果密钥已过时,仍可以阅读;
  • 关键驱逐不需要非常精确;

所以界面看起来像这样:

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树相比)。

2 个答案:

答案 0 :(得分:3)

听起来你只需要一个红黑树(可能是连续的键值数组,以满足你的第二个要求),并用一个链接的插入顺序列表覆盖。 (如果您不一定按时间戳插入按键升序,请将其设为fibonacci堆而不是链表。)

顺便说一下,我在倒数第二点假设你的意思是“尝试查找指向已过期项目的密钥并非错误”。

答案 1 :(得分:1)

实际上你可以维护一个排序的std :: deque

这应该适合你所有的标准并允许调整时期(驱逐)