生成Pascal Triangle的最佳方法

时间:2012-08-24 20:12:34

标签: c space-complexity pascals-triangle

我使用级别顺序遍历的概念来生成Pascal Triangle。

以下是代码段:

void printPascalTriangle(int n)
{
    int line=1,Q[50]={0},f=-1,r=-1,prev,t;

    Enqueue(Q,&f,&r,1);
    Enqueue(Q,&f,&r,0);

    prev=0;
    while(line!=n)
    {
            t = Dequeue(Q,&f,&r);

            if( !t )
            {
                    line++;
                    prev = 0;
                    Enqueue(Q,&f,&r,1);

                    if(!isEmpty(&r))
                            Enqueue(Q,&f,&r,0);

                    printf("\n");
            }
            else
            {
                    printf("%d ", t);
                    Enqueue(Q,&f,&r,prev+t);
                    prev = t;
            }
    }
}

完整代码为here

这种方法的优点是它的空间复杂度是O(N),其中N是行数。

还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

由于你唯一关心的是空间复杂性,并且你正在使用int(而不是某种大整数类型的潜在无限大小),你实际上可以实现O(1)的空间复杂度通过使用这两个事实:

  • C n ,0)= 1表示0≤ n
  • C n k +1)= C n k )×( n - k )/( k + 1)0≤ k < 名词

这两个事实意味着您可以仅使用同一行的前一个元素计算每个元素,因此您不必一次保存多个元素。

(通过 C n k )我的意思是行 n 中的元素,位置 k Pascal的三角形,假设行和位置从0开始编号。)

答案 1 :(得分:0)

我认为您想要的是代码,而不是方程式?这是两种JavaScript实现,一种带有阶乘计算,另一种不带阶乘计算。我不确定要选择哪一个:

//1. non-factorial option
function GenerateTriangle1(rows) {
    var pascalsTriangle = [];

    for (var r = 0; r < rows; r++) {
        var elements = r + 1;
        var level = [];

        for (var i = 0; i < elements; i++) {
            if (i === 0 || i === elements - 1 || r === 1)
                level[i] = 1;
            else {
                var prevRow = pascalsTriangle[r - 1];
                level[i] = prevRow[i - 1] + prevRow[i];
            }
        }

        pascalsTriangle[r] = level;
    }

    return pascalsTriangle;
}

//2. Factorial option
function GenerateTriangle2(rows) {
    var pascalsTriangle = [];

    for (var r = 0; r < rows; r++) {
        var elements = r + 1;
        var level = [];

        for (var i = 0; i < elements; i++) {
            level[i] = CalculateTerm(r, i);
        }

        pascalsTriangle[r] = level;
    }

    return pascalsTriangle;
}

function CalculateTerm(row, term) {
    var divisor = Factorial(term) * Factorial(row - term);
    return divisor > 0 ? Factorial(row) / divisor : 1;
}

function Factorial(n) {
    return n > 1 ? n * Factorial(n - 1) : n;
}

console.log(GenerateTriangle1(4))
console.log(GenerateTriangle1(5))