- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试找出一种方法,利用每个节点都知道其平衡这一事实来计算树的高度。这个复杂度必须在 O(logn) 内
这是我到目前为止所得到的。
if(!node)
return 0
if(node.balance > 0)
return height(node.right) + 1
if(node.balance < 0)
return height(node.left) + 1
return max( height(T.left), height(T.right)) + 1
我的想法是,如果树右边很重,遍历右边而忽略左边。如果树左边很重,请忽略右边并继续穿过那里。但是,如果树是平衡的,我不知道该怎么办。到那时,我们不会被迫运行 max( height(T.left), height(T.right)) + 1
这意味着将访问子树中的每个节点,因此无论哪种方式都使这个复杂度为 O(n)?
最佳答案
作为平衡树的直接结果,高度/深度与树的大小相关联。因为 AVL 是平衡的,所以如果您知道它的大小,您可以使用它的结构在 O(1) 中计算树的深度:
lg N = log(N) / log(2) -- define a helper function for 2-log
depth N = 1 + floor(lg(N)) -- calculate depth for size N > 0.
想象树被填满时的样子:每个新的深度“级别”对应于所达到的树大小的阈值,即 2 的下一次幂。
您可以看出这是为什么:当树 N
的大小仅差二的幂时,树的最深行“用完了”。 1+
对应于当前正在填充的最深行,直到树的深度更改为下一个“级别”,floor(lg(N))
对应到树在前一个“级别”上的深度。
关于algorithm - O(logn) 中的 AVL 树高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33715179/
对于那些非常了解这一点的人,只需阅读下面的粗体文本以了解实际问题。 辅助函数前言: 我知道合并两个相同等级的二项式树的复杂度为 O(1),因为所需要做的只是将 T1 的头部附加为另一个的 child
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
for(int i=1;i*i
有谁知道我可以在最坏情况下 O(logn) 访问和删除第 k 项的数据结构,并且还支持在最坏情况下 O(logn) 下在第 k 项之后插入一项的操作? 最佳答案 是的。您所描述的可以通过增强树来实现。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
实现合并所需的操作数是: ::::::6n (logn+1)= 6nlogn+6n. logn+1 是归并排序的层数。这里的 6n 是什么? 最佳答案 在原始合并排序的情况下:两次读取比较两个元素,一
我的算法课有问题。问题状态: Assume you are given an array of n integers in the range{1,...,logn**logn}. Show how
是否有一种类似集合的数据结构支持O(logn)时间的合并和O(logn)时间的第k个元素搜索? n 是这个集合的大小。 最佳答案 你可以试试 Fibonacci heap它确实在恒定摊销时间内合并并在
log n^2 等同于 2logn,它以与 logn 相同的速率增长,因为我忽略了因子和常量。但是,如果我要对整个项进行平方,以便得到 (logn)^2,它是否也是 logn 的大 theta? 最佳
Java TreeSet 类可以维持 add 方法的 O(logN) 成本。如果数据按排序顺序输入,这是如何工作的? 既然二叉搜索树的 add 方法在给定排序数据时会退化为 O(N),为什么 Tree
我有一个家庭作业问题如下(请注意,我不是在寻找确切的答案,只是在寻找简单的建议以继续前进)。 S is a data structure which supports Insert(x,S), Del
我正在使用一个优先级队列,该队列最初将其元素的优先级基于启发式方法。随着元素出队,启发式更新,并且当前队列中的元素的键可能会增加。 我知道有一些已摊销O(1)减少键操作的堆(特别是斐波那契堆),但是是
这个问题已经有答案了: Binary Search O(log n) algorithm to find duplicate in sequential list? (3 个回答) 已关闭 6 年前。
#include int powFast(int b, int e){ if(e==1){ return b; } else if(e%2 ==0){
这可能吗?我想到了这个: void binary_search(int list[], int lo, int hi, int key, int* maxIndex, int* minIndex) {
我已经为一个挑战编写了以下解决方案,但我不确定它的时间复杂度: def ASCIIConversion(string): newStr = '' for chr in string:
以下是一段 python 代码,用于使用 Goodrich 和 Tamassia 一书中的二进制递归查找元素列表的总和。 def binary_sum(S, start, stop): "
我想计算字典中给定值的项目数(假设字典中的值只是数字),我在网上搜索并找到了两种方法,first one : sum(x == chosen_value for x in d.values()) 第二
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 4 年前。 Improve t
我的问题 (您可以跳过此部分并转到下一部分以了解实际问题。这只是为那些真正想知道“您到底为什么要问这个?”的人提供的背景信息) 想象一个物体从无摩擦的山坡上滑下。有加速度为 0 的平坦区域。其余路径的
我是一名优秀的程序员,十分优秀!