数据结构与算法C语言版—绪论

1.基本概念和术语

  • 1、数据(data):所有能输入到计算机中去的描述客观事物的符号
    • 数值性数据
    • 非数值性数据(多媒体信息处理)
  • 2、数据元素(data element):数据的基本单位,也称结点(node)或记录(record)
  • 3、数据项(data item):有独立含义的数据最小单位,也称域(field)
    • 三者之间的关系:数据 > 数据元素  > 数据项  例:学生表 >  个人记录 >  学号、姓名
  • 4、数据对象(Data Object):相同特性数据元素的集合,是数据的一个子集。
    • 整数数据对象:N = { 0, 1, 2, … }
    • 学生数据对象:学生记录的集合
  • 5、数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。
    • 数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

2.数据结构

  • 数据结构的两个层次 :
    • 逻辑结构:数据元素间抽象化的相互关系,与数据的存储无关,独立于计算机,它是从具体问题抽象出来的数学模型。
    • 存储结构(物理结构):数据元素及其关系在计算机存储器中的存储方式。

2.1 逻辑结构

  • 划分方法一 :
    • 线性结构:有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个后继。 例如:线性表、栈、队列、串
    • 非线性结构:一个结点可能有多个直接前趋和直接后继。 例如:树、图
  • 划分方法二:
    • 集合:数据元素间除“同属于一个集合”外,无其它关系。

    • 线性结构:一个对一个,如线性表、栈、队列。
    • 树形结构:一个对多个,如树:数据结构与算法C语言版—绪论_第1张图片
    • 图形结构——多个对多个,如图:数据结构与算法C语言版—绪论_第2张图片

2.2 存储结构

  • 顺序存储结构:借助元素在存储器中的相对位置来表示数据元素间的逻辑关系 。

数据结构与算法C语言版—绪论_第3张图片

  • 链式存储结构:借助指示元素存储地址的指针表示数据元素间的逻辑关系。

数据结构与算法C语言版—绪论_第4张图片

3.数据的运算

  • 逻辑结构和存储结构都相同,但运算不同,则数据结构不同.。例如, 栈与队列。 
  • 对于一种数据结构, 常见的运算
    • 插入
    • 删除
    • 修改
    • 查找
    • 排序

数据结构与算法C语言版—绪论_第5张图片

4.算法和算法分析

  • 算法定义:一个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列。
  • 算法的描述:自然语言 、流程图 、程序设计语言 、伪码。
  • 算法的特性:  
    • 输入 :有0个或多个输入  
    • 输出 :有一个或多个输出(处理结果)  
    • 确定性 :每步定义都是确切、无歧义的  
    • 有穷性 :算法应在执行有穷步后结束
    • 有效性 :每一条运算应足够基本
  • 算法的评价:
    • 正确性
    • 可读性
    • 健壮性
    • 高效性(时间代价和空间代价)

5.算法的效率的度量

  • 算法效率:用依据该算法编制的程序在计算机上执行所消耗的时间来度量。   
    • 事后统计
    • 事前分析估计 
  • 事后统计:利用计算机内的计时功能,不同算法的程序可以用一组或多组相同的统计数据区分
    • 缺点:(1)必须先运行依据算法编制的程序 ;(2)所得时间统计量依赖于硬件、软件等环境因素,掩盖算法本身的优劣    
  • 事前分析估计: 一个高级语言程序在计算机上运行所消耗的时间取决于:    
    • 依据的算法选用何种策略      
    • 问题的规模      
    • 程序语言      
    • 编译程序产生机器代码质量      
    • 机器执行指令速度    
  • 同一个算法用不同的语言、不同的编译程序、在不同的计算机上运行,效率均不同,使用绝对时间单位衡量算法效率不合适。

6.时间复杂度的渐进表示法

  • 算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n)) ,表示随着n的增大,算法执行的时间的增长率和f(n)的增长率相同,称渐近时间复杂度。
  • 数学符号“O”的定义为: 若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n) = O(f(n))表示存在正的常数C和n0,使得当n≥n0时都满足0≤T(n)≤Cf(n)

数据结构与算法C语言版—绪论_第6张图片

  • n越大算法的执行时间越长
    • 排序:n为记录数
    • 矩阵:n为矩阵的阶数
    • 多项式:n为多项式的项数
    • 集合:n为元素个数 树:n为树的结点个数
    • 图:n为图的顶点数或边数
  • n * n阶矩阵加法:
  • for( i = 0; i < n; i++)     
        for( j = 0; j < n; j++)        
             c[i][j] = a[i][j] + b[i][j];      
      语句的频度(Frequency Count ):重复执行的次数:n*n; T( n ) = O ( n 2) 即:矩阵加法的运算量和问题的规模n的平方是同一个量级。

7.分析算法时间复杂度的基本方法

  • 找出语句频度最大的那条语句作为基本语句
  • 计算基本语句的频度得到问题规模n的某个函数f(n)
  • 取其数量级用符号“O”表示
  • 数据结构与算法C语言版—绪论_第7张图片
  • T(n) = O(m*n),时间复杂度是由嵌套最深层语句的频度决定的

例1:N×N矩阵相乘

for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
     {c[i][j]=0;	
       for(k=1;k<=n;k++)
          c[i][j]=c[i][j]+a[i][k]*b[k][j];
     }	
  • 算法中的基本操作语句为:c[i][j]=c[i][j]+a[i][k]*b[k][j];

例2

for( i=1; i<=n; i++)          
    for (j=1; j<=i; j++)              
        for (k=1; k<=j; k++) 
            x=x+1;
  • 数据结构与算法C语言版—绪论_第8张图片

例3:分析以下程序段的时间复杂度

i=1;                             
while(i<=n)
	 i=i*2;      
  • 设基本语句频度为f(n),则2^f(n)≤n,即f(n)≤log2n,取最大值f(n)=log2n

总结

  • 当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊

数据结构与算法C语言版—绪论_第9张图片

  • ​​​​​​​时间复杂度T(n)按数量级递增顺序为:

数据结构与算法C语言版—绪论_第10张图片

8.渐进空间复杂度

  • 空间复杂度:算法所需存储空间的度量,记作: S(n)=O(f(n)),其中n为问题的规模(或大小)
  • 算法要占据的空间: 
    • 算法本身要占据的空间,输入/输出,指令,常数,变量等
    • 算法要使用的辅助空间

例5:将一维数组a中的n个数逆序存放到原数组中。

数据结构与算法C语言版—绪论_第11张图片​​​​​​​

你可能感兴趣的:(数据结构)