1 / 24

第一章 绪论

第一章 绪论. 1 . 1 基本术语 1 . 2 数据结构的定义及研究的内容 1 . 2 . 1 数据的逻辑结构 1 . 2 . 2 数据的存储结构 1 . 2 . 3 数据的运算 1 . 3 算法 1 . 3 . 1 算法的概念及特性 1 . 3 . 2 算法的描述 1 . 3 . 3 算法的评价 1 . 4 学习数据结构的意义和目的. 第一章 绪论. 1 . 1 基本术语 数据 ( Data )是人们约定的符号,用它来表示客观事物及其活动,是信息的载体。数据是计算机程序加工处理的对象。

aggie
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. 第一章 绪论 • 1.1 基本术语 • 1.2 数据结构的定义及研究的内容 1.2.1 数据的逻辑结构 1.2.2 数据的存储结构 1.2.3 数据的运算 • 1.3 算法 1.3.1 算法的概念及特性 1.3.2 算法的描述 1.3.3 算法的评价 • 1.4 学习数据结构的意义和目的

  2. 第一章 绪论 • 1.1 基本术语 • 数据(Data)是人们约定的符号,用它来表示客观事物及其活动,是信息的载体。数据是计算机程序加工处理的对象。 • 数据元素(Data Element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理,在不同的情况下,又可以称为元素、结点、顶点或记录。数据是由数据元素构成的。 • 数据项(Data Item)是构成数据元素不可分割的具有独立含义的最小标识单位。若数据元素可再分,则数据元素是由若干个数据项组成;如数据元素不可再分,数据元素和数据项是同一概念,如整型数据就是不可再分的。 • 数据类型(Data Type)是一个值的集合和定义在这个值集上一组操作的总称。按值的不同特性,高级程序设计语言中的数据类型可分为原子类型和结构类型两类。

  3. 1.2 数据结构的定义及研究的内容 • 数据结构的定义及研究的内容 • 数据结构(Data Structure):按照某种逻辑关系组织起来的一批数据,用一定的存储方式存储在计算机的存储器中,并在这些数据上定义一个运算的集合,就称为一个数据结构(Data Structure)。 • 数据结构重点研究的内容: • (1)数据的逻辑结构:即数据之间的逻辑关系。 • (2)数据的存储结构:即数据及数据之间的关系在计算机存储器中的表示。 • (3)数据的运算:即对数据施加的各种操作。

  4. 数据的逻辑结构 • 数据的逻辑结构(Logical Structure:的是数据元素之间的逻辑关系。它是人们根据实际问题的需要和问题本身所含数据之间的内在联系而抽象出来的数学模型,与如何利用计算机存储和处理无关,所以被称为数据的逻辑结构。 • 由于数据的逻辑结构是数学模型,可以借助数学方法来表示,具体的可以用离散数学中关系代数的二元组表示: Data_Structure =(D,S) • 通常取S中的一个关系rj来进行讨论,rj可以表示为数据元素的序偶<di,dj>的集合。如果集合中有序偶<di,dj>,表示数据元素di和dj之间有rj这种关系。 • 用二元组表示的数据的逻辑结构,有如下的常用术语 • (1)前趋结点、后继结点、相邻结点 • (2)开始结点、终端结点、内部结点 • 数据的逻辑结构还能够利用更形象的图形表示

  5. 数据的逻辑结构有两大类: (1)线性结构:经典的线性结构是线性表。 线性结构的逻辑特征是:有且仅有一个开始结点和一个终端结点,其余的内部结点都有且仅有一个前趋结点和一个后继结点,也就是说结构中的数据元素间存在着一对一的相互关系。 (2)非线性结构:经典的非线性结构有树形结构和图形结构。 树形结构的逻辑特征是:有且仅有一个开始结点,可有若干个终端结点,其余的内部结点都有且仅有一个前趋结点,可以有若干个后继结点,也就是说结构中的数据元素间存在着一对多的层次关系。 图形结构的逻辑特征是:可有若干个开始结点和终端结点,其余的内部结点可以有若干个前趋结点和若干个后继结点,也就是说结构中的数据元素间存在着多对多的网状关系。

  6. 表1.1 某校围棋社团学生简表

  7. 例1.1 在表1.1中,八名学生按学号从小到大排列,形成一个线性结构。假设表示这种逻辑结构的关系为r1,则r1可以定义为学生按学号顺序递增排列的关系,该线性结构的逻辑结构可用二元组表示为: L =(D,S),r1∈S D ={01,02,03,04,05,06,07,08} r 1 ={<01,02>,<02,03>,<03,04>,<04,05>, <05,06>,<06,07>,<07,08>} 图1.1 线性结构的图示

  8. 图1.2 树形结构的图示 例1.2在表1.1中,学生之间还存在着领导与被领导关系,其中01号学生为团长,直接领导02和03号学生,他们分别是组长,02号学生直接领导04和05号学生,03号学生直接领导06、07和08号学生,假设表示这种逻辑结构的关系为r2,则r2可以定义为学生之间的领导与被领导关系,该数据结构的逻辑结构可用二元组表示为: T =(D,S),r2∈S D ={01,02,03,04,05,06,07,08} r2 ={<01,02>,<01,03>,<02,04>,<02,05>, <03,06>,<03,07>,<03,08> }

  9. 例1.3 在表1.1中,学生之间还有好友关系,如01和02、03、05号是好友,02和04号是好友,03和05号是好友,04和05、06号是好友,06和07之间是好友,08无好友,假设表示这种逻辑结构的关系为r3,则r3可以定义为学生之间的好友关系,该数据结构的逻辑结构可用二元组表示为: G =(D,S),r3∈S D ={01,02,03,04,05,06,07,08} r3 ={<01,02>,<02,01>,<01,03>,<03,01>,<01,05>,<05,01>,<02,04>,<04,02>,<03,05>,<05,03>,<04,05>,<05,04>,<04,06>,<06,04>,<06,07>,<07,06>}

  10. 数据的存储结构 • 数据的存储结构(Storage Structure),是指数据的逻辑结构到计算机存储器的映射。 • 对于数据的逻辑结构G =(D,S),在映射中,一方面要将数据集D中的数据元素存放到存储器中,另一方面还要体现关系集S,常见的体现关系S的方式有显示和隐含两种。 • 常用的实现数据存储结构的方法有如下四种: • 1.顺序存储 • 2.链接存储 • 3.索引存储 • 4.散列存储 • 四种存储方法,可以单独使用,也可以组合起来对数据结构进行存储映象。同一种逻辑结构采用不同的存储方法,可以得到不同的存储结构。针对具体的应用,某种数据结构选择何种存储结构主要考虑运算的方便及效率。 • 存储结构的描述:数据的存储结构是数据的逻辑结构用计算机语言的实现,它是依赖于计算机语言的,因此可以借用高级语言中提供的数据类型(如数组、指针等)来描述它。

  11. 1.顺序存储 • 基本思想是:把逻辑上相邻的数据元素存储在物理位置上相邻的存储单元里。 • 数据元素间的逻辑关系由存储单元的邻接关系来体现,也就是说逻辑关系上相邻物理位置上也相邻,数据元素的逻辑次序与物理次序一致。这是一种隐含体现关系的存储方法,关系隐含在存储位置上。 • 数据元素在存储区域中是连续存放的,这种存储方法称为顺序存储结构(Sequential Storage Structure),通常用计算机高级语言中的数组来描述。 • 2.链接存储 • 基本思想是:通过附加指针域表示数据元素之间的关系。 • 这种存储方法不要求逻辑上相邻的数据元素存储位置上也相邻,数据元素间的逻辑关系是通过附加指示其他数据元素位置的地址信息(指针)而得到的,这是一种显示体现关系的存储方法。 • 数据元素在存储区域中可以是连续的,也可以是不连续的,通常用计算机高级语言中的指针来描述,称为链接存储结构(Linked Storage Structure)。 • 由于不要求存储空间的连续性,很适合动态存储管理

  12. 例1.4 用上述两种方法存储有序序列A=(99, 123,134),假设每个数据元素占2个字 节,即一个存储单元为两个字节。 图1.4 关系的映像方法

  13. 3.索引存储 • 基本思想是:除了存储数据元素,还要建立一个或若干个附加的索引表来标识数据元素的地址。 • 索引表中的每一项称为索引项,是用来标识一个或一组数据元素的存储位置。索引项一般形式为(关键字,地址),其中的关键字是用来标识数据元素的数据项。 • 若每个数据元素对应一个索引项,则该索引表为稠密索引(Dense Index)。若一组数据元素对应一个索引项,则该索引表称为稀疏索引(Sparse Index)。 • 索引存储方法主要是用于实现快速查找而设计的一种存储方式。 • 4.散列存储 • 基本思想是:根据数据元素的关键字直接计算出该结点的存储地址,通常称为关键字-地址转换法。在此方法中需要设计一个散列函数,以关键字为自变量,散列函数值即为地址。 • 用这种存储方法设计的存储结构最适合按关键字进行查找,但数据元素之间的关系已经无法在存储结构上体现。

  14. 数据的运算 • 数据的运算(也称操作)是指对数据元素进行加工和处理。 • 运算的种类很多,具体视应用的要求而设置运算的种类。 • 对每种数据结构设置一些基本运算(操作),使得不同应用都能通过这些操作实现对数据结构的各种访问,是数据结构中研究的一个重要方面。数据结构的基本操作一般包括查找、插入、删除、更新、排序等。 • 这些基本运算实际是在抽象的数据上所施加的一系列抽象的操作,所谓抽象的操作,就是不涉及具体的应用,只知道这些操作应该完成的功能,但无须考虑“如何完成”。这些运算的粒度很小,是构造复杂运算的基础。 • 数据基本运算的定义是基于数据的逻辑结构,每种经典的逻辑结构都有一个运算的集合。 • 数据的运算是定义在数据的逻辑结构上而实现在数据的存储结构上的 。 • 数据的运算是通过算法来描述的 。 • 在讨论任何一种数据结构时,都应该将数据的逻辑结构、数据的存储结构和数据的运算这三方面看成一个整体,不要孤立地理解一个方面,而要注意它们之间的联系

  15. 1.3 算法 • 算法的概念及特性 • 算法(Algorithm)是解决特定问题的方法和步骤,是由若干条指令组成的有限序列。 • 一个算法必须具有以下五个特性: (1)有穷性:对于任意一组合法输入值,一个算法必须总是在执行有穷步骤后结束,有限时间内完成。 (2)确定性:算法中每条指令都确切地规定了所应执行的操作,使算法的执行者或阅读者能明确其含义及如何执行,不致产生二义性或多义性;另外,在同一条件下,一个算法只能有一条执行路径。 (3)可行性:算法中的每一步都是可行的,都可以通过手工或机器可以接受的有限次操作在有限时间内完成。 (4)输入:一个算法有0个或多个输入,这些输入是算法所需的初始量或待处理的对象,来自某个特定的对象集合。 (5)输出:一个算法有1个或多个输出,这些输出与输入有着某种特定的关系。

  16. 算法的描述 • 算法一般可以采用自然语言、程序流程图、伪码、高级程序设计语言等描述。 • 算法的评价 • 通常从定性和定量两方面来评价一个算法 • 算法的定性评价,是从算法的设计者和使用者角度来衡量优劣的 (1)正确性(Correctness)是指算法应当满足具体问题的需求,即对合理的输入,算法都会得出正确的结果,这是设计和评价一个算法的首要条件,否则其他的评价标准也就无从谈起。 (2)可读性(Readablity)是指算法被理解的难易程度。 (3)健壮性(Robustness)是指算法对输入的非法数据恰当地作出反映或进行相应处理的能力。 (4)简单性(Simplicity)是指一个算法所采用的逻辑结构、存储结构以及处理过程的简单程度。

  17. 算法的定量评价 • (1)时间复杂度(Time Complexity)是一个算法运行时所耗费的系统时间,也就是算法的时间效率。 • 每条语句重复执行的次数称为语句的频度(Frenquency count) • 当不考虑算法运行的软硬件环境时,算法所耗费的时间就是该算法中所有简单语句的频度之和。 • 一般情况,在讨论算法的时间效率时,主要考虑当问题规模n趋向无穷大时,时间复杂度T(n)的数量级,亦称为算法的渐近时间复杂度,则T(n)= O(f(n)) 。 记号“O”是一个数学符号,其数学定义是: 设T(n)和f(n)均为正整数n的函数,若存在两个正整数M和n0,使得当n≥n0时,都有 | T(n)|≤ M | f(n)| 存在,则T(n)= O(f(n))。 • 在多数情况下,当一个算法中有若干个循环语句时,算法的时间复杂度是由嵌套循环中最内层循环语句的频度决定的。需要注意的是,如果算法中包括对其他函数或算法的调用,计算算法的时间复杂度时还要分析被调用算法或函数的时间复杂度。

  18. 例1.5求一维数组元素中的最大值 int sum(int a[],int n) { int i,s; (1) s= a[0]; /*1次*/ (2) for(i=1;i<n; i++; ) /*n次*/ (3) if (s< a[i]) s= a[i]; /*n-1次*/ (4) return s; /*1次*/ } T1(n)= 1+n+n-1+1=2n+1 T1(n)=O(n) ,即f(n)=n

  19. 例1.6 两个n阶方阵相加 void Matrixadd(int a[ ][ ],int b[ ][ ],int c[ ][ ],int n) { int i,j; (1) for (i=0;i<n;i++) /*n+1次*/ (2) for (j=0;j<n;j++) /* n×(n+1)次*/ (3) c[i][j]=a[i][j]+b[i][j]; /* n2次*/ } T2(n)= n+1+ n×(n+1)+ n2=2n2+2n+1 T2(n)=O(n2),即f(n)=n2

  20. 例1.7 求两个n阶方阵的乘积 void Matrixmlt(int a[ ][ ],int b[ ][ ],int c[ ][ ],int n) { int i,j,k; (1) for (i=0;i<n;i++) /*n+1次*/ (2) for (j=0;j<n;j++) /* n×(n+1)次*/ (3) { c[i][j]=0; /* n2次*/ (4) for (k=0;k<n;k++) /* n2×(n+1)次*/ (5) c[i][j]= c[i][j]+a[i][k]*b[k][j]; /* n3次*/ } } T3(n)= n+1+ n×(n+1)+ n2+ n2×(n+1)+ n3=2n3+3n2+2n+1 T3(n)= O(n3) ,即f(n)=n3

  21. 最好时间复杂度、最坏时间复杂度和平均时间复杂度最好时间复杂度、最坏时间复杂度和平均时间复杂度 例1.8在一维数组中查找指定的元素 int search(int a[],int x,int n) { int i; (1) for(i=0;i<n; i++; ) (2) if (a[i]==x) ruturn i+1; (3) return 0; } • 最好时间复杂度为O(1) • 最坏时间复杂度为O(n) • 平均时间复杂度为O(n):在查找各个元素概率相等的情况下,平均的比较次数为:(1+2+3+4+…+(n-1)+n)/n=(n+1)/2,平均时间复杂度为O(n)。

  22. 常见的时间复杂度,按数量级从小到大的顺序依次为:常见的时间复杂度,按数量级从小到大的顺序依次为: • 常数级O(1) • 对数级O(log2n) • 线性级O(n) • 线性对数级O(nlog2n) • 平方级O(n2) • 立方级O(n3) • k次方级O(nk) • 指数级O(2n) • 阶乘级O(n!) • 其中指数级O(2n)和阶乘级O(n!)常称为不可实现的算法时间复杂度

  23. 空间复杂度(Space Complexity) • 空间复杂度(Space Complexity)是一个算法运行时所耗费的存储空间,也就是算法的空间效率。 • 解决同一个问题的不同算法,占存储空间少的效率高。 • 一般情况下,算法占用的存储空间包括三个部分:算法本身占的存储空间、算法所处理的数据占的存储空间和算法运行过程中需要的辅助空间。 • 对解决同一个问题的不同算法,前两个部分所占存储空间差别不会很大,所以在讨论算法的空间复杂度时,只考虑算法运行过程中需要的辅助空间,它也是问题规模n的函数,渐近空间复杂度也简称为空间复杂度。 • 常见的空间复杂度有:常数级O(1)、对数级O(log2n)、线性级O(n)。

  24. 1.4 学习数据结构的意义和目的

More Related