使用 TTL 的数据结构
Data-structure with TTL
我想构建具有以下属性的键值存储:
- 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 树相比)。
听起来您只需要一棵红黑树(可能是连续的键值数组,以满足您的第二个要求),上面覆盖着一个插入顺序的链接列表。(如果您不一定按时间戳升序插入键,请将其设置为斐波那契堆而不是链表。
顺便说一句,我假设您的倒数第二点是指"尝试查找引用过期项目的密钥不是错误"。
实际上你可以维护一个排序的 std::d eque
这应该符合您的所有标准,并允许调整时间段大小(逐出)
相关文章:
- 链表,反向函数,数据结构
- 如何使用set实现无序数据结构?
- 我们可以将数据永久保存为数据结构吗?
- C++中的可变长度数组/数据结构
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- 通过 NIF 从C++返回自定义数据结构
- 编译器上的策略数据结构不起作用
- 尝试构建"lock-free"数据结构C++
- 设计将引用元素移动到开头的数据结构.C++
- 在学习数据结构之前对STL有一个了解是好的吗?
- 如何解析表示树状数据结构的字符串
- 我对数据结构、双向链表有一些问题
- googletest:测试太大的数据结构
- C++中deque数据结构的大O是什么?
- 我可以使用哪种数据结构来处理这种方式
- 将文本文件解析为树状数据结构
- C++ 中具有 O(1) 搜索时间复杂度的数据结构
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- C++,您能否设计一种数据结构,将指针保存在连续内存中并且不会使它们失效?
- 使用 TTL 的数据结构