第1章概论
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章 概论
本章介绍了数据结构这门学科诞生的背景、发 展历史以及在计算机科学中所处的地位,重点介绍 了数据结构有关的概念和术语,读者学习本章后应
能掌握数据、数据元素、逻辑结构、存储结构、数
据处理、数据结构、算法设计等基本概念,并了解
如何评价一个算法的好坏。
1.1 数据结构的概念
1.数据 (Data)
数据结构(C语言描述) 黄丹
前
言
• 二十一世纪是科学技术高速发展的信息时代,而计算机是 处理信息的主要工具。 • 在非数值计算领域里,数据处理的对象已从简单的数值发 展到一般的符号,进而发展到具有一定结构的数据。 • 针对计算机及其应用的各个领域中的处理对象,学会分析 研究计算机加工对象的特性,选择合适的数据结构和存储 表示,以及编制相应的实现算法,是计算机工作者不可缺 少的知识。 • 因此,“数据结构”课程已成为计算机专业教学中的一门 重要专业基础课,在我国计算机专业教学计划中,它是核 心课程之一。
模型。
• 数据的存储结构:是逻辑结构用计算机语言的实现,它依赖于 计算机语言 。
• 数据的运算:是定义在数据的逻辑结构上,而实现在数据的存 储结构上。
逻辑结构
• 在表1-1所示的表格数据中,各结点之间在逻辑上有一种线性关系,
它指出了10个结点在表中的排列顺序。根据这种线性关系,可以看
出表中第一本书是什么书,第二本书是什么书,等等。
例1:素数的判断算法。
Void prime( int n)
/* n是一个正整数 */
{ int i=2 ; while ( (n% i)!=0 && i*1.0< sqrt(n) ) i++ ; if (i*1.0>sqrt(n) ) printf(“&d 是一个素数\n” , n) ; else printf(“&d 不是一个素数\n” , n) ; } 嵌套的最深层语句是i++;其频度由条件( (n% i)!=0 && i*1.0< sqrt(n) ) 决定,显然i*1.0< sqrt(n) ,时间复杂度O(n1/2)。
• 数据元素及其关系在计算机存储器内的表示,也称为 数据的存储结构(Storage Structure) 。 • 数据的运算,即对数据施加的操作。
4.数据结构(Data Structure)
• 数据的逻辑结构:是从逻辑关系上描述数据,它与数据的存储
无关,是独立于计算机的,可看作是从具体问题抽象出来的数学
• 数据类型分为原子数据类型和结构数据类型。
• 另一方面,在程序设计过程中,当需要引入某种新的数据结构时,总 是借助编程语言所提供的数据类型来描述数据的存储结构。
4.数据结构(Data Structure)
数据结构指的是数据之间的相互关系,即数据的组织形式。 它一般包括三个方面的内容:
• 数据元素之间的逻辑关系,也称为数据的逻辑结构 (Logical Structure)。
• 有时一个数据元素中含有若干个数据项(也叫字段、 域),字段是构成数据的最小单位 。
例如,在表1-1所示的表格数据中,每个结点都有登录号、书号、 书名、作者、出版社和价格等六个字段构成。
3.数据类型(Data Type)
• 数据类型是具有相同性质的计算机数据的集合及在这个数 据集合上的一组操作。
“数据结构”在计算机科学中是一门综合性的专业基础 课。数据结构是介于数学、计算机硬件和计算机软件三 者之间的一门核心课程。 2. 数据结构这一门课的内容不仅是一般程序设计(特别是 非数值性程序设计)的基础,而且是设计和实现编译程 序、操作系统、数据库系统及其他系统程序的重要基础。 3. 处理非数值性问题:数据结构复杂,能设计出合适的数 据结构,才能有效地解决问题。 著名的瑞士计算机科学家N.Wirth教授曾提出: 算法+数据结构=程序。 4. 程序设计的实质:是对实际问题选择一种好的数据结构, 加之设计一个好的算法,而好的算法在很大程度上取决 于描述实际问题的数据结构。 1.
体要求而定,主要考虑运算方便和算法的时空要求。
1.2 为什么要学习数据结构
发展史:
•
•
“数据结构”作为一门独立的课程在国外是从1968 年才开始设立的。 1968年美国唐· 克努特教授开创了数据结构的最 欧· 初体系,他所著的《计算机程序设计技巧》第一卷 《基本算法》是第一本较系统地阐述数据的逻辑结 构和存储结构及其操作的著作。
本章小结
本章主要介绍了如下一些基本概念:
数据是信息的载体,它能够被计算机识别、存储和加 工处理。 数据是计算机程序加工的”原料“。
人们利用文字符号、数字符号以及其他规定的符号对现实世界的 事物及其活动所做的描述。在计算机科学中,数据的含义非常广泛, 我们把一切能够输入到计算机中并被计算机程序处理的信息,包括文 字、表格、图象等,都称为数据。例如,一个个人书库管理程序所要 处理的数据可能是一张如表1-1所示的表格。
2.执行算法所耗费的时间
• 指算法中每条语句的执行时间总和,每条语句的执行时间是该语句 的执行次数(频度)与该语句执行一次所需时间的乘积。假设执行 每条语句所需时间均是单位时间,一个算法的时间耗费就是该算法 中所有语句的频度之和。 • 求解问题的输入量(或初始数据量)称为问题的规模。 • 算法的时间复杂度:是一个算法求解问题规模n的函数。当我们评 价一个算法的时间性能时,主要标准是算法时间复杂度的数量级, 即渐近时间复杂度。 • 最坏时间复杂度和平均时间复杂度
本书介绍各种最常用的数据结构,阐述各种数 据结构内涵的逻辑关系,讨论它们在计算机中的存 储表示,以及在这些数据结构上的运算(操作)和 实际的执行算法,并对算法的效率进行简要的分析 和讨论。
目录
• • • • • • • • • • 第一章 第二章 第三章 第四章 第五章 第六章 第七章 第八章 第九章 第十章 概论 线性表 栈和队列 串 多维数组和广义表 树 图 排序 查找 文件
• 数据类型是指程序设计语言中各变量可取的数据种类。数据类型是高 级程序设计语言中的一个基本概念,它和数据结构的概念密切相关。 • 一方面,在程序设计语言中,每一个数据都属于某种数据类型。类型 明显或隐含地规定了数据的取值范围、存储方式以及允许进行的运算。 可以认为,数据类型是在程序设计中已经实现了的数据结构。
2. 算法的描述
• 一个算法可以用自然语言、数字语言或约定的符号来描述, 也可以用计算机高级程序语言来描述,如Pascal语言、C 语言或伪代码等。本书选用C语言作为描述算法的工具。
1.4
算法分析
如何评价算法的好坏?
1.正确性:前提
“正确”的含义在通常的用法中有很大的差别, 大体可分为以下四个层次:①程序不含语法错误;② 程序对于几组输入数据能够得出满足规格说明要求的 结果;③程序对于精心选择的典型、苛刻而带有刁难 性的几组数据能够得出满足规格说明要求的结果;④ 程序对一切合法的输入数据都能产生满足规格说明要 求的结果。
O (nk): k≥2 ,k次方时间阶
例1 两个n阶方阵的乘法 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] ; } 由于是一个三重循环,每个循环从1到n,则总次数为: n×n×n=n3 时间复杂度为T(n)=O(n3) 例2 {++x; s=0 ;} 将x自增看成是基本操作,则语句频度为1,即时间复杂度 为O(1) 。如果将s=0也看成是基本操作,则语句频度为2,其 时间复杂度仍为O(1),即常量阶。
Leabharlann Baidu
3.空间复杂度
• 算法的空间复杂度:类似于时间复杂度的讨论,为该算 法所耗费的存储空间,它也是问题规模n的函数。 • 该存储空间一般包括三个方面: – 指令常数变量所占用的存储空间; – 输入数据所占用的存储空间; – 辅助(存储)空间。 • 一般地,算法的空间复杂度指的是辅助空间。 – 一维数组a[n]: 空间复杂度 O(n) – 二维数组a[n][m]: 空间复杂度 O(n*m)
例2:冒泡排序法。
Void bubble_sort(int a[],int n) { change=false; for (i=n-1; change=TURE; i>1 && change; --i) for (j=0; j<i; ++j) if (a[j]>a[j+1]) { a[j] ←→a[j+1] ; change=TURE ; } } – 最好情况:0次 – 最坏情况:1+2+3+⋯+n-1=n(n-1)/2 – 平均时间复杂度为: O(n2)
存储结构
• 在表1-1所示的表格数据在计算机中可以有多种存储表示,例如,可 以表示成数组,存放在内存中;可以应用指针,组织成链表;也可
以表示成文件,存放在磁盘上,等等。
直接前趋、直接后继
数据结构(Data Structure):
按某种逻辑关系组织起来的一批数据,应用计算 机语言,按一定的存储表示方式把它们存储在计算机 的存储器中,并在这些数据上定义了一个运算的集合, 就叫一个数据结构。
以下六种计算算法时间的多项式是最常用的。其关系为: O(1)<O(㏒n)<O(n)<O(n㏒n)<O(n2)<O(n3) – 指数时间的关系为: O(2n)<O(n!)<O(nn) 当n取得很大时,指数时间算法和多项式时间算法在所需 时间上非常悬殊。因此,只要有人能将现有指数时间算法中的 任何一个算法化简为多项式时间算法,那就取得了一个伟大的 成就。 – 有的情况下,算法中基本操作重复执行的次数还随问题的 输入数据集不同而不同。
例3 for(i=1; i<=n; ++i)
{ ++x; s+=x ; }
语句频度为:2n,其时间复杂度为:O(n) ,即为线性阶。 例4 for(i=1; i<=n; ++i) for(j=1; j<=n; ++j) { ++x; s+=x ; } 语句频度为:2n2 ,其时间复杂度为:O(n2) ,即为平方阶。
表 1-1 个人书库
2.数据元素(Data Element)
• 数据元素是数据的基本单位。 • 数据元素也叫结点、元素、顶点、记录。
在程序中通常把结点作为一个整体进行考虑和处理。例如,在表 1-1所示的个人书库中,为了便于处理,把其中的每一行(代表一 本书)作为一个基本单位来考虑,故该数据由10个结点构成。
4.简单性
• 最简单和最直接的算法往往不是最有效的,但算法的简单
性使得证明其正确性比较容易,同时便于编写、修改、阅
读和调试,所以还是应当强调和不容忽视的。不过对于那 些需要经常使用的算法来说,高效率(即尽量减少运行时 间和压缩存储空间)比简单性更为重要。
算法分析示例:
算法中基本操作重复执行的次数是问题规模n的某个函数, 其时间量度记作 T(n)=O(f(n)),称作算法的渐近时间复杂度 (Asymptotic Time complexity),简称时间复杂度。 一般地,常用最深层循环内的语句中的基本操作的执行频 度(重复执行的次数)来表示。 表示时间复杂度的阶有: O(1) :常量时间阶 O(㏒n) :对数时间阶 O (n):线性时间阶 O(n㏒n) :线性对数时间阶
5. 逻辑结构的分类:
• 线性结构:有且仅有一个开始结点和一个终端结点,
并且所有结点都最多只有一个直接前趋和一个直接后 继。
• 非线性结构:一个结点可以有多个直接前趋和直接后
继。
6. 存储结构可用以下四种基本的存储方法得到:
• 顺序存储方法 • 链接存储方法 • 索引存储方法 • 散列存储方法 同一逻辑结构采用不同的存储方法,可以得到不同的存 储结构。选择何种存储结构来表示相应的逻辑结构,视具
1.3
1. 算法
算法的描述
是由若干条指令组成的有穷序列。必须满足下述准则:
• • 输入:具有0个或多个输入的外界量。 输出:至少产生1个输出。
•
• •
有穷性:每条指令的执行必须是有限的。
确定性:算法中每条指令的含义都必须是明确的,无二义性。 可行性:每条指令的执行时间必须是有限的。
注意:算法和程序是有区别的,即程序未必满足有穷性;程序中的指令必须 是机器可执行的,而算法中的指令则无此限制。