【发布时间】:2013-11-19 16:55:06
【问题描述】:
我想用这样的属性构建键值存储:
- O(log N) 插入复杂度和写入优化;
- 顺序写入的插入速度更快(键按顺序排列,有间隙);
- O(log N) 键查找复杂度;
- O(log N + M) 键范围查询复杂度;
- o(N) 过时的密钥驱逐复杂度;
- 所有键都有与之关联的时间戳,旧项目会定期被驱逐;
- 必须通过调用某个函数或方法显式地完成键逐出;
- 如果密钥已过期,仍然可以读取;
- key eviction 不需要非常精确;
所以界面可以是这样的:
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-tree(时间分割 b+ 树)来实现这一点。它几乎完美契合——写入和键查找具有对数复杂度;它是写优化的(大多数插入只是写入预分配的内存缓冲区,分配由许多插入摊销);旧的密钥驱逐可以通过删除历史节点来完成,并且这个节点可以很容易地标记以便快速访问,甚至更多 - 可以在节点拆分期间完成密钥驱逐。
基于 RB-tree 的解决方案也非常有效,也许我用它代替 TSB-tree 因为易于实现(与 TSB-tree 相比)。
【问题讨论】:
-
O(N log N) 对于范围查询来说是一个相当宽松的界限。我的意思是,即使是未排序的数组也会给你 O(N)。您的意思是 O(log N + M),其中 M 是实际范围内的元素数?
-
感谢您的指正:)
-
这看起来很像 C++ - 你想添加那个标签吗?另外,关键是你的时间戳,还是基于其他东西的驱逐?
-
密钥和时间戳是不同的东西。当新的键值对添加到集合中时,必须在内部生成时间戳。
标签: c++ algorithm data-structures