如何找到达到给定高度h的BST数量,并丢弃高度大于h的所有BST,以获得给定的一组唯一数字?
我使用递归方法编写了代码
static int bst(int h,int n){
if(h==0&&n==0)return 1;
else if(h==0&&n==1)return 1;
else if(h==0&&n>1)return 0;
else if(h>0&&n==0)return 1;
else{
int sum=0;
for(int i=1;i<=n;i++)
sum+=bst(h-1,i-1)*bst(h-1,n-i);
return sum;
}
}
答案 0 :(得分:0)
您可以通过在评论中建议的@DavidEisenstat添加备忘录来加快速度。
您可以创建一个memoization表来存储已计算结果的值。
在示例中,-1
表示尚未计算该值。
c ++中的示例
long long memo[MAX_H][MAX_N];
long long bst(int h,int n){
if(memo[h][n] == -1){
memo[h][n] = //Compute the value here using recursion
}
return memo[h][n];
}
...
int main(){
memset(memo,-1,sizeof memo);
bst(102,89);
}
这将在O(h*n)
中执行,因为您只会为每对bst
和n
计算一次h
。该技术的另一个优点是,一旦表填满,bst将以O(1)响应(对于表格范围内的值)。
请注意不要使用高于MAX_H
和MAN_N
的值来调用该函数。另外请记住,memoization是一个记忆时间的权衡,意味着你的程序运行得更快,但它也会使用更多的内存。