[英]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.