1 / 55

第一章 绪论

第一章 绪论. 掌握常用数据结构的二元组表示 掌握抽象数据类型定义、算法特性及其描述方法 掌握评价算法的规则,算法的时间复杂度、空间复杂度的定义和表示。. 1.1 数据结构的概念与分类. 数据 ( data ). 数据 是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。 数值性数据 非数值性数据. 在实际中,按数据性质归类到不同的称之为 数据对象 的集合中。 数据元素 (data element) : 数据对象中的具有相同性质的数据成员:例如文件中的记录、字符串中的字符、数组中的每个数值等。

peers
Download Presentation

第一章 绪论

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第一章 绪论 • 掌握常用数据结构的二元组表示 • 掌握抽象数据类型定义、算法特性及其描述方法 • 掌握评价算法的规则,算法的时间复杂度、空间复杂度的定义和表示。

  2. 1.1 数据结构的概念与分类 数据(data) • 数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。 • 数值性数据 • 非数值性数据

  3. 在实际中,按数据性质归类到不同的称之为数据对象的集合中。在实际中,按数据性质归类到不同的称之为数据对象的集合中。 • 数据元素(data element):数据对象中的具有相同性质的数据成员:例如文件中的记录、字符串中的字符、数组中的每个数值等。 • 例如:整数数据对象 N = { 0, 1, 2, … } 学生记录数据对象

  4. 数据记录(Data Record):数据组织的基本单位,记录由若干个数据项组成。 例如:学生记录数据对象 见下列“学生”表格和“课程”表格

  5. “学生”表格

  6. “课程”表格

  7. 数据结构(Data Structure):数据及其之间的相互关系: • 逻辑结构—数据结构 • 物理结构—存储结构

  8. 学生选课系统中实体构成的网状关系 课程 (课程号,课程名,性别,籍贯) 学生 (学号,姓名,性别,籍贯) 选课 (学号,姓名,课程号,成绩)

  9. 什么是数据结构? • 数据结构----数据 + 结构:一般来说,一个数据对象中的所有成员之间均存在着一定的联系(某种关系),这种关系称为数据结构。 • 从不同的视点考虑,数据结构分为: • ---逻辑结构(数据结构) • ---物理结构

  10. 数据结构表示方法 二元组表示 Data_Structure={ D, R } D是某一数据对象,R是该对象中所有数据成员之间的关系的有限集合。 D={ki | 1≤i≤n, n≥0} R={<ku,kv> | ku,kv∈D}

  11. 数据结构表示方法(续1) K上的关系R是序偶的集合,对于R中的任一序偶<x,y>,x,y∈D, x称为序偶的第一个元素,y称为序偶的第二个元素。也称x是y的直接前驱,y是x的直接后继。

  12. 数据结构表示方法(续2) 数据结构的图形表示法,示意图中的每一个结点(顶点)对应着一个元素,两结点之间的连线(有向弧或无向弧)对应关系中的一个序偶。Ku是Kv的前驱,Kv是Ku的后继。 Kv Ku Ku Kv

  13. 线性1:1 树1:n 图m:n 集合 数据结构分类 线性结构、非线性结构 1 1 2 3 4 5 6 2 3 4 5 6

  14. 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

  15. 数据的树型结构示意图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

  16. 数据的图型结构示意图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

  17. 集合结构示意 数据结构举例(续3) 例4:set={ D, R } 其中:D={ 1,2,3,4,5,6,7 } R={ } D中的结点之间没有直接联系

  18. 数据类型 数据类型是对数据的取值(范围)、结构和允许的操作的描述。例如整型、实型、字符型、布尔型、数组、指针、结构、文件等。

  19. 数据的物理结构 数据逻辑结构的存储映像: 顺序、链接、散列、索引 数据的逻辑结构是面向问题的 数据的物理结构是面向计算机的

  20. 1.2 抽象数据类型及面向对象概念 一、 数据类型 1、定义:数据类型是对数据的取值(范围)、结构和允许的操作的描述。例如整型、实型、字符型、布尔型、数组、指针、结构、文件等。 2、分类:简单类型: 简单数据都是无法再分的整体,复合类型:如数组、记录、字符串、结构等。

  21. 1.2 抽象数据类型及面向对象概念(续1) 二、抽象数据类型(ADTs) 1、概念:由一组数据结构和在该组数据结构上的一组操作组成, • 一般数据类型由具体语言系统内部定义,直接提供给编程者定义用户数据,称为预定义数据类型。

  22. 1.2 抽象数据类型及面向对象概念(续2) • 抽象数据类型由编程者定义(数据及操作),不管其数据存储结构及操作具体实现。

  23. 1.2 抽象数据类型及面向对象概念(续2) 2、定义 ADT 抽象数据类型名 is objects: 数据描述 function: 操作声明 end 抽象数据类型名

  24. 抽象数据类型举例 ADTNaturalNumber is Objects: 一个整数的有序子集合,它开始于0,结束 于机器能表示的最大整数(MaxInt)。 Function:对于所有的 x, y  NaturalNumber; False, True  Boolean, +、-、<、==、 =等都是可用的服务。 Zero( ) :NaturalNumber //返回自然数0

  25. 抽象数据类型举例(续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

  26. 抽象数据类型举例(续2) Equal (x, y) : if (x==y) 返回True Booleanelse 返回 False Successor (x) : if (x==MaxInt) 返回 x NaturalNumber else 返回 x+1 endNaturalNumber

  27. 抽象数据类型实现 3、实现:抽象数据类型在C++语言中 是通过类类型来描述。 只允许该类及其 子类直接使用 class 抽象数据类型名{ private: 数据说明部分 public: 操作(函数声明) }; 供该类、子类及外部操作使用。操作的具体实现通常在单独的文件中

  28. 抽象数据类型实现举例 例:设计矩形的一种抽象数据类型,其数据部分包括其长度与宽度,操作部分包括初始化、求周长和面积。

  29. 抽象数据类型实现举例(续) class rectangle { private: float length,width; public: rectangle( ); //构造函数 ~rectangle( ); //析造函数 float getl( ); float getw( ); float circumference(rectangle r); float area(rectangle r); }; 数据结构:数据说明 数据操作:函数

  30. 抽象数据类型特征 抽象数据类型的特征是使用与实现分离,实行封装和信息隐蔽。

  31. 小结 为什么要学习数据结构? • 它研究了计算机需要处理的数据对象和对象之间的关系。 • 它刻画了实际应用中涉及到的数据的逻辑组织。 • 它描述了数据在计算机中如何存储、传送、转换。

  32. 主要讨论哪几种数据结构? • 从传统的观点来看 • 数据的逻辑结构 • 线性结构 • 非线性结构

  33. 线性结构 A B C D E F 非线性结构 A A D B C C D E G B E

  34. 学习数据结构需要注意些什么? 1、知识方面 • 系统掌握基本数据结构的特点及其不同实现。 • 了解并掌握各种数据结构上主要操作的实现及其性能(时间、空间)的分析。

  35. 学习数据结构需要注意些什么?(续) 2、技能方面 • 掌握各种数据结构的使用特性,在算法设计中能够进行选择。 • 掌握常用的递归、回溯、迭代、递推等方法的设计 • 掌握自顶向下、逐步求精的程序设计方法。

  36. 1.3 算法描述 算法特征;输入、输出、确定、有效、有穷。 例如:选择排序问题到算法的转换。 首先:要解决的问题是:将一组无序数据重新排列成有序的数据(假设由大到小)。 其次,解决方案:假设有N数据,存于数组a[0]到a[n-1]中; 第0步,从a[0]~a[n-1]这n个数中找出最大数,存于a[0];

  37. 第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]位置上。

  38. 每次求最大数的方法:先假设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]交换。

  39. 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; } }

  40. 算法描述方法 文字描述 流程图 程序设计语言

  41. 算法评价 正确性:正确 健壮性:合理性 可读性:易读 时间复杂度(计算复杂度):是在计算机上开始到结束运行时间的相对度量,约等于计算机执行一种简单操作所用时间t0与算法中执行简单操作的次数n的乘积,而t0因机器而异。所以用n的函数衡量时间复杂度。

  42. 一般情况下,计算f(n)较复杂,也没有必要,只须大致计算出相应的数量级(Order)。一般情况下,计算f(n)较复杂,也没有必要,只须大致计算出相应的数量级(Order)。 O(f(n)):O(n), O(n2), O(log2n), O(n*log2n), … 空间复杂度: 运行过程中临时占用存储空间大小

  43. 包含文件语句 • #include <iostream.h> • cin / cout / >> / << • #include <stdlib.h> • exit(), rand()—随机数, srand()--随机数种子 • #include <fstream.h> //文件I/O/IO • ifstream / ostream / fstreamt • #include <string.h> 字符串操作函数

  44. 函数 • C++程序---由相对独立的函数组成; • C++函数—main(),程序执行从main()考试; • 一般函数—由用户根据实际需要定义; • main()函数,可以调用一般函数,其它函数 • 可以相互调用(含递归调用)。 • 函数调用方式:函数调用语句,表达式调用 • 函数参数:值形式参数/引用形式参数

  45. #include <iostream.h> #include <string.h> #include <stdlib.h> const int PN=5; struct pupil { char pnum[80]; int grade; };

  46. 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}};

  47. 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){

  48. 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;

  49. 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;

  50. 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; } }

More Related