作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
展开树插入/删除可以用不同的方式完成。一种流行的方法是插入 key 并将其展开到根。但是我读过还有一种不同的方法,这个想法是 拆分 它分成两棵树,左边的树有值<=插入键,右边的树有值>插入键。备用删除方法也是如此,将要删除的键张开到根,然后合并左右树。
但按照我的理解,
O(logN)
?如果有,怎么做?我尝试在互联网上搜索,但找不到任何答案。任何一种直觉都会非常有帮助:)
最佳答案
是的,摊销时间仍然是 O(log(n))。
直觉是展开树在单个操作的成本和不平衡之间的相互作用。确实,您可以查看一项操作并说“这非常昂贵”或“这会导致很多不平衡”,但是您需要同时考虑这两件事。
使用您的第一个示例,插入确实会导致巨大的不平衡,但它们中的每一个都是 O(1)。在 m 个这样的操作结束时,树是不平衡的,但此时,成本仅为 O(m)。在此之后,第一个不同的操作可能非常昂贵,但它也会减少不平衡。
一系列删除的直觉是相似的。直观地说,它也在这两者之间取得平衡。
关于algorithm - 伸展树(Splay Tree)的摊销分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64837659/
我是一名优秀的程序员,十分优秀!