Yesterday Rick Wicklin showed a cool SAS/IML function to use a matrix and print a Pascal’s triangle. I come up with an alternative solution by using a vector in SAS/IML.
Method
Two functions are used, including a main function
PascalRule
and a helper function _PascalRule
. The helper function recycles the vector every time and fills the updated values; the main function increases the length of the vector from 1 to n.Pro
Get the nth row directly, for example, return the 10th row by
PascalRule(10)
; no need to use a matrix or matrix related operators; use less memory to fit a possibly bigger n
.Con
More lines of codes; slowlier to print the triangle, since there is no data structure such as matrix to remember the transient numbers.
proc iml;
/* The main function */
start PascalRule(n);
if n <= 1 then
return({1});
answer = {1, 1};
do i = 1 to n - 2 ;
answer = _PascalRule(answer);
end;
return(answer);
finish;
/* The helper function */
start _PascalRule(vector);
previous = 1;
do i = 2 to nrow(vector);
current = vector[i];
vector[i] = previous + current;
previous = current;
end;
vector = vector // {1};
return(vector);
finish;
/* Print the pascal's triangle */
do i = 1 to 10;
x = PascalRule(i);
x = x`;
print x;
end;
quit;
Theoretically, Rick’s solution has a time complexity of
O(N^2)
and a space complexity of O(N^2)
, while my solution has a time complexity of O(N^3)
(unfortunately have to use three times of do loop
in IML) and a space complexity of O(N)
. Actually it's a trade-off between speed and memory cost.
No comments:
Post a Comment