Algorithm 顺序遍历中的avl树
设我们是一组动态整数。设n=| S |。描述S到S上的数据结构 以所需的性能保证支持S上的以下操作: •在O(对数n)时间内向S插入新元素 •在O(对数n)时间内从S中删除一个元素 •在O(k)时间内报告任何满足1的k个最小元素≤ K≤ n 您的结构必须始终消耗O(n)空间Algorithm 顺序遍历中的avl树,algorithm,traversal,avl-tree,Algorithm,Traversal,Avl Tree,设我们是一组动态整数。设n=| S |。描述S到S上的数据结构 以所需的性能保证支持S上的以下操作: •在O(对数n)时间内向S插入新元素 •在O(对数n)时间内从S中删除一个元素 •在O(k)时间内报告任何满足1的k个最小元素≤ K≤ n 您的结构必须始终消耗O(n)空间 我可以简单地构建一个AVL树,然后按顺序遍历打印出前3个元素吗 您建议的解决方案在O(k)时间内不起作用。开始顺序遍历需要O(logn)时间。即使在找到一个元素后停止,仍然需要首先到达最左边的叶子 我可以想出两种解决办法:
我可以简单地构建一个AVL树,然后按顺序遍历打印出前3个元素吗 您建议的解决方案在O(k)时间内不起作用。开始顺序遍历需要O(logn)时间。即使在找到一个元素后停止,仍然需要首先到达最左边的叶子 我可以想出两种解决办法:
使用优先级队列,该队列使用O(n)空间。插入和删除都是O(logn)操作。Find min是O(1),然后remove min是O(k),可以重复三次。我决定在根节点存储并更新最左侧的节点指针,并在每个节点上存储指向前置节点和后续节点的指针 因此,每次插入都要花费O(logn)进行插入,并且O(logn)+O(logn)要找到前置和后继,O(logn)+O(logn)+O(logn)=O(logn) 这些指针还允许在O(1)中插入后,受影响节点指针的更新分别移动到前置或后继,并在O(1)中更新这些指针
将指针指向最左边的根节点意味着在O(1)处移动,然后在O(k)时间内遍历后续节点并打印前k个节点。
可以[I]简单地构建一个AVL树并[使用顺序遍历打印前3个元素?
100万个元素需要多少时间?100万个?a?标准答案是一个平衡的、线程化的二叉搜索树。这是一个BBST,它使用叶节点中的空指针。这些指针按排序将节点连接到一个接近链表的位置。在每次插入或删除(每次节点触摸的固定时间)时,您只能用O(logn)额外时间来维护指针。您可以在O(k)上列出前k个节点通过从列表的开头遍历来节省时间。有一个相当漂亮的实现,可以替代在内存不足的时候使用父引用的方法是-将引用添加到最左侧和/或最右侧的节点(不是叶节点)根据需要。有这些额外的指针会违反空间限制吗?@101ldaniels每个节点的指针数量是恒定的-空间复杂度仍然是O(n)in remove min is O(log n)你是对的。我的错。我将把这个答案留在这里提醒自己不要愚蠢。