当杨辉三角遭遇百万行数量级时

一直以为,杨辉三角只是一个很小儿科的问题……直到那一天,我遇见了它……

输出杨辉三角的前一百万行,假设屏幕足够宽。

第一次初识它时,只觉得天空很蓝,云淡风清。后来叫了GCC和VC过来和它认识了一下以后,狂风大作,昏天黑地。

在我所了解到的知识中,杨辉三角的输出算法比较简单的有两种,一种是需要申请数组的,用前一行的值计算出下一行的值;另一种是不需要申请数组的,直接根据行号来得出每一个数。输出10行的简单demo分别如下:

//需要申请数组的
int a[10] = {0};

a[0] = 1;
a[1] = 1;
cout << “1″ << endl;
cout << “1 1″ << endl;

for(int i = 2; i < 10; i++)
{
for(int j = i; j > 0; j–)
{
a[j] = a[j] + a[j-1];
cout << a[j] << ” “;
}
cout << “1″ << endl;
}

这是第一种,需要申请一个行号那么大的数组。

//不需要申请数组的
for(int i = 1; i <= 10; i++)
{
int n = 1;
cout << n << ” “;
for(int j = 1; j < i; j++)
{
n = n*(i-j)/j;
cout << n << ” “;
}
cout << endl;
}

这种不需要申请数组,每次根据行号来计算每一个数,只需要存储个中间变量就行了。

本来以为,我只要抛出上面两种方面中随便一种,就可以秒杀此题的,后来才发现,一切都不是那么简单的……

分析:

一、栈空间的限制。分配一个int[1000000]在栈中是不行的,经过我的测试,在GCC下,如果main函数里面除了这个数组和一个循环变量外什么其它变量都不申请,最多可以申请int[520635],否则将产生段错误;而在VC下,这个数字更是将减少到258651。这应该就是默认分配的一个函数的栈空间大小,估算一下GCC编译器下应该是2MB,而VC下应该是1MB。所以分配一个1000000的int至少需要扩容栈空间后才能做,或者,将其分配到堆空间或静态区。

二、数据溢出。在杨辉三角计算到第31行时,int型数据就已经溢出,这样一样,就算我申请为__int64等类型,那也肯定是过不了百行的,数据用什么样的数据类型或结构存储很成问题。

眼下,这两个问题都还在构思中,没有什么太好的解决方案,各位看官如果有什么好想法交流下哈……

也许,继续思考会让我认识到更多的问题……

待续。期望能将它解决掉。

你可能感兴趣的:(算法,gcc,测试,存储,编译器)