Catalan numbers are a sequence of natural numbers that occurs in many interesting counting problems like following.
1) Count the number of expressions containing n pairs of parentheses which are correctly matched. For n = 3, possible expressions are ((())), ()(()), ()()(), (())(), (()()).
2) Count the number of possible Binary Search Trees with n keys (See this)
See this for more applications.
The first few Catalan numbers for n = 0, 1, 2, 3, … are 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …
Recommended: Please solve it on “PRACTICE ” first, before moving on to the solution.
Recursive Solution
Catalan numbers satisfy the following recursive formula.
Following is the implementation of above recursive formula.
PHP
<?php // PHP Program for nth // Catalan Number // A recursive function to // find nth catalan number function catalan( $n ) { // Base case if ( $n <= 1) return 1; // catalan(n) is sum of // catalan(i)*catalan(n-i-1) $res = 0; for ( $i = 0; $i < $n ; $i ++) $res += catalan( $i ) * catalan( $n - $i - 1); return $res ; } // Driver Code for ( $i = 0; $i < 10; $i ++) echo catalan( $i ), " " ; // This code is contributed aj_36 ?> |
1 1 2 5 14 42 132 429 1430 4862
Dynamic Programming Solution
We can observe that the above recursive implementation does a lot of repeated work (we can the same by drawing recursion tree). Since there are overlapping subproblems, we can use dynamic programming for this. Following is a Dynamic programming based implementation in C++.
PHP
<?php // PHP program for nth Catalan Number // A dynamic programming based function // to find nth Catalan number function catalanDP( $n ) { // Table to store results // of subproblems $catalan = array (); // Initialize first two // values in table $catalan [0] = $catalan [1] = 1; // Fill entries in catalan[] // using recursive formula for ( $i = 2; $i <= $n ; $i ++) { $catalan [ $i ] = 0; for ( $j = 0; $j < $i ; $j ++) $catalan [ $i ] += $catalan [ $j ] * $catalan [ $i - $j - 1]; } // Return last entry return $catalan [ $n ]; } // Driver Code for ( $i = 0; $i < 10; $i ++) echo catalanDP( $i ), " " ; // This code is contributed anuj_67. ?> |
1 1 2 5 14 42 132 429 1430 4862
Time Complexity: O(n^2)
Auxiliary Space: O(n)
Please refer complete article on Program for nth Catalan Number for more details!
<!–
–>
Please Login to comment…