0.数据结构 (严蔚敏C语言版)绪论

本文详细介绍了数据、数据元素、数据项之间的关系,以及数据对象的概念。数据结构包括逻辑结构和物理结构,如顺序存储和链式存储。抽象数据类型(ADT)是数据类型的一种,包括原子类型和结构类型,并通过函数定义其操作。算法的定义、特性、描述方式以及效率分析也被提及,强调了时间复杂度和空间复杂度在算法分析中的重要性。

绪论

数据

是能输入计算机且能被计算机处理的各种符号的集合

是对客观事物的符号表示

数据元素

  • 是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

  • 也简称为元素,或称为记录结点顶点

在这里插入图片描述

数据项

构成数据元素的不可分割的最小单位。

1.数据、数据元素、数据项三者之间的关系:

数据>数据元素>数据项 (前一个由后一个组成)

2.数据对象

性质相同数据元素的集合,是数据的一个子集。

例如:

N={0,±1,±2..};  //整数数据对象是集合

C={'A''B',…...'z'}; //字母字符数据对象是集合

数据结构

是指相互之间存在一种或多种特定关系数据元素集合,也可以说数据结构是带结构的数据元素的集合。

数据结构包括以下三个方面的内容

  1. 数据元素之间的逻辑关系,也称为逻辑结构

  2. 数据元素及其关系在计算机内存中的表示(又称为映像),称为数据的物理结构或数据的存储结构

  3. 数据的运算和实现,即对数据元素可以施加的操作以及这些操作在相应的存储结构上的实现。

两种结构

  1. 逻辑结构

描述数据元素之间的逻辑关系,与数据的存储无关,独立于计算机,是从具体问题抽象出来的数学模型。

在这里插入图片描述

(一对一,多对多 P4 标记)

  1. 物理结构(存储结构)

数据元素及其关系在计算机存储器中的结构(存储方式)是数据结构在计算机中的表示。

在这里插入图片描述

  • 顺序存储结构:

用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置来表示。

在这里插入图片描述

{bat, cat,eat
  • 链接存储结构:

用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示。

C语言中用指针来实现链式存储结构。用指针表示逻辑关系

例:(bat, cat, eat…,mat)
在这里插入图片描述

数据类型和抽象数据类型

1.数据类型

数据类型是一个值的集合和定义在此集合上的一组操作的总成称。

  • 原子类型,其值不可再分的数据类型。
  • 结构类型,其值可以再分为若干成分的数据类型。

2.抽象数据类型(Abstract Data Type,ADT)

是指一个数学模型以及定义在此数学模型上的一组操作

  • 由用户定义,从问题抽象出数据模型(逻辑结构)

  • 还包括定义在数据模型上的一组抽象运算(相关操作)

  • 不考虑计算机内的具体存储结构与运算的具体实现算法

3.抽象数据类型的定义格式
在这里插入图片描述

在这里插入图片描述

例:定义一个圆的抽象数据类型
ADT Circle {
    
数据对象:	D={r,x,y| r,x,y均为实数}
数据关系:	R={< r,x,y >|r是半径,<x,y>是圆心坐标}
基本操作:	Circle(&C,r,x,y)
                操作结果:构造一个圆。
           double Area(C)
                初始条件:圆已存在。
                操作结果:计算面积。
           double Circumference (C)
                初始条件:圆已存在。
                操作结果:计算周长。
}ADT Circle

4.如何实现抽相数据类型

  • C语言实现抽象数据类型---->用已有数据类型定义描述它的存储结构;

  • 函数定义描述它的操作。

(如此就可以在程序中使用)

抽象数据类型可以通过固有的数据类型(如整型、实型、字符型)来表示和实现。 即利用处理器中已存在的数据类型来说明新的结构,用

已经实现的操作来组合新的操作 。

注:在本门课程的学习过程中,我们使用的类C语言(介于伪码和C语言 之间)作为描述工具。

例:抽象数据类型的实现
//第一步:定义复数抽象类型
typedef struct{
    float realpart;		/*实部*/
    float imagpart;		/*虚部*/
} Complex; 			 	

//第二步:函数声明
void assign(Complex *A, float real, float imag);		/*赋值*/
void add (Complex *A, float real , float imag);		/*A+B*/
void minus (Complex * A, float real , float imag);		/*A-B*/
void multiply (Complex * A, float real , float imag);	/*A*B*/
void divide (Complex * A, float real , float imag);		/*A/B*/

//第三步:函数的具体实现
Void assign (Complex *A,float real , float imag){
        A->realpart = real;/*实部赋值*/
        A->imagpart= imag;/*虚部赋值*/ 
}
void add (Complex *c, Complex A, Complex B) {/*c =A+ B*/ 
        C->realpart = A.realpart +B.realpart;		/*实部相加*/
        c->imagpart= A.imagpar+B.imagpart;			/*虚部相加*/
}: Complex是我们定义的一个结构体类型
    带*:指针变量,它是指向Complex类型的指针
    不带*: Complex类型的普通变量

算法

1.算法的定义
对特定问题求解方法和步骤的一种描述,它是指令的有限序列。其中每个指令表示一个或多个操作。

2.特性

  1. 有穷性

算法必须是有穷的,而程序可以说无穷的。

  1. 确定性:

算法中每条指令必须有确切的含义,对于相同的输入只能得出相同的输出

  1. 可行性:

算法中描述的操作都可以通过已经实现的基本运算执行有限次来实现。

  1. 输入输出

输入。一个算法有零个或多个输入,这些输入取自于某个特定的对象的集合。

输出。一个算法有一个或多个输出,这些输出是与输入有着某种特定关系的量。

3.好算法的特征:

正确性 可读性 健壮性 高效率与低储存量需求

在这里插入图片描述

4.算法的描述

  • 自然语言:英语、中文

  • 流程图:传统流程图、NS流程图

  • 伪代码:类语言:类C语言

  • 程序代码: C语言程序、jAVA语言程…

5.算法与程序

  • 算法是解决问题的一种方法或一个过程, 考虑如何将输入转换成输出,一个问题可以有多种算法。
  • 程序是用某种程序设计语言对算法的具体实现。

程序=数据结构+算法

6.算法的效率

算法效率以下两个方面来考虑:

  • 时间效率:指的是算法所耗费的时间;

  • 空间效率:指的是算法执行过程中所耗费的存储空间。

  • 事后分析法(x)

  • 事前分析方法(主要研究方法):

    一个算法的运行时间是指一个算法在计算机 上运行所耗费的时间大致可以等于计算机执行一种简单的操作(如赋值、比较、移动等)所需的时间与算法中进行的简单操作次数乘积。

    算法运行时间 = 一个简单操作所需的时间 x 简单操作次数

    也即算法中每条语句的执行时间之和

    其中,执行次数就是语句的执行频度。

    又因为每条语句执行的时间是由机器所决定的,与机器的软硬件相关,与算法无关,所以,我们可以不考虑每条语句执行时间,只考虑语句的执行次数。

    例如:两个nxn矩阵相乘的算法可描述为:
    for(i=1;i<=n;i++)			//n+1   
        for(j=1;j<=n;j++){		//n*(n+1)
            c[i][j]=0;			//n*n次
                for(k=0;k<n;k++)		//n*n*(n+1)次
                c[i][j]=c[i][j]+ a[i][k]*b[k][j];		//n*n*n次
         }
    我们把算法所耗费的时间定义为该算法中每条语句的频度之和,则上述算
    法的时间消耗T(n): 2n^3 + 3n^2 + 2n + 1 =n^3
        (缺点:麻烦)
    

时间复杂度

定义:算法中基本语句重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作: T(n)=O(f(n))

若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作

T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。

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

  • 找出语句频度最大的那条语句作为基本语句
  • 计算基本语句的频度得到问题规模n的某个函数f(n)
  • 取其数量级用符号"O”表示
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值