algorithm - 求解while循环时间复杂度算法
问题描述
我很难弄清楚我的算法的时间复杂度。我知道算法的“for”部分将在 O(n) 中运行,但我不确定我的 while 循环。该问题涉及从给定向量创建二叉树。每个节点都根据其值及其在向量中的索引进行评估,因此,基本上,每个后续节点都必须位于前一个节点的右侧,并且根据其值是更大还是更小,它将是子节点或父节点。父节点的子节点的值必须更小。
在子节点小于要放置的下一个节点的情况下,我使用了 while 循环,并且我跟踪父节点,直到找到要放置新节点的位置。我相信这会在最坏的情况下运行 k-1 次,k 是树的深度,但是我如何将其表示为时间复杂度?O(kn)? 那是线性的吗?
for(int i = 0; i < vecteur_source.size(); i++){
if( i == 0){
do bla....
}else if((vecteur_source.at(i) > vecteur_source.at(i-1)) && (m_map_index_noeud.at(i-1)->parent)){
int v = m_map_index_noeud.at(i-1)->parent->index;
while ((vecteur_source.at(i) >= vecteur_source.at(v))){
v = m_map_index_noeud.at(v)->parent->index;
}
}
}
解决方案
请允许我将其简化为伪代码:
# I'm assuming this takes constant or linear time
do the thing for i = 0
for i ← 1 to n-1:
if source[i] > source[i-1] and nodes[i] is not the root node:
v ← nodes[i-1].parent.index
while source[i] > source[v]:
v ← nodes[v].parent.index
如果我从您的代码中正确理解了它,那么您的分析是正确的:外部循环迭代 O( n ) 次,内部循环迭代最多 O( h ) 次,其中h是树的高度,因此时间复杂度为 O( nh )。
这不是线性时间,除非h被保证最多是一个常数。更常见的是,平衡树的h为 O(log n ),不平衡树的最坏情况为 O( n )。
推荐阅读
- nginx - Nginx proxy_bind UDP负载均衡无法工作
- java - 在 100,000 个项目的快速排序算法上获取 StackOverFlowError,我该如何解决?
- ios - 移动 safari 无法打开深层链接
- c++ - 如何检查sqlite数据库的完整性?
- javascript - json的Javascript数组打印为空,但里面有一个对象
- haskell - 在 Haskell 中增加元组计数的函数
- github - Github 合并 API 返回 404 Not Found
- google-cloud-platform - 您可以更改 Google Cloud 项目的组织所有权吗
- javascript - 使用 Jquery 在 Json 数据的 html 可扩展表中显示数据
- powerbi - Power BI 中的关系创建困难