繁体   English   中英

展开树现实生活中的应用

[英]Splay tree real life applications

您会在生产中的何处使用 splay-tree。 我的意思是一个真实的例子。

我正在考虑使用尝试和展开树来实现自动完成。 对于大型数据集,从节点 x 到叶子遍历trie 以返回结果并不是一个好主意,所以这个想法是在trie 中的节点内有一个展开树,所以当用户输入“sta”时,它会转到sta , 'a' - 节点,然后返回 splay 树中的前 5 个元素(通过 BFS/级别遍历,不一定会变异/修改树)

当然,在选择自动完成变体之后,我们应该遍历树并更新这些节点内的所有展开树。

由于张开树在并发环境中很敏感,我质疑它在生产中的使用

你的想法?

展开树不太适合很少或从不更改的数据,尤其是在线程环境中。 读取操作期间的额外突变会破坏内存缓存,并可能造成不必要的锁争用。 在任何情况下,对于只读数据结构,您都可以对最优树进行一次性计算。 即使该计算很慢,也不会影响长期执行时间。

我并不完全相信大型尝试很慢的说法,当然在自动完成程序的情况下也不会。 即使在不那么现代的硬件上,与用户键入字符所花费的时间相比,甚至与底层键盘驱动程序和输入处理器将按键传递到所需的时间相比,trie 遍历的成本也微不足道。你的申请。

如果您真的需要优化一个特里树,那么有充分的理由相信,一旦替代项可以放入缓存行中,就可以将根为特里树的混合数据结构与线性(或二分)搜索相结合。 这最大限度地发挥了特里大扇出的好处,同时避免了糟糕的缓存行为和行尾的过多存储开销。

展开树在经常修改的数据结构上最有用(如果它们真的有用的话)。 ckassic 示例是“绳索”数据结构(字符串段树),这是尝试通过避免大字符串副本来优化文本编辑器的一种方法。 与确定性树平衡算法(例如 RB 树)相比,展开树算法具有简单的优点,并且仅接触构成树遍历的一部分的节点。

然而,自平衡树库(许多现代编程语言的标准库的一部分)的现成可用性与经常令人失望的经验结果相结合,使 splay 算法充其量只是一个小众产品,尽管它确实是一个引人入胜的想法。

我在网络负载优化中发现了一个非常有趣的 splay 树用法,它被称为 SplayNet。 一个自治系统(我认为在 Facebook 下)可能在 2015 年左右实现了这一点,他们以某种方式设法将其内部通信负载降低了约 40%(?)。 所以Splaytrees有一个很好的用法!

几周前,我还阅读了有关 Splaytrees 取决于搜索序列中的传播的有用信息。 如果没有,你也可以使用二叉树或一些静态树。 但是现在有一个,Splaytrees 表现得更好(如果你使用无限时间)。

在我的论文中,我使用张开树作为实际搜索的预处理数据集合。 所以 splay 树只存储最常见的搜索请求的结果。 在下一步中,搜索从给定节点的展开树开始......我认为这对大数据集很有用,特别是如果它存储在不同的计算机/存储上,因此您的程序可以更好地猜测从哪里开始。 简单地说 - 我的 splaytrees 存储给定数据结构/数据集的常见问题解答:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM