如何解决为什么摊销树的摊销分析仅关注摊销操作而不考虑向下搜索
展开树中的每个字典操作都使用展开操作将节点带到树的根。通常使用潜在方法来分析此展开操作的摊销效率,并在许多在线资源(包括Wikipedia)页面中进行了描述。然后将此扩展操作的摊销时间报告为O(m lg n)。
但是,我在任何地方都找不到对完整字典操作(例如插入,删除,...)的实际分析。 这些操作中的每一个除了使用splay操作外,还使用向下搜索树的方式来找到要插入或删除的节点的正确位置。只有找到该节点之后,您才能启动splay操作。
人们倾向于发表如下声明:
- "the complexity of splay tree operation is the same as that of the associated splay"
- [“对于我们的分析,我们注意到执行搜索,插入或删除的时间 与相关的展开时间成正比”],Goodrich书的第456页标题为“ C ++中的数据结构和算法”
我有两个问题:
- 如何能够得出这样的结论:执行搜索的时间与展开的时间成正比?这种暗示意味着向下遍历节点的时间也与展开的关系成正比?
- 向下遍历的摊销时间效率是多少?它是一个常数,仅仅是因为您不通过简单地进行向下遍历来改变树的结构(因此您的潜力保持不变)吗?这个常数不是= N,因为这是最坏的情况吗?
一个人如何得出这个结论?
解决方法
如何能够得出这样的结论:执行搜索的时间与展开的时间成正比?这种暗示意味着向下遍历节点的时间也与展开的关系成正比?
展开阶段对搜索阶段中遍历的每个节点进行操作。由于搜索阶段在每个节点上所做的工作是恒定的,因此我们可以推断出,在任何操作序列中,search = O(splay),因此O(search + splay)= O(splay)。
向下遍历的摊销时间效率是多少?它是一个常数,仅仅是因为您不通过简单地进行向下遍历来更改树的结构(因此您的潜力保持不变)吗?这个常数不是= N,因为这是最坏的情况吗?
是的,如果可以搜索而无需随后展开。由于前面讨论的原因,我们将它们视为不可分割的,因此有效地我们将一个冗长的花销用来覆盖该搜索的摊销额乘以一个常数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。