步行穿过层树的复杂性

时间:2015-07-30 15:46:10

标签: c++ algorithm tree time-complexity

我有一个看起来像这样的图层树 enter image description here

第一层树是一个平衡的二叉搜索树,它以特定的顺序存储一些数据(比如整数)。第1层树的每个节点v包含一个指向平衡二叉搜索树根的指针,称为第2层树,将Sv1(v的子树)的点存储在它的叶子上。

现在有一个更新函数,它接受像p这样的输入,其行为如下:

  

在第一层树中搜索p,对于搜索路径上的每个节点v,在第二层中搜索p,让Lv成为搜索结束的第二层树的叶子。然后从Lv开始走回v的第二层树的根,并为路径上的每个节点重新计算它的值。

我的书说这个动作可以用lg ^ 2(n)执行(n是第一层树中的节点数)。但我不明白怎么做。这是我为此任务编写的算法:

L1Search(LayerOneNode* n){
    if (n == NULL) return;
    if (n->data < p)
        L1search(n->left);
    if (n->data > p)
        L1search(n->right);
    L2Search(n->pointerToLayerTwoRoot); //For each node on the search path
}
L2Search(LayerTwoNode* n){// Start at the leafs of the Layer-Two tree and go up
    if (n == NULL) return;
    L2search(n->left);
    L2search(n->right);
    computeTheValueForThisNode();
}

我不确定,但我认为算法的复杂性是n * lg(n)而不是lg ^ 2(n)。我对吗?是否有更好的算法来执行此任务?

1 个答案:

答案 0 :(得分:1)

在第1层树中搜索时,您最多会遍历height(tree)个节点。平衡二叉树的高度为lg(n)lg为基数2对数)。对于这些lg(n)节点中的每一个,您基本上在另一个树中重复搜索,其中元素的数量&lt; = n(因为它是一个子树)。此搜索再次花费您lg(n)。由于您对第一个搜索路径中的每个lg(n)元素执行第二次搜索(费用为lg(n)),因此产生的复杂性为乘法lg(n)*lg(n)