550 likes | 677 Views
第一章 绪论. 掌握常用数据结构的二元组表示 掌握抽象数据类型定义、算法特性及其描述方法 掌握评价算法的规则,算法的时间复杂度、空间复杂度的定义和表示。. 1.1 数据结构的概念与分类. 数据 ( data ). 数据 是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。 数值性数据 非数值性数据. 在实际中,按数据性质归类到不同的称之为 数据对象 的集合中。 数据元素 (data element) : 数据对象中的具有相同性质的数据成员:例如文件中的记录、字符串中的字符、数组中的每个数值等。
E N D
第一章 绪论 • 掌握常用数据结构的二元组表示 • 掌握抽象数据类型定义、算法特性及其描述方法 • 掌握评价算法的规则,算法的时间复杂度、空间复杂度的定义和表示。
1.1 数据结构的概念与分类 数据(data) • 数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。 • 数值性数据 • 非数值性数据
在实际中,按数据性质归类到不同的称之为数据对象的集合中。在实际中,按数据性质归类到不同的称之为数据对象的集合中。 • 数据元素(data element):数据对象中的具有相同性质的数据成员:例如文件中的记录、字符串中的字符、数组中的每个数值等。 • 例如:整数数据对象 N = { 0, 1, 2, … } 学生记录数据对象
数据记录(Data Record):数据组织的基本单位,记录由若干个数据项组成。 例如:学生记录数据对象 见下列“学生”表格和“课程”表格
数据结构(Data Structure):数据及其之间的相互关系: • 逻辑结构—数据结构 • 物理结构—存储结构
学生选课系统中实体构成的网状关系 课程 (课程号,课程名,性别,籍贯) 学生 (学号,姓名,性别,籍贯) 选课 (学号,姓名,课程号,成绩)
什么是数据结构? • 数据结构----数据 + 结构:一般来说,一个数据对象中的所有成员之间均存在着一定的联系(某种关系),这种关系称为数据结构。 • 从不同的视点考虑,数据结构分为: • ---逻辑结构(数据结构) • ---物理结构
数据结构表示方法 二元组表示 Data_Structure={ D, R } D是某一数据对象,R是该对象中所有数据成员之间的关系的有限集合。 D={ki | 1≤i≤n, n≥0} R={<ku,kv> | ku,kv∈D}
数据结构表示方法(续1) K上的关系R是序偶的集合,对于R中的任一序偶<x,y>,x,y∈D, x称为序偶的第一个元素,y称为序偶的第二个元素。也称x是y的直接前驱,y是x的直接后继。
数据结构表示方法(续2) 数据结构的图形表示法,示意图中的每一个结点(顶点)对应着一个元素,两结点之间的连线(有向弧或无向弧)对应关系中的一个序偶。Ku是Kv的前驱,Kv是Ku的后继。 Kv Ku Ku Kv
线性1:1 树1:n 图m:n 集合 数据结构分类 线性结构、非线性结构 1 1 2 3 4 5 6 2 3 4 5 6
1 2 3 4 5 6 7 数据结构举例 例1:list={ D, R } 其中:D={ 1,2,3,4,5,6,7 } R={ <1,2>, <2,3>, <3,4>, <4,5>, <5,6>, 6,7> } 数据的线性结构示意图1:1
数据的树型结构示意图1:n, n≥1 数据结构举例(续1) 例2:tree={ D, R } 其中:D={ 1, 2, 3, 4, 5, 6 } R={ <1,2>,<1,3> ,<2,4>,<2,5>,<3,6>} 1 R中各个对象为层次关系(多个后继) 2 3 4 5 6
数据的图型结构示意图m:n 数据结构举例(续2) 例3:graph={ D, R } 其中:D={ 1,2,3,4,5,6,7 } R={ (1,2),(1,5) ,(2,3),(2,4),(2,6),(3,4),(3,6), (3,7),(4,7),(5,6),(6,7)} 4 1 2 每个结点有多个前驱和多个后继 5 3 7 6
集合结构示意 数据结构举例(续3) 例4:set={ D, R } 其中:D={ 1,2,3,4,5,6,7 } R={ } D中的结点之间没有直接联系
数据类型 数据类型是对数据的取值(范围)、结构和允许的操作的描述。例如整型、实型、字符型、布尔型、数组、指针、结构、文件等。
数据的物理结构 数据逻辑结构的存储映像: 顺序、链接、散列、索引 数据的逻辑结构是面向问题的 数据的物理结构是面向计算机的
1.2 抽象数据类型及面向对象概念 一、 数据类型 1、定义:数据类型是对数据的取值(范围)、结构和允许的操作的描述。例如整型、实型、字符型、布尔型、数组、指针、结构、文件等。 2、分类:简单类型: 简单数据都是无法再分的整体,复合类型:如数组、记录、字符串、结构等。
1.2 抽象数据类型及面向对象概念(续1) 二、抽象数据类型(ADTs) 1、概念:由一组数据结构和在该组数据结构上的一组操作组成, • 一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,称为预定义数据类型。
1.2 抽象数据类型及面向对象概念(续2) • 抽象数据类型由编程者定义(数据及操作),不管其数据存储结构及操作具体实现。
1.2 抽象数据类型及面向对象概念(续2) 2、定义 ADT 抽象数据类型名 is objects: 数据描述 function: 操作声明 end 抽象数据类型名
抽象数据类型举例 ADTNaturalNumber is Objects: 一个整数的有序子集合,它开始于0,结束 于机器能表示的最大整数(MaxInt)。 Function:对于所有的 x, y NaturalNumber; False, True Boolean, +、-、<、==、 =等都是可用的服务。 Zero( ) :NaturalNumber //返回自然数0
抽象数据类型举例(续1) IsZero(x) : if (x==0) 返回True Booleanelse 返回False Add (x, y) : if (x+y<=MaxInt)返回 x+y NaturalNumberelse 返回MaxInt Subtract (x, y) : if (x < y) 返回 0 NaturalNumberelse 返回 x - y
抽象数据类型举例(续2) Equal (x, y) : if (x==y) 返回True Booleanelse 返回 False Successor (x) : if (x==MaxInt) 返回 x NaturalNumber else 返回 x+1 endNaturalNumber
抽象数据类型实现 3、实现:抽象数据类型在C++语言中 是通过类类型来描述。 只允许该类及其 子类直接使用 class 抽象数据类型名{ private: 数据说明部分 public: 操作(函数声明) }; 供该类、子类及外部操作使用。操作的具体实现通常在单独的文件中
抽象数据类型实现举例 例:设计矩形的一种抽象数据类型,其数据部分包括其长度与宽度,操作部分包括初始化、求周长和面积。
抽象数据类型实现举例(续) class rectangle { private: float length,width; public: rectangle( ); //构造函数 ~rectangle( ); //析造函数 float getl( ); float getw( ); float circumference(rectangle r); float area(rectangle r); }; 数据结构:数据说明 数据操作:函数
抽象数据类型特征 抽象数据类型的特征是使用与实现分离,实行封装和信息隐蔽。
小结 为什么要学习数据结构? • 它研究了计算机需要处理的数据对象和对象之间的关系。 • 它刻画了实际应用中涉及到的数据的逻辑组织。 • 它描述了数据在计算机中如何存储、传送、转换。
主要讨论哪几种数据结构? • 从传统的观点来看 • 数据的逻辑结构 • 线性结构 • 非线性结构
线性结构 A B C D E F 非线性结构 A A D B C C D E G B E
学习数据结构需要注意些什么? 1、知识方面 • 系统掌握基本数据结构的特点及其不同实现。 • 了解并掌握各种数据结构上主要操作的实现及其性能(时间、空间)的分析。
学习数据结构需要注意些什么?(续) 2、技能方面 • 掌握各种数据结构的使用特性,在算法设计中能够进行选择。 • 掌握常用的递归、回溯、迭代、递推等方法的设计 • 掌握自顶向下、逐步求精的程序设计方法。
1.3 算法描述 算法特征;输入、输出、确定、有效、有穷。 例如:选择排序问题到算法的转换。 首先:要解决的问题是:将一组无序数据重新排列成有序的数据(假设由大到小)。 其次,解决方案:假设有N数据,存于数组a[0]到a[n-1]中; 第0步,从a[0]~a[n-1]这n个数中找出最大数,存于a[0];
第1步,从a[1]~a[n-1]这n-1个数中找出最大数,存于a[1],第2步,从a[2]~a[n-1]这n-2个数中找出最大数,存于a[2],第1步,从a[1]~a[n-1]这n-1个数中找出最大数,存于a[1],第2步,从a[2]~a[n-1]这n-2个数中找出最大数,存于a[2], 依次类推,直到从a[n-2]~a[n-1]这2个数中找出最大数,存于a[n-2],剩余的一个数不必处理。这样,n个数据就按照由大到小的顺序排列出来。 上面的步数m=0,1,2,……,n-2,每步找出的最大数存于a[m]位置上。
每次求最大数的方法:先假设a[m]是最大数,从a[m+1]~a[n-1]这几个数据与a[m]比较,大于a[m]者保存其下标k,所有数据比较完以后,a[m]与a[k]交换。每次求最大数的方法:先假设a[m]是最大数,从a[m+1]~a[n-1]这几个数据与a[m]比较,大于a[m]者保存其下标k,所有数据比较完以后,a[m]与a[k]交换。
void SelectSort(int a[ ], const int n) //选择排序法 { for ( int m=0; m<n-1; m++) //1、第m步处理m=0~n-1 { k=m; //2、找出a[m]~a[n-1]中的最大数 for ( j=m+1; j<n; j++) if ( a[j] > a[k] ) k=j; int temp=a[m]; //3、将其存入a[m] a[m]=a[k]; a[k]=temp; } }
算法描述方法 文字描述 流程图 程序设计语言
算法评价 正确性:正确 健壮性:合理性 可读性:易读 时间复杂度(计算复杂度):是在计算机上开始到结束运行时间的相对度量,约等于计算机执行一种简单操作所用时间t0与算法中执行简单操作的次数n的乘积,而t0因机器而异。所以用n的函数衡量时间复杂度。
一般情况下,计算f(n)较复杂,也没有必要,只须大致计算出相应的数量级(Order)。一般情况下,计算f(n)较复杂,也没有必要,只须大致计算出相应的数量级(Order)。 O(f(n)):O(n), O(n2), O(log2n), O(n*log2n), … 空间复杂度: 运行过程中临时占用存储空间大小
包含文件语句 • #include <iostream.h> • cin / cout / >> / << • #include <stdlib.h> • exit(), rand()—随机数, srand()--随机数种子 • #include <fstream.h> //文件I/O/IO • ifstream / ostream / fstreamt • #include <string.h> 字符串操作函数
函数 • C++程序---由相对独立的函数组成; • C++函数—main(),程序执行从main()考试; • 一般函数—由用户根据实际需要定义; • main()函数,可以调用一般函数,其它函数 • 可以相互调用(含递归调用)。 • 函数调用方式:函数调用语句,表达式调用 • 函数参数:值形式参数/引用形式参数
#include <iostream.h> #include <string.h> #include <stdlib.h> const int PN=5; struct pupil { char pnum[80]; int grade; };
int find (pupil b[], int n,char *k); pupil *find(int n, pupil b[], char *k); pupil & find(char *k, pupil b[], int n); void main() { pupil a[PN]={ {"11111", 81}, {"22222", 82}, {"33333", 83}, {"44444", 84}, {"55555", 85}};
int i; for(i=0; i<PN; i++) { cout<<a[i].pnum<<"<<a[i].grade; cout<<endl<<endl; } pupil x={"33333", 100}; cout<<"请选择(1/2/3)?"; cin>>i; switch(i){
case 1: i=find(a,PN,x.pnum); if (i<PN) { a[i]=x; cout<<"查找到记录x!"<<endl; } else cout<<x.pnum<<" not found!"<<endl; break;
case 2: pupil *p; p=find(PN,a,x.pnum); //查找x.pnum, if(p!=NULL) *p=x; //用x替换a元素 else cout<<x.pnum<<" not found!"<<endl; break;
case 3: { pupil y; //注意此时函数find的返回类型。 y=find(x.pnum, a, PN); cout<<y.pnum; cout<<find(x.pnum, a, PN).pnum; cout<<" 已经找到!"<<endl; }; for(i=0; i<PN; i++){ cout<<a[i].pnum<<" "<<a[i].grade; cout<<endl<<endl; } }