Download presentation
Presentation is loading. Please wait.
1
南航计算机系 南航计算机系 数据结构
2
第一章 绪论 什么是数据结构 什么是数据结构 基本概念和术语 基本概念和术语 抽象数据类型的表示和实现 抽象数据类型的表示和实现 算法和算法分析 算法和算法分析
3
绪论 数据结构在计算机科学中是一门综合性的专业基 础课. 在计算机科学中,数据结构不仅是一般程序设 计的基础,而且是设计和编译程序、操作系统、数据 库系统及其它系统程序和大型应用程序的重要基础。 本课件详细介绍了线形表、栈和队列、串、数组 和广义表、树和二叉树及图等几种基本类型的数据结构, 以及在程序设计中经常遇到的两个问题 -- 查找和排序。
4
基本概念和术语 数据: 是对客观事物的符号表示,在计算机科 学中 是指所有能输入到计算机中并被计算机程序 处理的符号的总称。 数据元素:是数据的基本单位。 数据项: 是数据的不可分割的最小单位。 数据对象:是性质相同的数据元素的集合,是数据的一 个子集。 数据结构:是相互之间存在一种或多种特定关系的数据 元素的集合 。
5
四种基本数据结构: ( 1 )集合:元素之间同属于一个集合; ( 2 )线性结构 : 一对一关系; ( 3 )树形结构: 一对多关系; ( 4 )图状结构: 多对多关系; 数据结构形式定义: Data Structure=(D,S) 其中: D 是数据元素的有限集, S 是 D 上关系 的有限集。
6
物理结构(存储结构):数据结构在计算机中的表示。 数据元素之间的关系在计算机中有两种不同 的表示方法:顺序映象和非顺序映象,并由此得 到两种不同的存储结构:顺序存储结构和链式存 储结构。 数据类型( Data Type ):数据类型是一个值的集合和定 义在这个值集上的一组操作的总称。 抽象数据类型( Abstract Data Type) :是指一个数学模型 以及定义在该模型上的一组操作。
7
抽象数据类型表示: ADT= ( D , S , P ) 抽象数据类型格式: ADT 抽象数据类型名 { 数据对象: 数据关系: 基本操作: } ADT 抽象数据类型名 多形数据类型( Polymorphic Data Type ): 是指其值的成分不确定的数据类型。
8
抽象数据类型三元组的定义: ADT Triplet { 数据对象: D={e1,e2,e3|e1,e2,e3 ∈ ElemSet ( 定义了关系运算的某个集合) } 数据关系: R1={, } 基本操作: InitTriplet(&T,v2,v3) 操作结果:构造了三元组 T ,元素 e1 和 e2 分别被 赋予参数 v1,v2, 和 v3 的值 DestroyTrplet(&T) 操作结果:三元组 T 被销毁
9
Get(T,i,&e) 初始条件:三元组 T 已存在, 1<=i<=3 操作结果:用 e 返回 T 的第 I 元的值 Put(&T,i,e) 初始条件:三元组 T 已存在, 1<=i<=3 操作结果:改变 T 的第 I 元的值为 e lsAscending(T) 初始条件:三元组已存在 操作结果:如果 T 的三个元素按升序排列,则返 回 1, 否则返回 0
10
lsDescending(T) 初始条件:三元组 T 已存在 操作结果:如果 T 的三个元素按降序排列,则返回 1, 否则返回 0 Max(T,&e) 初始条件:三元组 T 已存在 操作结果:用 e 返回 T 的三个元素中的最大值 Min(T,&e) 初始条件:三元组 T 已存在 操作结果:用 e 返回 T 的三个元素中的最小值 }ADT Triplet
11
ADT 的表示和实现 ADT 的表示和实现 ㈠ 数据结构类型说明〈存储结构〉 ㈡ 基本操作函数原理说明 ㈢ 基本操作函数的实现 算法:对特定求解步骤的一个描述(强调描述功能) 程序:图示法 —— 框图 用类 c 语言作为描述工具,简要说明如下: ⑴ 预定义常量和类型: // 函数结果状态代码 #define TRUE 1 #define FALSE 0 #define OK 1
12
#define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //Status 是函数的类型, 其值是函数结果状态代码 Typedef int Status; ⑵ 数据结构的表示(存储结构)用类型定义描述。 数据元素类型约定为 ElemType, 由用户的使用该 数据类型时自行定义 ⑶ 基本操作的算法都用以下形式的函数描述: 函数类型 函数名(函数参数表) { // 算法说明 语句序列 }// 函数名
13
⑷ 赋值语句有 简单赋值 变量名 = 表达式; 串联赋值 变量名 1= 变量名 2=…= 变量名 k= 表达式; 成组赋值 (变量名 1,…, 变量名 k)=( 表达式 1,…, 表达式 k); 结构名 = 结构名; 结构名 = (值 1, …, 值 k); 变量名 [ ]= 表达式; 变量名 [ 起始下标.. 终止下标 ]= 变量名 [ 起始 下标.. 终止下标 ] 交换赋值 变量名 ←→ 变量名; 条件赋值 变量名 = 条件表达式?表达式 T :表达式 F ;
14
⑸ 选择语句有 条件语句 1 if ( 表达式 ) 语句; 条件语句 2 if ( 表达式 ) 语句; else 语句; 开关语句 1 switch ( 表达式 ) { case 值 1: 语句序列 1;break; … case 值 n: 语句序列 n;break; default: 语句序列 n+1; } 开关语句 2 switch { case 条件 1: 语句序列 1;break; … case 条件 n :语句序列 n ; break; default: 语句序列 n+1; }
15
⑹ 循环语句有 for 语句 for (赋初值表达式序列:条件:修改表 达式 序列)语句; While 语句 while (条件)语句; do-while 语句 do { 语句序列; }while (条件); ⑺ 结束语句有 函数结束语句 return 表达式; return ; Case 结束语句 break ; 异常结束语句 exit (异常代码);
16
⑻ 输入和输出语句有 输入语句 scanf ( [ 格式串 ] ,变量 1,…, 变量 n ); 输入语句 printf ( [ 格式串 ] ,表达式 1,… ,表达式 n ); 通常省略格式串。 ⑼ 注释 单行注释 // 文字序列 ⑽ 基本函数有 求最大值 max (表达式 1,…, 表达式 n ) 求最小值 min (表达式 1,…, 表达式 n ) 求绝对值 abs (表达式) 求不足整数值 floor (表达式) 求进位整数值 ceil (表达式) 判定文件结束 eof (文件变量) 或 eof 判定行结束 eoln (文件变量) 或 eoln
17
(11) 逻辑运算约定 与运算 &&: 对于 A&&B, 当 A 的值为 0 时, 不再 对 B 求值。 或运算 || : 对于 A||B, 当 A 的值为非 0 时, 不再 对 B 求值 例:抽象数据类型 Triplet 的表示和实现
18
Typedef ElemType *Triplet // 由 InitTriplet 分配三个元素存储空间 基本操作的函数原型说明 Status InitTriplet(Triplet &T, ElemType v1,ElemType v2,ElemType v3); // 操作结果:构造了三元组 T ,元素 e1,e2, 和 e3 分别被赋以参数 v1,v2, 和 v3 的值 Status DestroyTriplet (Triplet &T); // 操作结果:三元组被销毁 Status Get (Triplet T, int I, ElemType &e); // 初始条件:三元组 T 已存在, 1<=i<=3 // 操作结果:用 e 返回 T 的第 I 元的值
19
Status Put(Triplet &T, int I, ElemType e); // 初始条件:三元组 T 已存在, 1<=I<=3 // 操作结果:改变 T 的第 I 元的值为 e Status IsAscending(Triplet T); // 初始条件:三元组 T 已存在 // 操作结果:如果 T 的三个元素按升序排列,则返回 1, 否 则返回 0 Status IsDescending(Triplet T); // 初始条件:三元组 T 已存在 // 操作结果:如果 T 的三个元素按降序排列,则返回 1, 否 则返回 0
20
Status Max(Triplet, ElemType &e); // 初始条件:三元组 T 已存在 // 操作结果:用 e 返回 T 的三个元素中的最大值 Status Min(Triplet T,ElemType &e); / / 初始条件:三元组 T 已存在 // 操作结果:用 e 返回 T 的三个元素中的最小值
21
//---- 基本操作的实现 ---- Status InitTriplet(Triplet &T,ElemType v1, ElemType v2, ElemType v3){ // 构造三元组 T ,依次置 T 的三个元素的初值为 v1,v2,v3 T=(ElemType *) malloc (3*sizeof(ElemType)); // 分配 3 个元素的存储空间 if (! T) exit (OVERFLOW);// 分配存储空间失败 T[0]=v1; T[1]=v2; T[2]=v3; return ok; }//InitTriplet
22
Status DestroyTriplet(Triplet &T){ // 销毁三元组 T free(T); T=NULL; return ok; }//DestroyTriplet Status Get (Triplet T,int I,ElemType &e){ //1<=I<=3, 用 e 返回 T 的第 I 元的值 if (I 3) return ERROR; e=T[i-1]=e; return Ok; }//Get
23
Status Put (Triplet &T,int I,ElemType e){ //1<=I<=3, 置 T 的第 I 元的值为 e if (i 3) return ERROR; e=T[i-1]=e; return Ok; }//put Status IsAscending(Triplet T){ // 如果 T 的三个元素按升序排列,则返回 1, 否则返回 0 return (T[0]<=T[1] && (T[1]<=T[2]); }//IsAscending Status IsDescending(Triplet T){ // 如果 T 的三个元素按降序排列,则返回 1, 否则返回 0 return (T[0]>=T[1] && (T[1]>=T[2]); }//IsDescending
24
Status Max (Triplet T,ElemType &e){ // 用 e 返回指向 T 的最大元素的值 e=(T[0]>=T[1]) ?((T[0]>=T[2]) ?T[0]:T[2]):((T[1]>=T[2]) ?T[1]:T[2]); return OK; }//Max Status Min(Triplet T,ElemType &e){ // 用 e 返回指向 T 的最小元素的值 e=(T[0]<=T[1])?((T[0]<=T[2])?T[0]:T[2]) :((T[1]<=T[2])?T[1]:T[2]); return OK; }//Min
25
算法和算法分析 算法和算法分析 算法: 定义:是对特定问题求解步骤的一种描 述,它是指令的有限序列。 1. 特性: ( 1 )有穷性 ( 2 )确定性 ( 3 )可行性 ( 4 )输入 ( 5 )输出
26
2. 算法设计的要求 ( 1 )正确性 ( 2 )可读性 ( 3 )健壮性 ( 4 )效率与低存储需求 3. 影响时间因素 ( 1 )输入数据量 ( 2 )编译时间 ( 3 )每一条指令执行时间 ( 4 )指令重复执行次数
27
例如:两个 N*N 矩阵相乘算法, “ 乘法 ” 运算是 “ 矩阵相乘 问题 ” 的基本操作,整个算法的执行时间与该基本操作 (乘法)重复执行的次数 n 3 成正比 记为 T(n)=( )(n 3 ) 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]+=a[i][k]*b[k][j]; }
28
T=n+1+n(n+1)+n 2 +n 2 (n+1)+n 3 =2n 3 +3n 2 +2n+1 T 执行次数(频度) 当 N→∞ , T 的数量级为 n 3 ,用大 “o” 表示这个算法的复杂度。 本章要求:基本术语 ADT 定义,表示和实现方法 熟悉类 c 语言的描述方法 了解基本算法
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.