[英]Multiple time complexity solutions for recursive Pascal triangle algorithm?
我在Java中創建了以下簡單算法,該算法以2D整數列表的形式遞歸地計算Pascal三角形:
public class PascalTriangleRec{
private final int[][] points;
public PascalTriangleRec(int size){
points = new int[size][];
for (int i =0;i<size;i++){
int[] row = new int[i+1];
for (int j = 0;j<=i;j++){
row[j]=getValueAtPoint(i,j);
}
points[i]=row;
}
}
public static int getValueAtPoint(int row, int col){
if (col == 0 || col == row) return 1;
else return getValueAtPoint(row-1,col-1) + getValueAtPoint(row-1,col);
}
}
我需要知道此算法的時間復雜度。 我在StackOverflow上發現了另一個問題 ,該問題給出了getValueAtPoint函數的時間復雜度為O(2 ^ n / sqrt(n))。 我發現由於此函數嵌入在兩個嵌套的for循環中,因此整個Pascal三角形的時間復雜度為O(sqrt(n ^ 3)* 2 ^ n)。 我很確定這個推理是正確的。
另一方面,我設計了一種完全不同的方式來考慮此問題,方法如下:
有一個Pascal三角形的特定屬性,稱為Pascal推論8。此屬性表明,給定行r上所有系數的總和等於2 ^ r,其中r從0開始。
還可以注意到,我的代碼示例中的getValueAtPoint函數將繼續遞歸調用自身,直到在某個點返回1為止。 這意味着Pascal三角形中的所有系數都是該系數的值的1乘以1。
由於加1需要固定的時間,因此可以說計算三角形中給定行所需的時間等於某個恆定時間乘以該行中所有系數的總和。 這意味着三角形中給定行r的時間復雜度必須為2 ^ r。
計算整個三角形所需的時間等於計算三角形中所有行所需的時間總和。 這產生了一個幾何級數,該級數計算出r的所有2 ^ r的和從0到n-1。
使用幾何級數的求和屬性,可以按以下形式重寫該級數。
這意味着根據該最后推導的算法的時間復雜度為O(2 ^ n)。
盡管這兩種方法在我看來都是合乎邏輯且正確的,但它們會產生不同的結果。 我的問題首先是這兩種方法是否正確,以及同時可以認為這兩種方法都正確嗎? 在我看來,這兩種方法都是正確的,但是第二種方法更准確,因為對於第一種方法, getValueAtPoint函數采用的是最壞的情況,並應用於所有系數,而實際上並非如此。 這是否意味着即使第一個方法背后的邏輯是正確的,也只是因為存在更好的方法,第一個方法才變得不正確?
簡單的答案是“變量太多”。 首先,您的分析是完全正確的:復雜度取決於所計算的所有值的總和。 答案也是O(2 ^ n / sqrt(n))的基礎。
有兩個問題:
嘗試對先前的復雜度進行從0到n的總和,看看會得到什么?
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.