Вы можете ускорить его путем добавления запоминания, как @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 - это компромисс между памятью, то есть ваша программа будет работать быстрее, но она также будет использовать больше памяти.
Подробнее: https://en.wikipedia.org/wiki/Memoization
Динамическое программирование, как всегда. –
Я знаю, как вычислить общее количество bsts, которые формируются с n числом узлов, используя динамическое программирование. Но что, если нам нужно ограничить высоту дерева определенным числом. –
Например, для 4 узлов число bsts равно 14. Но что мы хотим ограничить высоту дерева до 3. Теперь количество деревьев будет меньше. –