数据结构之绪论

 

(本文为个人学习数据结构课程和三年磨一剑的<<大话数据结构>> 后的笔记,如有侵权,请直接联系我,立即删除)

数据结构: 是相互之间存在一种或多种特定关系的数据元素的集合.

一. 按照视点的不同,我们把数据结构分为逻辑结构物理结构

1.逻辑结构:是指数据对象中数据元素之间的相互关系.

  (1)集合结构:集合结构中数据元素除了同属于一个集合外,它们之间没有其他关系.

  (2)线性结构:线性结构中数据元素之间是一对一的关系.

  (3)树形结构:树形结构中的数据元素之间存在一对多的层次关系.

  (4)图形结构:图形结构的数据元素是多对多关系.

2.物理结构:是指数据的逻辑结构在计算机中的存储形式.

  (1)顺序存储结构:把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系一致.

  (2)链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以使连续的,也可以不是连续的.

二.算法的特性

   1.算法的特性

  (1).输入输出

  (2).有穷性

  (3).确定性

  (4).可行性

   (注: 设计算法应该尽量满足时间效率高和存储量第的需求.)

  2算法研究的重要问题类型

  (1)排序

  (2)查找

  (3)字符串处理

  (4)图问题

  (5)组合优化问题

  (6)几何问题

  (7)数值问题

  3.算法的时间复杂度

    (1)定义:在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随着n的变化情况确定T(n)的数量级,

      算法的时间复杂度,也就是算法的时间度量,记作:T(n) = O(f(n)).它表示随着问题规模n的增大,算法的执行时间的增长率

      和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度.其中f(n)是问题规模n的某个函数.

    (2)推导大O阶方法

        推导大O阶:

    1). 用常数1取代运行时间中的所有加法常数.

    2).在修改后的运行次数函数中,只保留最高阶项.

    3).如果最高阶存在且不为1,则除去与这个项相乘的常数.

    得到的结果就是大O阶.

  (3)常数阶

    例子:

     int sum =0, n = 100;  /*执行一次*/

      sum = (1+2)*n/2;      /*执行一次*/

      printf("%d", sum);     /*执行一次*/

              f(n)=3     => O(1)

  (4)线性阶

    例子:

     int i;

      for(i=0; i < n; i++)   /*执行n次*/

      {

        /*时间复杂度为O(1)的程序步骤序列*/

      }

      f(n)=n*(O(1))  =>O(n)

  (5)对数阶   

    例子:

      int count = 1;    //①

      while (count < n)   /*执行n/2次*/

      {

        count *= 2;  //②

        /*时间复杂度为O(1)的程序步骤序列*/

      }

      语句1的频度是1,  
设语句2的频度是f(n), 则:2^f(n)<=n;f(n)<=log2n
取最大值f(n)= log2n,
T(n)=O(log2n )

      2x = n  => x=log2n   => O(log2n)

    例题:求以下程序段的时间复杂度

     int total, i;

     total=0; i=1;

     while(i<=n)

     {

        total=total+i;

        i=i+2;

     }

  (6)平方阶

    例子:

     int i, j;

      for(i=0; i < n; i++)   /*执行n次*/

        for(j=0; j < m; j++)   /*执行m次*/

        {

          /*时间复杂度为O(1)的程序步骤序列*/

        }

      f(n)=n*m(O(1))  =>O(n*m)

     例题:求以下程序段的时间复杂度

      int i, j;

      for(i=0; i < n; i++)   /*执行n次*/

        for(j=i; j < n; j++)   /*执行n-i次*/

        {

          /*时间复杂度为O(1)的程序步骤序列*/

        }

f(n) = (n-0)+(n-1)+(n-2)+...+1=(n2+n)/2  =>  O(n2)

  

   3.常见算法时间复杂度:
    O(1):
 表示算法的运行时间为常量
    O(n): 表示该算法是线性算法
    O(log2 n): 二分查找算法
    O(n2 ): 对数组进行排序的各种简单算法,例如直接插入排序的算法。
    O(n3 ): 做两个n阶矩阵的乘法运算
    O(2n ): 求具有n个元素集合的所有子集的算法
    O(n!): 求具有N个元素的全排列的算法

    优<---------------------------<劣

    O(1)<O(㏒2 n)<O(n)<O(n2 n)<O(n2 )<O(2n )<O(n! )<O(nn )

    时间复杂度按数量级递增排列依次为:常数阶O(1)、对数阶O(log2 n)、线性阶O(n)、线性对数阶O(nlog2 n)、平方阶O(n2 )、立方阶O(n3 )、……k次方阶O(nk )、指数阶O(2n )。

  4.空间复杂度 
    与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: 
    S(n)=O(f(n)) 
    我们一般所讨论的是除正常占用内存开销外的辅助存储单元规模。

最后让我看看基本排序算法的时间复杂度和空间复杂度的比较

排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性
冒泡排序 O(n2) O(n) O(n2) O(1) 稳定
简单选择排序 O() O() O() O() 稳定
          稳定
          稳定
          稳定
          稳定
          稳定
          稳定
          稳定

 

 

posted @ 2013-05-24 16:46  cq-home  Views(310)  Comments(0Edit  收藏  举报