查找“最近搜索”最有效的树或其他数据结构
Posted
技术标签:
【中文标题】查找“最近搜索”最有效的树或其他数据结构【英文标题】:Tree or other data structure most efficient to lookup "recent searches" 【发布时间】:2014-05-23 12:35:25 【问题描述】:我以为我现在正在寻找的东西存在一个树算法,但我忘记了它的名字,谷歌搜索没有帮助。
我正在寻找一种对数据具有最佳查找性能的算法。特征: - 每次查找都有望获得成功。所以所有被查找的键都存在(可能有一些未命中,但这些将被视为“错误配置”,此类未命中的发生可以忽略不计) - 很可能(数据集为此优化)随后发生相同的查找 - 例如键 123 可能有一百万次查找,中间可能有键 456 的一次查找,然后再查找 123 的数百万次。然后查找具有可能相同键的下一组,依此类推
当然我可以使用哈希算法。但是为了给定的目的,我记得有一个搜索优化树,它以这样一种方式优化查找,即最近的查找位于树的最顶端。因此,您可能会使树的第一个节点直接命中 O(1),而无需哈希函数或哈希存储的模数。
我正在寻找这种算法来实现移动设备上图形渲染的原始性能。
【问题讨论】:
为什么不使用带有搜索计数器的简单堆?您可以将其存储在一个数组中,并执行正常的线性搜索。增加搜索到的key的计数器并对其进行upheap。这应该适用于非常不平衡的搜索模式。 @chepner 这样的树不需要在每次查找时重新组织,它需要自我更新,是的,但它很快,并且偶尔会重新组织。 移到最前面的列表可能对您的设置有所帮助。 你看过缓存策略吗,例如LRU 缓存策略? 【参考方案1】:也许是splay tree。
splay 树是一种自我调整的二叉搜索树,具有最近访问的元素可以快速再次访问的附加属性。
但是哈希表需要 O(1),所以你不应该期望一个明显优于另一个。
【讨论】:
正式地,未经证实的dynamic optimality conjecture 声明展开树具有 O(1) 竞争性,这意味着每个树操作序列都可以在运行时在任何其他可能动态的恒定因子内完成二叉搜索树 谢谢! Splay Tree 确实是我试图记住的。 我认为@Niklas B. 是对的——我会稍微改变一下树,让大多数recebt 搜索更快地到达根。就我的目的而言,对于始终预期的最佳情况,它也有 O(1),减去散列和取模(通过简单的比较,数百万次只是命中根节点)。 我接受你的回答,因为这是我忘记并要求的。虽然只有在做完折弯标记后,我才会看到最适合我的东西 - Niklas 的建议可能效果很好,甚至更好。【参考方案2】:我建议使用哈希表来完成这项工作。为了加快后续搜索,您可以将最近访问的 K 个不同元素缓存在一个数组中。如果 K 很小(
【讨论】:
我也在考虑这么小的缓存。我不知道这在内存受限的智能手机上的实际表现如何,但也肯定会对此进行基准测试。如果不是最佳选择,也可以为likeley 投票以上是关于查找“最近搜索”最有效的树或其他数据结构的主要内容,如果未能解决你的问题,请参考以下文章