程序设计=数据结构+算法
什么是数据结构?
数据对象在计算机中的组织方式(数据元素之间存在的一种或多种特定关系的集合),数据对象一定与加在其上的操作有关系,相关联,而完成这种操作所用的方法就是算法。解决问题方法的效率跟数据的组织方式、空间利用效率有关、算法巧妙程度有关。 数据结构分为逻辑结构(集合结构、线性结构、树形结构、图形结构)和物理结构(从存储形式上分为顺序存储和链式指针存储)。
解决问题方法的效率跟数据的组织方式有关:
例1:写一个程序,按顺序打印1~N个正整数,分别用循环和递归来实现。
//循环实现 #include <iostream> using namespace std; int main() { int n = 0; scanf_s("%d", &n); for (int i = 1; i <= n; i++) { printf("%d\n", i); } return 0; }
//递归实现 #include <iostream> using namespace std; void printN(int n) { if(n) { printN(n - 1); printf("%d\n", n); } return; } int main() { int n = 0; scanf_s("%d", &n); printN(n); return 0; }
总结:当N=10,100,1000,10000的时候,两个程序都可以实现功能,但是当N=100000时候,循环方法可以实现,递归由于内存不足,出错。原因是递归方法虽然看起来简单明了,但是需要的空间大,在调用数值过大的时候,会超出计算机所能计算的内存,一你吃会报错。
解决问题方法的效率与空间的利用效率有关
例2:求解多项式
可用两种方法拆分,
法一:普通形式
![]()
法二:变换形式
![]()
//计算多项式在定点x处的f(x)值 #include <stdio.h> #include <math.h> #include <time.h> static const int MAX = 100000; clock_t start, stop; //clock_t是clock()函数返回的变量类型 double duration; //被测记录运行时间,以秒为单位 //法一: double f1(int n, double a[], double x) { double p = a[0]; for (int i = 1; i <= n; i++) { p += (a[i] * pow(x, i)); } return p; } //法二: double f2(int n, double a[], double x) { double p = a[n]; for (int i = n; i > 0; i--) p = a[i - 1] + x*p; return p; } int main() { double a[MAX]; for (int i = 0; i < MAX; i++) a[i] = (double)i; //法一运行时间 start = clock(); f1(MAX - 1, a, 2); stop = clock(); duration = ((double)(stop - start)) / CLK_TCK / MAX; printf("duration=%f\n", (double)(stop - start)); //法二运行时间 start = clock(); f2(MAX - 1, a, 2); stop = clock(); duration = ((double)(stop - start)) / CLK_TCK / MAX; printf("duration=%f\n", (double)(stop - start)); return 0; }
结果:
总结:用不同方式解决同一个问题,虽然都能解决,但是运行时间上有很大差别。
解决问题方法的效率与算法的巧妙程度有关