标签:
用计算机解决现实生活与生产问题是计算机编程的核心意义,那么如何高效的解决问题就成为我们必须关注的问题,数据结构与算法正是为了高效的解决问题也引入的两个概念,这两个概念相互联系,密不可分。
我们从下面几个实际问题来理清楚它们的关系:
对于书架上的图书,我们只涉及两个核心的操作:1)新书怎么插入;2)怎么找到某本指定的书;
针对于上面提到的两个问题,我们可以提出三种图像摆放的方法:
另外,对于第3种方法,我们还有一些东西需要考虑,如:每一类分配的摆放空间大小以及图像书类别划分多少的问题。
对于每一种摆法其实对应了一种数据结构,那么对于这不同的数据结构,涉及到图书的两种操作执行起来效率自然是不一样的。从上面的图书摆放的问题,可以知道
解决问题的方法的效率与数据的组织方式(数据结构)有关。
对于这一个问题,我们可以有两个方法:1)利用循环从0打印到N; 2)利用递归,先打印0~N-1,再打印N。
我们知道方法一利用循环,很快能解决问题;而方法二中运用了递归,会让程序占用大量的空间。当N很大的时候,可能会空间溢出,程序没有结果输出。所以,从这个例子中我们知道:
解决问题方法的效率跟空间的利用效率有关。
对于多项式$f(x) = a_0+a_1x+\cdots+a_nx^n$,我们也有两种方法来求解。 对于任意的$x$,我们可以直接带入到原多项式中,只是这里每一项都需要算一$x$的指数。 另一种方法是,把原多项式转化为$f(x) = a_0+x(a_1+x(\cdots(a_{n-1}+x(a_n))\cdots))$,我们从$a_n$项开始算起,就避免了指数运算。 显然方法二的效率更高,因为它避免了大量的指数运算。 我们也可以在算法里 保存每次$x^i$的值,下次只用做一次乘法即可。 从这个例子,我们可以看出:
解决问题方法的效率跟算法的巧妙程序有关
数据对象在计算机中的组织方式可以分为逻辑结构与物理存储结构。
数据对象必定与一系列加在其上的操作相关联。
完成这些操作所用的方法就是算法。
/*矩阵的抽象数据类型定义*/ template<typename ElementType> class CMatrix { private: ElementType * data; int rows; int cols; public: CMatrix(int M, int N); //创建一个M*N的空矩阵 int GetMaxRow(); // 返回矩阵的总行数 int GetMaxCol(); // 返回矩阵的总列数 ElementType GetEntry(int i, int j); // 返回第i行第j列的元素 friend CMatrix Add(CMatrix A, CMatrix B); //两个矩阵的加法 friend CMatrix Multiply(CMatrix A, CMatrix B); // 如果A的列数等于B的列数,则返回C=AB,否则返回错误
算法其实就是解决问题的步骤,它有几个特点:
好的算法需要具有良好的时间复杂度与空间复杂度。
在分析一般算法的效率真时,我们经常关注下面两种复杂度:
它们之间有如下关系为:$T_{avg}(n) \le T_{worst}(n)$
标签:
原文地址:http://www.cnblogs.com/ronny/p/4374141.html