5.01k likes | 5.19k Views
课 程 简 介. 先修课: 《C++ 语言程序设计 》 任务 研究数据的存储和处理方法; 讨论数据的逻辑结构、存储结构及算法。. 目的. 掌握数据结构特性,能选择适当数据逻辑结构、存储结构及相应的算法 了解算法的时间和空间复杂度分析 培养数据抽象能力和程序设计能力. 线性表. A .线性结构. 栈. 队. 1 .数据的逻辑结构. 数据结构的三个方面. 树形结构. B .非线性结构. 图形结构. A 顺序存储. 2 、数据的存储结构. B 链式存储. 3 、数据的运算:检索、排序、插入、删除、修改等。. 课 程 内 容.
E N D
《数据结构》第一章 课 程 简 介 • 先修课:《C++语言程序设计》 • 任务 研究数据的存储和处理方法; 讨论数据的逻辑结构、存储结构及算法。
《数据结构》第一章 目的 • 掌握数据结构特性,能选择适当数据逻辑结构、存储结构及相应的算法 • 了解算法的时间和空间复杂度分析 • 培养数据抽象能力和程序设计能力
《数据结构》第一章 线性表 A.线性结构 栈 队 1.数据的逻辑结构 数据结构的三个方面 树形结构 B.非线性结构 图形结构 A 顺序存储 2、数据的存储结构 B 链式存储 3、数据的运算:检索、排序、插入、删除、修改等。
《数据结构》第一章 课 程 内 容 第一章 绪论 第二章 线性表 第三章 稀疏矩阵和广义表 第四章 栈和队列 第五章 树和二叉树 第六章 二叉树的应用 第七章 图 第八章 查找 第九章 排序
《数据结构》第一章 第一章 绪 论 学习目标 掌握集合、线性结构、树和图四种常用数据结构的二元组表示; 掌握抽象数据类型的定义和应用;算法的特性和描述方法; 掌握评价算法的时间复杂度和空间复杂度的一般计算规则。
《数据结构》第一章 数据结构研究的是数据的表示和数据之间的关系。 从逻辑上讲,数据有集合、线性、树和图结构四种。 从物理上讲,数据有顺序、链接、索引和散列结构四种。 在集合结构中,不考虑数据之间的任何次序;线性结构中,数据之间是1对1的关系;在树结构中,数据之间是1对多的关系;在图结构中,数据之间是多对多的关系。 算法的评价指标主要为正确性、健壮性、可读性和有效性四个方面。 其中有效性又包括时间复杂度和空间复杂度两个方面。
《数据结构》第一章 1.1 常用术语 数据(Data):是人们利用文字符号、数字符号以及其它规定的符号对现实世界的事物及其活动所做的抽象描述。 数据元素(Data Element):是一个数据整体中相对独立的单位。 数据和数据元素是相对而言的。
《数据结构》第一章 数据记录(Data Record):是数据处理领域组织数据的基本单位。 一个数据记录由一个或多个数据项(Item)所组成
登录号 书号 书名 作者 出版社 定价 《数据结构》第一章 00001 ISBN7-302-02482-0/TP·1250 QBASIC程序设计 徐孝凯 清华大学 26.00 00002 ISBN 7-111-03247-0/TP·158 计算机辅助制造 李德庆 机械工业 3.30 00003 ISBN 7-04-005655-0/TP·312 C++程序设计基础 张基温 高等教育 17.00 00004 ISBN 7-111-04987-X/TP·311 数据结构 李大友 机械工业 24.00 00005 ISBN7-304-01404-0/TP·68 数据库基础与应用 王 利 中央电大 23.30 00006 ISBN 7-302-00860-4/TP·312 C程序设计 谭浩强 清华大学 7.30 00007 ISBN 7-80046-822-4/O·026 应用概率统计 武继玉 航空航天 8.50 表目行或目录行 记录 数据项 表1-1 图书目录表 • 关键项(Key Item):所有记录的该数据项的值都不同(唯一标识一记录); • 关键项中的每一个值称作为所在记录的关键字(Key Word 或Key)。 • 经常利用关键字来代替所在的记录。
《数据结构》第一章 • 数据结构:是指数据及其相互之间的联系。 (Data Structure) • 二元组表示: B=(K,R) K={ki | 1≤i≤n, n≥0} R={<ku,kv> | ku,kv∈K} 第一元素 :第二元素的直接前驱 序偶 第二元素:第一元素的直接后继 • 图形表示: • 如 ku kv
《数据结构》第一章 • 数据的逻辑结构:数据之间的相互联系。 • 数据的物理结构或存储结构:一种数据结构在存储器中的存储方式。 • 数据的逻辑结构和存储结构都反映数据的结构,但通常所说的数据结构是指数据的逻辑结构。
职工号 姓名 性别 出生日期 职务 部门 《数据结构》第一章 01 万明华 男 1952.03.20 处长 02 赵 宁 男 1958.06.14 科长 教材科 03 张 利 女 1954.12.07 科长 考务科 04 赵书芳 女 1962.08.05 主任 办公室 05 刘永年 男 1949.08.15 科员 教材科 06 王明理 女 1965.04.01 科员 教材科 07 王 敏 女 1962.06.28 科员 考务科 08 张 才 男 1957.03.17 科员 考务科 09 马立仁 男 1965.10.12 科员 考务科 10 邢怀常 男 1966.07.05 科员 办公室 表1-2教务处人事简表 关键字
《数据结构》第一章 例1 一种数据结构 set = (K,R) 其中 K={01,02,03,04,05,06,07,08,09,10} R={} 集合结构 (可以看作元素按任一次序排列的线性结构 )
《数据结构》第一章 例2 一种数据结构 linearity = (K,R) 其中 K={01,02,03,04,05,06,07,08,09,10} R={<05,01>,<01,03>,<03,08>,<08,02>, <02,07>,<07,04>,<04,06>,<06,09>,<09,10>} 05 01 03 08 02 07 04 06 09 10 特点:数据元素之间1:1联系,即线性关系,这种数据结构叫做线性结构。
《数据结构》第一章 例3 一种数据结构 tree = (K,R) 其中 K={01,02,03,04,05,06,07,08,09,10} R={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>, <03,07>,<03,08>,<03,09>,<04,10>} 01 02 03 04 05 06 07 09 10 08 特点:数据元素之间的1 :N联系(N≥0), 即层次关系,这种数据结构叫做树结构,简称树。
《数据结构》第一章 例4 一种数据结构 graph = (K,R),其中 K={01,02,03,04,05,06,07} R={r} r={<01,02>,<02,01>,<01,04>,<04,01>,<02,03>, <03,02>,<02,06>,<06,02> , <04,06>,<06,04>, <02,07>,<07,02>,<03,07>,<07,03>, <5,07>,<07,05>} 01 01 02 04 02 04 06 03 06 03 07 05 07 05 r={(01,02),(01,04),(02,03),(02,06),(04,06),(02,07), (03,07),(05,07)}
《数据结构》第一章 特点:数据元素之间的M:N联系(M≥0, N≥0),即网状关系,这种数据结构叫做图结构,简称图。 • 树结构是图结构的特殊情况 (即M=1的情况) • 线结构是树结构的特殊情况 (即N=1的情况) • 树结构和图结构统称为非线性结构。
《数据结构》第一章 数据类型(Data Type):是对数据的取值范围、结构及操作的一种描述。 • 简单类型:简单数据都是无法再分割的整体,如整数。 • 结构类型:由简单类型或结构类型按照一定的规则构造而成,如数组。
《数据结构》第一章 数组 • 数据结构可描述为:array = (A,R) 其中 A = {a[i] | 0≤i≤n-1,n≥1} R = {<a[i],a[i+1]> | 0≤i≤n-2} • 存储结构:顺序结构。 • 一维数组a[n] Address(a[i])=a+i*L (0≤i≤n-1) 其中L表示数组a中元素类型的大小。
《数据结构》第一章 • 二维数组b[m][n] Address(b[i])=b+i*n*L (0≤i≤m-1) Address(b[i][j])=b+i*n*L+j*L (0≤i≤m-1,0≤j≤n-1) • 三维数组c[p][m][n] Address(c[k])=c+k*m*n*L (0≤k≤p-1) Address(c[k][i])=c+k*m*n*L+i*n*L (0≤k≤p-1,0≤i≤m-1) Address(c[k][i][j])=c+k*m*n*L+i*n*L+j*L (0≤k≤p-1,0≤i≤m-1,0≤j≤n-1)
《数据结构》第一章 抽象数据类型(Abstract Data Type, ADT) 由一组数据结构和在该组数据结构上的一组操作所组成。 ADT <抽象数据类型名> is Data: <数据描述> Operations: <操作声明> end <抽象数据类型名>
《数据结构》第一章 例:矩形的抽象数据类型 ADT RECtangle is Data: //数据描述 float length, width; Operations://操作声明 void InitRectangle(Rectangle& r, float len, float wid);//初始化矩型数据 float Circumference(Rectangle& r);//周长 float Area(Rectangle& r);//面积 end RECtangle
《数据结构》第一章 • 数据对象(Data Object)简称对象 数据类型中的特定实例 • 算法(Algorithm) 是对解决问题的方法的一种描述。 算法应具备的特性: • 有穷性 • 确定性 • 可行性 • 输入 • 输出
《数据结构》第一章 1.2 算法描述 例:n个整数元素中查找出最大值 文字描述: (1)输入数值a1an (2)把a1赋给变量x (3)i 赋初值 2 (4)若i<=n 执行下一步,否则输出x 值后结束 (5)若ai>x 将ai赋给x (6) i 增1 (7) 转向第(4)步继续执行。
《数据结构》第一章 流程图描述 开始 为n个元素a1~an输入数值 a1 x 2 i N i<=n 本书的算法采用文字和C++语言两种描述。 Y 输出x N ai >x Y 结束 ai x i +1 i
《数据结构》第一章 1.2.1 包含文件语句 1.#include<iostream.h> • 能直接输入输出char, short, int, long, float, double, long double类型的数据 • 能输出(char *)类型指针所指向的字符串数据; • 对非字符指针类型的数据能直接输出指针(即操作数地址); • 对用户定义类型的数据,必须对>>和<<操作符重载后才能进行整体输入和输出。
《数据结构》第一章 2.#include<stdlib.h> 此头文件中含有void exit(int),int rand(void), void srand(unsigned)等函数的原型。 3.#include<fstream.h> ifstream input(“qabc1.dat",ios::in|ios::nocreate); ofstream output1(“qabc2.dat",ios::out); ofstream output2("a:qabc.txt",ios::app); fstream inout(“qabc3.cpp",ios::in|ios::out);
《数据结构》第一章 4. #include<string.h> 定义有一些字符串函数的原型: (1)int strlen(const char* s); (2)char* strcpy(char* dest, const char* src); (3)char* strcat(char* dest, const char* src); (4)int strcmp(const char* s1, const char* s2); (5)char* strchr(const char* s, int c); (6)char* strrchr(const char* s, int c); (7)char* strstr(const char* s1, const char* s2);
《数据结构》第一章 1.2.2 函数 • 在C++语言中,程序由若干函数组成,其中必有主函数main。 • 函数可返回一简单或记录类型的值或引用,也可不返回值。 • 函数可带或不带形参,形参可以是任何类型的值参数或除了数组类型和函数类型之外的任何类型的引用参数。
《数据结构》第一章 引用类型(&) 引用就是给变量起别名 int i; int &j=i; i 20 j 它们指向同一个内存单元 程序对i的任何操作,都同时使 j 被操作;反之亦然。
《数据结构》第一章 例:指针类型实现两个整数的交换 void swap(int *x,int *y) {int temp; temp=*x; *x=*y; *y=temp;} main() { int m=10,n=5; swap(&m,&n); printf(“m=%d,n=%d”,m,n);} m n 5 10 &n &m x y
《数据结构》第一章 引用类型实现两个整数的交换 void swap(int &x,int &y) {int temp; temp=x; x=y; y=temp;} void main() { int m=10,n=5; swap(m,n); cout<<“m=”<<m<<“n=”<<n<<endl;} m n 10 5 x y
《数据结构》第一章 1.2.3 运算符重载 在C++语言中,允许对绝大多数运算符进行重载,以方便自定义结构类型的使用。
《数据结构》第一章 1.3 算法评价 • 正确性 • 健壮性 • 可读性 • 有效性 • 时间复杂度 • 空间复杂度
《数据结构》第一章 时间复杂度 若一问题的规模为n,则算法的时间复杂度就是n的一个函数,记f(n)。通常把算法中包含简单操作次数的多少叫做算法的时间复杂度。 例1:累加求和 int Sum(int b[],int n) { int s=0; //1次 for(int i=0;i<n;i++) //3n+2次 s+=b[i]; //n次 return s; //1次 }
《数据结构》第一章 例2:矩阵相加 void MatrixAdd(int a[MS][MS], int b[MS][MS], int c[MS][MS], int n) { int i,j; for(i=0;i<n;i++) //3n+2次 for(j=0;j<n;j++) //n(3n+2)次 c[i][j]=a[i][j]+b[i][j]; //n2次 } }
《数据结构》第一章 例3:简单选择排序 void SelectSort(int b[],int n){ int i,j,k,x; for(i=0;i<n-1;i++){ //3n-1次 k=i; //n-1次 for(j=i+1;j<n;j++)//2(n-i-1)+(n-i)+n-1次 if(b[j]<b[k]) k=j; // (n-i-1) 次 x=b[i]; //n-1次 b[i]=b[k]; //n-1次 b[k]=x; // n-1 次 } }
《数据结构》第一章 f(n) g(n) 时间复杂度f(n)的数量级表示 设f(n)的一个辅助函数为g(n),当n≥n0时( n0为一足够大的正整数),存在两个正常数A和B(其中A≤B),使得 A≤ ≤B均成立, 则称g(n)是f(n)的同数量级函数。把f(n)表示成数量级的形式为:f(n)=O(g(n)) 时间复杂度通常有 O(1)<O(log2n)<O(n)<O(n*log2n)<O(n2)<O(n3)<O(2n)< O(n!)
《数据结构》第一章 例3:顺序查找 int SequenceSearch(int a[], int n, int key) { for (int i=0; i<n; i++) if (a[i]==key) return i; return -1; } 时间复杂度 最好情况是1次比较, 为O(1) ; 最差情况是n次比较,为O(n); 平均情况是:等概率下平均比较次数为(n+1)/2,为O(n),
《数据结构》第一章 空间复杂度 • 算法本身所占用的存储空间 • 输入输出数据所占用的存储空间 • 临时占用的存储空间
《数据结构》第一章 第二章 线性表 学习目标 掌握线性表的顺序存储结构及具体操作实现; 掌握线性表的单、双向链接存储结构及具体操作实现; 掌握算法时间复杂度分析。
《数据结构》第一章 2.1 线性表的定义和抽象数据类型 2.1.1 线性表的定义 线性表(Linear List):是具有相同属性数据元素的一个有限序列。 A= (a1,a2,…,ai,ai+1,…,an) a1是表头元素, an是表尾元素 n 是表长度,当n=0时为空表
《数据结构》第一章 … … a1 a2 ai ai+1 an 二元组表示 linear_list=(A,R) A={ ai | 1≤i≤n, n≥0, ai∈ElemType} R={ <ai,ai+1> | 1≤i≤n-1 } 线性表的逻辑结构示意图
《数据结构》第一章 线性结构的基本特性为一对一的关系 必有唯一的数据元素无前驱(第一个元素). 必有唯一的数据元素无后继(最后一个元素). 除第一个和最后一个元素外,均有唯一的前驱和后继.
《数据结构》第一章 在一个线性表中若存在着按值的升序或降序排列的字段,则称该字段为有序字段,该线性表为有序表,否则若不存在任何有序字段,则为无序表。 例 L1=( “this”, “ is”, “ a”, “ english ”, “ book ”) L2=(2101, 2102, 2103, 2104, 2105, 2106, 2110, 2118)
《数据结构》第一章 2.1.2 线性表的抽象数据类型 包括数据和操作两个部分,数据部分为一个线性表,操作部分包括插入、删除、求长度、判断是否为空等。 ADT LinearList is Data: 线性表L=(a1,a2,…,ai,ai+1,…,an) Operation: void InitList(&L);//初始化L为一空表 void ClearList(&L); //清除L的元素使之为一空表 int ListSize(&L);//返回L的长度 bool ListEmpty(&L);//判断L是否为空 ElemType GetElem(&L,int pos); //返回L中第pos个元素的值
《数据结构》第一章 void TraverseList(&L);//遍历L bool Find(&L,ElemType& item); //从L中查找其值与item相等的元素 bool Update(&L,const ElemType& item); //L中查找值与item等的元素,更新该元素值 void InsertRear(&L,const ElemType& item); //把item的值插入到表尾 void InsertFront(&L,const ElemType& item); //把item的值插入到表头
《数据结构》第一章 void Insert(&L,const ElemType& item); //把item值插入到L中满足条件的位置 ElemType DeleteFront(&L); //删除L中的表头元素 bool Delete(&L,const ElemType& item); //从L中删除其值等于item的元素 void Sort(&L); //对L中的元素按值的升序重新排列 end LinearList
《数据结构》第一章 a1 a2 … ai-1 ai … an 基地址 2.2 线性表的顺序存储和操作实现 2.2.1 线性表的顺序存储 用一块连续的存储单元 依次存放线性表中的数据元素 (逻辑关系相邻, 物理位置相邻。)
《数据结构》第一章 <ai-1,ai>存储位置相邻 即: LOC(ai) = LOC(ai-1) + L 其中 L=sizeof(ElemType) 数据元素的存储位置取决于 首元素的存储位置 LOC(ai) = LOC(a1) + (i-1)×L 基地址