第一层树是一个平衡的二叉搜索树,它以特定的顺序存储一些数据(比如整数)。第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)。我对吗?是否有更好的算法来执行此任务?
答案 0 :(得分:1)
在第1层树中搜索时,您最多会遍历height(tree)
个节点。平衡二叉树的高度为lg(n)
(lg
为基数2对数)。对于这些lg(n)
节点中的每一个,您基本上在另一个树中重复搜索,其中元素的数量&lt; = n(因为它是一个子树)。此搜索再次花费您lg(n)
。由于您对第一个搜索路径中的每个lg(n)
元素执行第二次搜索(费用为lg(n)
),因此产生的复杂性为乘法lg(n)*lg(n)
。