码迷,mamicode.com
首页 > 编程语言 > 详细

数据结构与算法的基本概念

时间:2015-03-28 15:41:25      阅读:324      评论:0      收藏:0      [点我收藏+]

标签:

用计算机解决现实生活与生产问题是计算机编程的核心意义,那么如何高效的解决问题就成为我们必须关注的问题,数据结构与算法正是为了高效的解决问题也引入的两个概念,这两个概念相互联系,密不可分。

我们从下面几个实际问题来理清楚它们的关系:

1. 书架上摆放图书问题

对于书架上的图书,我们只涉及两个核心的操作:1)新书怎么插入;2)怎么找到某本指定的书;

技术分享

针对于上面提到的两个问题,我们可以提出三种图像摆放的方法:

  1. 随便放。(无索引的集合)
  2. 按书名的拼音字母顺序排放。(顺序结构)
  3. 先分大类,每个大类内再按字母顺序排放。(树状结构)
  4. 更多的想法?(建立索引表)

另外,对于第3种方法,我们还有一些东西需要考虑,如:每一类分配的摆放空间大小以及图像书类别划分多少的问题。

对于每一种摆法其实对应了一种数据结构,那么对于这不同的数据结构,涉及到图书的两种操作执行起来效率自然是不一样的。从上面的图书摆放的问题,可以知道

解决问题的方法的效率与数据的组织方式(数据结构)有关。

2. 打印正整数0~N的问题

对于这一个问题,我们可以有两个方法:1)利用循环从0打印到N; 2)利用递归,先打印0~N-1,再打印N。

我们知道方法一利用循环,很快能解决问题;而方法二中运用了递归,会让程序占用大量的空间。当N很大的时候,可能会空间溢出,程序没有结果输出。所以,从这个例子中我们知道:

解决问题方法的效率跟空间的利用效率有关。

3. 多项式求值问题

对于多项式$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$的值,下次只用做一次乘法即可。 从这个例子,我们可以看出:

解决问题方法的效率跟算法的巧妙程序有关

 

4. 什么是数据结构

数据对象在计算机中的组织方式可以分为逻辑结构与物理存储结构。

数据对象必定与一系列加在其上的操作相关联。

完成这些操作所用的方法就是算法。

/*矩阵的抽象数据类型定义*/
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,否则返回错误

5. 算法

5.1 算法的定义

算法其实就是解决问题的步骤,它有几个特点:

  • 它是一个有限的指令集;
  • 接受一些输入,或者没有输入;
  • 一定有至少一个输出;
  • 有限步骤之后终止;
  • 每一条指令必须有明确的目标,而且能用计算机处理,并不依赖每一种计算机语言。

好的算法需要具有良好的时间复杂度与空间复杂度。

5.2 算法好坏的分析

在分析一般算法的效率真时,我们经常关注下面两种复杂度:

  • 最坏情况复杂度$T_{worst}(n)$
  • 平均复杂度$T_{avg}(n)$

它们之间有如下关系为:$T_{avg}(n) \le T_{worst}(n)$

5.3 复杂度的渐进表示法

  • $T(n)=O(f(n))$表示存在常数$C>0,n_0>0$使得当$n\ge n_0$时,有$T(n)\le C\cdot f(n)$
  • $T(n)=\Omega (g(n))$表示存在常数$C>0,n_0>0$使得当$n\ge n_0$时,有$T(n)\ge C\cdot g(n)$
  • $T(n)=\Theta(h(n))$表示同时有$T(n)=O(h(n))$和$T(n)=\Omega(h(n))$

5.4 复杂度分析的小技巧

  1. 若两段算法分别有复杂度$T_1(n)=O(f_1(n))$和$T_2(n) = O(f_2(n))$,则
    • $T_1(n)+T_2(n)=\max(O(f_1(n)),O(f_2(n)))$
    • $T_1(n)\times T_2(n) = O(f_1(n)\times f_2(n))$
  2. 若$T(n)$是关于$n$的$k$阶多项式,那么$T(n)=\Theta(n^k)$
  3. 一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度
  4. if-else结构的复杂度取决于if的条件判断复杂度和两个分枝部分的复杂度,总体复杂度取三者最大的。

数据结构与算法的基本概念

标签:

原文地址:http://www.cnblogs.com/ronny/p/4374141.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!