Algorithm 求解while循环时间复杂度算法

Algorithm 求解while循环时间复杂度算法,algorithm,time-complexity,Algorithm,Time Complexity,我很难计算出我的算法的时间复杂度。我知道算法的“for”部分将在O(n)中运行,但我不确定while循环。问题涉及从给定向量创建二叉树。每个节点都会根据其值及其在向量中的索引进行计算,因此,本质上,每个后续节点都必须位于前一个节点的右侧,并且根据其值是大还是小,它将是子节点还是父节点。父节点的子节点的值必须较小 对于子节点小于下一个要放置的节点的情况,我使用了while循环,并且我跟踪父节点,直到找到要放置新节点的位置。我相信在最坏的情况下,它会运行k-1次,k是树的深度,但我如何将其表示为时间

我很难计算出我的算法的时间复杂度。我知道算法的“for”部分将在O(n)中运行,但我不确定while循环。问题涉及从给定向量创建二叉树。每个节点都会根据其值及其在向量中的索引进行计算,因此,本质上,每个后续节点都必须位于前一个节点的右侧,并且根据其值是大还是小,它将是子节点还是父节点。父节点的子节点的值必须较小

对于子节点小于下一个要放置的节点的情况,我使用了while循环,并且我跟踪父节点,直到找到要放置新节点的位置。我相信在最坏的情况下,它会运行k-1次,k是树的深度,但我如何将其表示为时间复杂性?O(千牛)?这是线性的吗

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;
        }
    }
}
for(int i=0;i向量源at(i-1))和&(m_地图索引at(i-1)->parent)){
intv=m_map_index_noeud.at(i-1)->parent->index;
而((向量源于(i)>=向量源于(v))){
v=m_map_index_noeud.at(v)->parent->index;
}
}
}

请允许我将其简化为伪代码:

#我假设这需要常数或线性时间
为i=0做这件事
因为我← 1至n-1:
如果源[i]>源[i-1]和节点[i]不是根节点:
v← 节点[i-1].parent.index
而source[i]>source[v]:
v← 节点[v].parent.index
如果我从代码中正确理解了它,那么您的分析是正确的:外循环迭代O(n)次,内循环迭代O(h)次,其中h是树的高度,因此时间复杂度为O(nh)

这不是线性时间,除非保证h至多是一个常数。通常,对于平衡树,h是O(logn),对于不平衡树,h是O(n)