How to find Nth Number in Catalan Numbers?
💻 coding

How to find Nth Number in Catalan Numbers?

2 min read 307 words
2 min read
ShareWhatsAppPost on X
  • 1Catalan numbers are a sequence of natural numbers used in various combinatorial counting problems.
  • 2The recursive approach to find the Nth Catalan number has a time complexity of O(4^n).
  • 3Using dynamic programming improves the time complexity to O(n^2) for calculating Catalan numbers.

AI-generated summary · May not capture all nuances

Key Insight
AskGif

"Catalan numbers are a sequence of natural numbers used in various combinatorial counting problems."

How to find Nth Number in Catalan Numbers?

In combinatorial mathematics, the Catalan numbers form a sequence of natural numbers that occur in various counting problems, often involving recursively-defined objects. They are named after the Belgian mathematician Eugène Charles Catalan (1814–1894).

The first Catalan numbers for n = 0, 1, 2, 3, … are

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, … (sequence A000108 in the OEIS).

Recursive Approach:

package dp;

public class CatalanNumbers {

	public static void main(String[] args) {
		int n = 10;
		
		long startTime = System.nanoTime();
		
		System.out.println(FindCatalanNumber(n));

		long endTime = System.nanoTime();
		long totalTime = endTime - startTime;
		System.out.println("Total Time (nanoseconds) : " + (totalTime));
	}

	private static int FindCatalanNumber(int n) {
		if(n==0)
			return 1;
		int sum = 0;
		for(int i=1;i<=n;i++)
			sum += FindCatalanNumber(i-1) * FindCatalanNumber(n-i);
		
		return sum;
	}

}
output:

16796
Total Time (nanoseconds) : 758183

The time complexity of the above solution is O(4^n).

Can we do it more efficiently?

Yes, By using Dynamic programming.

package dp;

public class CatalanNumbers {

	public static void main(String[] args) {
		int n = 10;
		
		long startTime = System.nanoTime();
		
		System.out.println(FindCatalanNumber(n));

		long endTime = System.nanoTime();
		long totalTime = endTime - startTime;
		System.out.println("Total Time (nanoseconds) : " + (totalTime));
	}

	static int[] dp = new int[15]; //currently expecting only 15 result items. 
							//increase the size if more is required.
	private static int FindCatalanNumber(int n) {
		if(n==0) {
			dp[0] = 1;
			return dp[0];
		}
			
		if(dp[n] != 0)
			return dp[n];
		
		int sum = 0;
		for(int i=1;i<=n;i++)
			sum += FindCatalanNumber(i-1) * FindCatalanNumber(n-i);
		
		dp[n] = sum;
		return dp[n];
	}

}
16796
Total Time (nanoseconds) : 267705

The time complexity of this implementation is O(n^2) because to compute CatalanNumber(n), we need to compute all of the CatalanNumber(i) values between ) and n-1, and each one will be computed exactly once, in linear time.

Enjoyed this article?

Share it with someone who'd find it useful.

ShareWhatsAppPost on X

AskGif

Published on 30 July 2018 · 2 min read · 307 words

Part of AskGif Blog · coding

You might also like

How to find Nth Number in Catalan Numbers? | AskGif Blog