收藏 分享(赏)

高艳霞数据结构第01讲.ppt

上传人:fmgc7290 文档编号:8435529 上传时间:2019-06-27 格式:PPT 页数:95 大小:837KB
下载 相关 举报
高艳霞数据结构第01讲.ppt_第1页
第1页 / 共95页
高艳霞数据结构第01讲.ppt_第2页
第2页 / 共95页
高艳霞数据结构第01讲.ppt_第3页
第3页 / 共95页
高艳霞数据结构第01讲.ppt_第4页
第4页 / 共95页
高艳霞数据结构第01讲.ppt_第5页
第5页 / 共95页
点击查看更多>>
资源描述

1、授课老师:高艳霞,数 据 结 构,课前提示,1、上课前请将手机调成振动。 2、平时成绩包括实验报告、上课提问、到课率 3、通过以下方式可以联系我 Email:g_y_x_hn 手机:18797568772 高艳霞,C语言的学习内容,C语言,算法,数据结构,语句,基本类型 整型 实型 字符型,构造类型类型 数组 结构体 共用体 枚举 文件,指针类型,空类型,表达式 算术表达式 关系表达式 逻辑表达式,算符,C语句 顺序 条件(选择)if()if()else switch() 循环while()do while()for()if() goto,函 数,相关课程的学习,加强C语言 面向对象程序设计

2、Visual C Java语言,学习方向,语言(C、Java) 驱动程序设计(与通讯有关的硬件) 操作系统(Window、LUnix、Unix) 数据库 与网络有关的编程(包括通信、安全等) 与自身专业结合的边缘学科,数据结构课程体系的学习,程序设计语言 数据结构 算法设计与分析 算法复杂性,算法体系的学习,确定性算法:经典的算法 不确定性算法:人工神经网络、混沌、遗传算法、进化规划、模拟退火、禁忌搜索、蚁群算法及其混合优化策略等,通过模拟或揭示某些自然现象或过程而得到发展,其思想和内容涉及数学、物理学、生物进化、人工智能、神经科学和统计力学等方面。,数据结构所要研究的问题,计算机是一门研究用

3、计算机进行信息表示和处理的科学。这里面涉及到两个问题:信息的表示信息的处理而信息的表示和组织又直接关系到处理信息的程序的效率。随着计算机的普及,信息量的增加,信息范围的拓宽,使许多系统程序和应用程序的规模很大,结构又相当复杂。因此,为了编写出一个“好”的程序,必须分析待处理的对象的特征及各对象之间存在的关系,这就是数据结构这门课所要研究的问题。,C语言与数据结构间的关系,数据结构+算法,C语言,C源程序,给定问题,数学模型,数据结构的基本概念 数据类型和抽象数据类型 C语言的数据类型 用C语言描述算法的注意事项 算法设计目标和算法分析(效率度量),要点:,什么是数据结构,计算机的程序是对信息进

4、行加工处理。信息并不是无组织的,信息(数据)之间往往具有重要的结构关系,这就是数据结构的内容。什么是数据结构呢?先看以下几个例子。,例1 电话号码查询系统,设有一个电话号码薄,它记录了N个人的名字和其相应的电话号码,假定按如下形式安排:(a1,b1)(a2,b2)(an,bn) 其中ai,bi(i=1,2n) 分别表示某人的名字和对应的电话号码。要求设计一个算法,当给定任何一个人的名字时,该算法能够打印出此人的电话号码,如果该电话簿中根本就没有这个人,则该算法也能够报告没有这个人的标志。,说明,算法的设计,依赖于计算机如何存储人的名字和对应的电话号码,或者说依赖于名字和其电话号码的结构。数据的

5、结构,直接影响算法的选择和效率。上述的问题是一种数据结构问题。可将名字和对应的电话号码设计成:二维数组、表结构、向量。假定名字和其电话号码逻辑上已安排成N元向量的形式,它的每个元素是一个数对(ai,bi), 1in 数据结构还要提供每种结构类型所定义的各种运算的算法。,例图书馆的书目检索系统自动化问题,按图书名称分类,按作者分类,按图书类型分类,说明,在这类管理的数学模型中,计算机处理的对象之间通常存在着的是一种最简单的线性关系,这类数学模型称为线性的数据结构。,例 人机对弈问题,问题:假设井字棋由两人对弈,棋盘为33的方格。当一方三个棋子占同一行、或同一列、或同对角线便为取胜方。对弈问题中计

6、算机操作的对象是对弈过程中可能出现的棋盘状态,称为格局。格局之间的关系是比赛规则决定的。如:,说明,通常这种关系不是线性的,即从一个棋盘格局可以派生出几个格局。这棵对奕树的“树根”是对弈开始时的棋盘格局,而所有的“叶子”就是可能出现的结局,“ 树”可以是某些非数值计算问题的数学模型,它也是一种数据结构。,例4 多叉路口交通灯的管理问题,在多叉路口设置几种颜色的交通灯才能既使车辆相互不碰撞,又能达到车辆的最大流通。假设有如下所示的五叉路口:,B,A,E,D,C,说明,两条道路之间有通路表示为:XY两条通路有矛盾以图中两个顶点连线表示,没有矛盾则可使用同一种信号灯。通常这类交通、道路问题的数学模型

7、是一种称谓“图”的数据结构。,设置交通灯问题等价为对图的顶点染色问题,要求对图上的每一顶点染一种颜色,并且要求有线相连的两个顶点不能具有相同颜色,而总的颜色种类应尽可能少。,例子总结,综上例子可见,描述这类非数值计算问题的数学模型不采用数学方程,而是诸如表、树和图之类的数据结构。因此简单来说,数据结构是一门研究非数值计算的程序设计问题中计算机操作对象以及它们之间的关系和操作等等的学科。数据结构是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。,数据结构课程的地位,数据结构是介于数学、计算机硬件和计算机软件三

8、者之间的一门核心课程。,数学 代数系统,存储 装置,硬件,计算机 系统设计,文件系统 数据组织,软件,计算机 程序设计,编码理论,算子关系,数据类型,数据表示法,数据运算,数据结构 数据存取 机器组织,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计以及实现编译程序、操作系统、数据库系统及其它系统程序和大型应用程序的重要基础。,数据结构的发展历史,1968 年由美国计算机协会(ACM)颁布计算机教学计划,将数据结构作为独立的门课程; 2. 同年世界著名的计算机科学家、美国的D.E.Knuth(唐欧克努特)教授发表了代表作计算机程序设计的技巧第一卷基本算法为数据结构奠定

9、了理论基础; 3. 60年代末至70年代初,随着软件系统的相对独立,结构程序设计成为程序设计方法学的主要内容,数据结构得到普遍的重视; 4. 从70年代中期到80年代初,数据结构得到全面的发展; 5. 在我国数据结构已经不仅仅是计算机专业的教学计划中的核心课程之一,而且是其它非计算机专业主要的选修课程之一。,数据:数据是信息的载体,是描述客观事物的数、字符、以及所有能输入到计算机中,被计算机程序识别和处理的符号的集合。目前数据的表示采用二进制方式描述。 数值性数据 非数值性数据 数据对象:数据的子集。具有相同性质的数据成员(数据元素)的集合。 整数数据对象 N = 0, 1, 2, 学生数据对

10、象:初等项(不可分割)、组合项(可再划分),数据结构的基本概念,数据元素:是数据的基本单位,有时一个数据元素由数据项组成(具有独立含义的最小标识单位) 数据项:如学生学籍管理数据库中的每条记录均由若干字段组成,各字段称为数据项。 数据类型:具有相同性质的计算机数据集合及在这个集合上的一组操作。,数据结构的基本概念(续),数据结构的基本概念(续),逻辑关系:能被计算机加工处理的任何数据的集合,其数据元素之间均有相互的某种关系。逻辑关系需在数据存储与处理时反映出来,逻辑关系的种类有: 一个班级学生的名单,是一个接一个排列的,它们之间的逻辑关系是线性的; 家庭之间的辈分关系(家庭可看成亲属集合,每个

11、亲属可看作一个数据元素), 或者 DOS 中的文件关系,它们之间的逻辑关系是树型结构来表示; 一个工程项目和其子工程间的关系、城市交通道路之间的关系、各城市之间的通信线路关系等均可用图结构来表示;,逻辑结构的分类,“学生”表格,线性结构,“课程”表格,线性结构中各数据成员之间的线性关系:有直接前驱和直接后继(除最前、最后一个元素),例:电话号码查询问题,线性结构,方法1:顺序存储,顺序查找,方法2:有序顺序存储,二分查找,方法3:部分有序,建立索引表,非线性结构中各数据成员之间没有线性关系:前驱和后继可能多于一个,选课单包含如下信息 学 号 课程编号 成 绩 学生选课系统中实体构成的网状关系,

12、非线性结构,UNIX文件系统的系统结构图,树形结构,树 二叉树 二叉搜索树,堆结构,“最大”堆 “最小”堆,图结构 网络结构,例:田径赛的时间安排问题,跳高,跳远,标枪,铅球,200M,100M,1、任一选手所选中的项目中应该两两有边相连; 2、任一两个有边相连的顶点颜色(时间)不能相同。,数据结构的基本概念(续),存储结构或物理结构:当存储这些具有某种逻辑结构的数据时,必须在内存存储方式上显现出来,如线性结构就可以在一个连续的存储空间,按地址顺序依次存入这些数据(或数据结构在计算机中的表示)。,存储结构分为两种: 顺序存储结构:借助元素在存储器中的相对位置来表示 数据元素间的逻辑关系。 即逻

13、辑上相邻,物理上也相邻. 链式存储结构:借助指示元素存储地址的指针表示数据元素间的逻辑关系。 即逻辑上相邻,物理上不一定相邻.,理解逻辑结构和物理结构,逻辑结构:从解决问题的需要出发,为实现必要的功能所建立的数据结构,它属于用户的视图,是面向对象的。 物理结构:指数据该如何在计算机中存放,是数据逻辑结构的物理存储方式,是属于具体实现的视图,是面向计算机的。 关系:物理结构是逻辑数据的存储映象,数据的逻辑结构与存储结构密切相关:算法设计 逻辑结构算法实现 存储结构,数据结构的基本概念(续),运算:具有某种逻辑结构的数据集合,可对其进行各种操作和加工处理,如进行检索、插入、删除、排序等,对数据的各

14、种操作称为逻辑结构的运算集合。数据的运算是数据结构的重要方面,任何一种数据结构都对应着一定的运算或算法。 结构:元素之间存在的相互关系。,数据结构的基本概念(续),数据结构的形式定义:由某一数据对象及该对象中所有数据成员之间的关系组成。记为:Data_Structure = D, R其中,D是某一数据对象,R是该对象中所有数据成员之间的关系的有限集合。数据结构的概念包括三个方面的内容:数据之间的逻辑关系、数据在计算机中的存储方式以及在这些数据上定义的运算集合。,数据结构的基本概念(续),数据类型:数据的取值范围及其操作的总称。 数据类型可分为:原子类型:原子类型的值不可分解;结构类型:一种数据

15、结构和定义在其上的一组操作组成。 C语言中的数据类型基本数据类型、指针类型、数组类型、结构体类型、公用体类型、枚举类型,抽象数据类型(ADT):指一个数学模型以及定义在该模型上的一组操作。 抽象数据类型的定义取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。,数据结构的基本概念(续),抽象数据类型的定义: ADT:抽象数据类型名 数据对象:数据对象的定义 数据关系:逻辑关系的定义 基本操作:基本操作的定义,基本操作的定义: 操作名(参数表) 操作结果:操作结果描述,采用介于伪码和C语言之间的类C语言作为描述工具,简要说明如下。 预定义常量和类型格式如表1.1所示。表1.1 预定义常

16、量和类型数据结构的表示(存储结构)用类型定义(Typedef)描述。数据元素类型约定为Elem Type,由用户在使用该数据类型时自行定义。,基本操作的算法都用以下形式的函数描述: 函数类型 函数名(函数参数表) 语句序列 除了函数的参数需要说明类型外,算法中使用的辅助变量可以不作变量说明,必要时,对其作用给予注释。一般而言,a,b,c,d,e等用做数据元素名,i,k,l,m,n等用做整型变量名,p,q等用做指针变量名。当函数返回值为函数结果状态代码时,函数定义为Status类型。为了便于算法描述,除了值调用方式外,增添了C语言的引用调用的参数传递方式。在形参表中,以&打头的参数即为引用参数。

17、,赋值语句格式如表1.2所示。 表1.2 赋值语句格式表,选择语句格式如表1.3所示。 表1.3 选择语句格式表,循环语句格式如表1.4所示。 表1.4 循环语句格式表,结束语句格式如表1.5所示。 表1.5 结束语句格式表输入和输出语句格式如表1.6所示。 表1.6 输入和输出语句格式表,通常省略格式串。 注释。 单行注释:/文字序列。 基本函数格式如表1.7所示。 表1.7 基本函数格式表,逻辑运算约定格式如表1.8所示。 表1.8 逻辑运算约定格式表,本课程讨论,在解决问题时可能遇到的典型的逻辑结构(数据结构) 逻辑结构的存储映象(存储实现) 数据结构的相关操作及其实现。,算法,定义:一

18、个有穷的指令集,这些指令为解决某一特定任务规定了一个运算序列 特性: 输入 有0个或多个输入 输出 有一个或多个输出(处理结果) 确定性 每步定义都是确切、无歧义的 有穷性 算法应在执行有穷步后结束 可行性 算法中描述的操作都可通过已经实现的基本运算执行有限次来实现 算法的描述:c+,c,PASCAL等语言,设计算法的基本方法:把一个具体问题转变成一个算法 事例学习:选择排序问题 明确问题:非递减排序 解决方案:逐个选择最小数据 算法框架: for ( int i=0; in-2; i+ ) /n-1趟 从ai检查到an-1; 若最小的整数在ak, 交换ai与ak; 细化程序:程序 Selec

19、tSort,算法设计:自顶向下,逐步求精,1、正确性:在给定有效的输入数据后,算法经过有穷时间的计算能给出正确的答案。 程序不含语法错误 程序对于几组输入数据能够得出满足规格说明要求的结果 程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果 程序对于一切合法的输入数据都能产生满足规格说明要求的结果,分析评价算法时应考虑的因素,(2)可读性(Readability) 算法首先是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对算法的理解;晦涩难懂的程序易于隐藏较多错误,难以调试和修改。 (3)健壮性(Robustness) 当输入数据非法时,算法也能适当地

20、做出反应或进行处理,而不会产生莫名其妙的输出结果。 (4)效率与低存储量需求 通俗地说,效率指的是算法执行时间。对于同一个问题,如果有多个算法可以解决,执行时间短的算法效率高。存储量的需求是指算法执行过程中所需要的最大存储空间。,算法描述 算法可以使用各种不同的方法来描述。最简单的方法是使用自然语言。用自然语言来描述算法的优点是简单且便于人们对算法的阅读,缺点是不够严谨。通常,可以采用下列四种方法描述一个算法。 流程图算法描述。这种描述方法直观、易懂,但用来描述比较复杂的算法,就显得不够方便,也不够清晰简洁。 非形式算法描述。用中文语言,同时还使用一些程序设计语言中的语句来描述算法,这称为非形

21、式算法描述。这种方法比较自然、方便表达,但经常会不够准确,容易产生二义性。 类语言算法描述。类语言算法称为伪语言算法。这种算法不能直接在,计算机上运行,但专业设计人员经常使用类C语言、类Java语言等来描述算法,它容易编写、阅读和统一格式,也比较容易转换为高级语言程序,便于算法实现。 高级语言编写的程序或函数。这是可以在计算机上运行并获得结果的算法,使给定问题能在有限时间内被求解,但要求符合高级语言的规则,实际上就是程序。 使用程序流程图和非形式算法描述的特点是描述过程简洁、明了。用以上两种方法描述的算法不能够直接在计算机上执行,若要将它转换成可执行的程序,还存在一个编程的问题。可以直接使用某

22、种程序设计语言来描述算法,但直接使用程序设计语言并不容易,而且不太直观,常常需要借助注释才能使人看明白。,为了解决理解与执行这两者之间的矛盾,人们常常使用一种称为伪码语言的描述方法来进行算法描述。伪码语言介于高级程序设计语言和自然语言之间,它忽略高级程序设计语言中一些严格的语法规则与描述细节,因此,它比程序设计语言更容易描述和被人理解,而比自然语言更接近程序设计语言。它虽然不能直接执行,但很容易被转换成高级语言。 高级语言最大的特点是能直接在计算机上运行,让人们可以直观地看到算法运行的结果。下面通过实际示例来看一下不同的算法描述的方法。在求两个整数m,n(mn)的最大公因子中,可以用如图1.6

23、所示流程图和语言来描述。,图1.6 流程图描述法 (1)流程图描述 在学习程序设计语言的时候,曾学习过流程图的设计方法,针对此问题,可以根据题意,给出如图1.6所示的流程图。它通过比较直观的方法给,出了解决问题的流程。 (2)非形式语言描述 求余数。以n除m,并令r为余数(0rn)。 判断余数是否为零。若r0,则结束算法,n就是最大公因子。 若r0,则mn,nr,转。 (3)类语言描述 int max_common_factor(int m,int n) int r; rm%n; while(r!0),mn;nr;rm%n; return n; (4)程序描述 #include #includ

24、e void main() int m,n,r; printf(“please input m,n:“); scanf(“%d%d“, ,本教材采用类C语言来描述算法,主要目的是介绍算法的思路和实现过程,但也尽可能地将算法对应的C语言函数或程序提供给大家,以便更好地理解算法和实现算法。 采用C语言描述算法的原因在于C语言的数据类型丰富,语句精炼、灵活且执行效率较高,表达能力强,可移植性好,而且C语言的使用范围广,读者通过阅读算法的描述,不仅可以掌握数据结构的知识,也可以提高程序设计的能力,为从事C语言应用软件的开发做好准备。 为了便于算法的描述,在函数参数表中,除了值调用方式外,增添了C语言的

25、引用调用的参数传递方式。在形参表中,以&打头的参数即为,引用参数。引用参数能被函数本身更新参数值,可以此作为输出数据的管道。 下面对C语言常用的数据类型和内存动态分配函数作一个简要概述。 (1)基本数据类型 C语言有5种由计算机系统直接支持实现的基本数据类型:整型int、浮点型float、双精度型double、字符型char和无值型void。 char型存储空间为一个字节8位。 float,double,long double三种形式的存储空间分别为4字节、8字节、16字节,对应约6位、12位、24位有效数字。 int型的存储空间为2字节(16位),数值范围在3276832767。可以在int

26、前加short, long和unsigned三种限定词,以缩小或扩大int型整数的存,储空间和数值表示范围,unsigned int表示其变量只能取正整数。 void型用于确定函数无值返回。 (2)指针类型 指针是C语言最显著的特征,允许直接对存储变量的地址进行操作,指针即地址。存放地址的变量称为指针变量。例如,int*p定义了指针变量p,指示一个整数型的存储单元。指针类型有两个特殊的指针运算符:&和*,&p表示指针变量p所代表的内存地址,简称取地址,*p表示指针变量p所指内存单元的值,简称取内容。 指针变量为动态变量,在程序中需要此变量时,为此变量申请内存空间;在不需要时,将其释放,以便合理

27、地安排内存空间。这两种功能分别由标准函数malloc()和free()来实现。,例如,一个指针在定义之后和赋值之前,其值是未知的。如果在对其赋值之前就引用,这不仅可能破坏程序,甚至可能破坏计算机的操作系统,这是非常严重的错误!按照惯例,未用指针应当赋以值NULL,如pnull。 若函数采用指针作为形参,则参数传递采用地址传递的形式,即把实参的地址传给形参,这时若函数类形参的值改变,则实参中的值跟着变化。 (3)数组类型 数组是一个由若干同类型变量组成的集合,数组名标识了这一组数,数组元素的下标指示了数组元素在该数组中的顺序位置。在C语言中,数组下标的最小值即下界总是0。数组下标的最大值称为上界

28、,为数组定义值减去1。如定义int a100,则下界为0,上界为99。指针和数组是紧密相连的。一个数组名可以看成这组数的起始地址,数组名是一个指针常量,可以用指针,变量指向数组,如:int a100,*p;pa; 这里,p被置成数组a的第1个元素的地址,要访问a的第5个元素,既可以表示为a4,也可以表示为*(p4)。C语言提供了两种存取数组元素的方法:数组下标检索和指针运算。用指针表示数组也是很普遍的。 (4)字符串 C语言中没有单独的字符串类型,而是把字符串定义成字符数组。每个字符串由“0”表示其结束。一个字符串常量由一对双引号表示。当一个字符串常量被存入内存时,系统自动在其末尾添加“0”。

29、,(5)结构体类型 结构体由一组称为结构体成员的数据项组成,每个结构体成员都有它们的标识符。定义一个结构体类型变量分为两步:定义结构体类型和定义结构体变量。例如:struct student/*定义结构体类型*/long no;char name40;char sex2;int age;float score;,; struct student s1,s20,*sp;/*定义结构体类型变量*/ 或者在结构体类型定义后直接定义结构体变量,例如:struct student/*定义结构体类型及变量*/long no;char name40;char sex2;int age;float score

30、;s1,s20,*sp;,具有同样类型的结构变量可以互相赋值,如s1s1。对结构成员的访问可以使用圆点运算符(.)描述,如s1.name,s1.score等。 (6)共用体类型 共同体是把不同类型的各个成员项作为一个整体,它们在内存中共用一段存储区,但不同的成员项以不同的方式被解释。共同体类型的定义和操作方法与结构体类型变量相同。例如:union student/*定义共同体类型*/long stu_no;char stu_name20;,union student stu;/*定义共同体类型变量*/ 或者:union student/*定义共同体类型及变量*/long stu_no;char

31、 stu_name20;stu; 与结构体类型不同的是,在结构体中,每个成员有自己独立的存储位置,而共同体的所有成员共享同一位置开始的存储区。由此可知,一个共同体变量在每个时刻只能保存它的某一个成员的值。共同体变量的使用方式与结构体变量一样。,(7)枚举类型 枚举类型变量的取值只能是指定的若干个值之一。定义一个枚举类型变量分为两步:枚举类型定义和枚举类型变量定义。例如:enum color/*定义枚举类型*/red,green,blue,white,black,yellow;enum color c1,c2;/*定义枚举类型变量*/ 枚举变量c1和c2只能取枚举类型定义中的6个值之一。枚举类型

32、主要用于提高程序的可读性。,(8)类型定义 对各种基本数据类型,C语言都提供了类型名,如int,float,char等。定义新的数据类型是高级程序设计语言的一种重要机制。在写程序(算法)时,自己定义的数据类型被称为“用户定义类型”,与语言的内部基本数据类型在程序(算法)中同样使用。在C语言中,类型定义用关键字typedef引导。例如:typedef int INTEGER;typedef struct student/*定义结构体类型及变量*/long no;char name40;,char sex2;int age;float score;student; 这样,就可用INTEGER类型名

33、来代替int类型名,用student代替struct student结构体类型名。注意,这里的student是struct student结构体类型的一个新类型名,与前面定义的结构体类型变量不同。 这样的类型定义从C语言的角度看,都不是什么新类型,本身并不分配存储空间,而仅是为原有类型另外起了新名称。有时,定义新类型名是为了提高程序的可读性和清晰度。例如下面的定义:typedef double LENGTH;,typedef double AREA; 在一个算法中,长度与面积可能都用双精度数表示,但把一个表示长度的变量与表示面积的变量相加,大概不是一个合理的操作。定义这样的类型名可以帮助人们在

34、阅读算法时,看到这种内在的不一致问题。 (9)动态内存分配函数 所谓动态内存分配,是指在程序执行过程中,动态地分配或者回收存储空间的分配内存的方法。动态内存分配相对于静态内存分配的特点如下: 不需要预先分配存储空间; 分配的空间可以根据程序的需要扩大或缩小。 根据程序的需要实现动态分配存储空间,常用到以下几个函数。,动态存储分配函数malloc()。其原型为void*malloc(unsigned int size)。其作用是在内存的动态存储区中分配一个长度为size的连续空间。其参数是一个无符号整型数,说明存储空间的大小size,返回值是一个指向所分配的连续存储区起始地址的指针。必须注意的是

35、,当函数未能被成功地分配存储空间(如内存不足)时,就会返回一个NULL指针,所以在调用该函数时,应该检测返回值是否为NULL并执行相应的操作。 动态存储释放函数free()。由于内存区域总是有限的,不能不限制地分配下去,而且一个程序要尽量节省资源,所以,当所分配的内存区域不用时,就要释放它,以便其他变量或者程序使用。这时就要用到free函数。 其函数原型为void free(void*p),作用是释放指针p所指向的存储区。其参数p必须是先前调用malloc函数或calloc函数(另一个带计数和清零的动态分配存储区域的函数)时返回的指针。,分配调整函数realloc()。其原型为void*rea

36、lloc(void*p,unsigned int size),该函数用于更改前面已经做过的存储分配,有两个参数:其一,指针p指向过去分配的存储空间;其二,size表示当前希望分配的存储空间大小。如果新的要求不能满足,函数realloc返回一个空指针值,p所指存储空间原来的内容保持不变。如果新的分配要求能满足,函数realloc返回指向一个能存放大小为size的数据存储空间的指针值,并保证新存储空间的内容与原存储空间内容一致。,简单地讲,算法的时间复杂度是指算法的运行的时间消耗的大小,但这里的“运行”并不是指在具体机上的运行。一个算法在具体计算机上的运行速度,不仅取决于算法本身,而且与目标计算机

37、(运行算法的计算机)的速度有关。如果算法是用非目标指令(如汇编语言、高级语言等)描述的,则运行速度还与描述语言的编译器所生成的目标代码的质量(或解释器本身的质量)有关。 算法的时间复杂度指算法自身的抽象运行的时间消耗,与运行算法的目标计算机及描述算法的工具无关 。只与算法本身以及问题的规模有关。,算法的时间复杂性和空间复杂性,时间复杂度相关因素,算法的时间复杂度与下列因素有关: 问题性质:有的问题比较复杂,而有的比较简单; 问题规模:同一问题,同一算法,其处理的对象的规模不同,则耗时也不同; 算法性质:同一问题,不同的解决方法,效率也不同。一个算法的时间复杂度通常用函数描述(时间复杂度函数)。

38、时间复杂度函数通常可以描述为问题规模的函数。,例算法不同时间复杂度不同,计算三次多项式,直接计算方法,运算量(时间):6次乘法,3次加法,一种新方法,运算量(时间):3次乘法,3次加法.,问题的规模(n):或大小。如:矩阵的阶数、图的结点个数、被分类序列的正整数个数 时间复杂性:算法的所需的时间和问题规模的函数。记为 T(n)。当 n- 时的时间复杂 性,被称之为渐进时间复杂性。 空间复杂性:算法的所需的空间和问题规模的函数。记为 S(n)。当 n- 时的时间复杂 性,被称之为渐进空间复杂性。,1、假定每条语句的执行时间为单位时间。算法的时间复杂度是该算法中所有语句的执行频度之和。由算法执行的

39、基本运算次数来度量。,算法分析,define n 自然数 MATRIXMLT(float Ann,float Bnn,float Cnn) int i,j,k;for(i=0;in;i+) /n+1for(j=0;jn;j+) /n(n+1)Cij=0; /n*nfor( k=0;kn;k+) /n*n*(n+1)Cij=Aik*Bkj /n*n*n ,例:求两个方阵的乘积 CA*B,2、一般情况下,对步进循环语句只考虑循环体语句的执行次数,而忽略该语句中部长加一、终值判别、循环转移等成份。因此,当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度所决定的。,算法

40、分析(续),x=0;y=0; for (k=1;k=n;k+)x+; for (i=1;i=n;i+)for (j=1;j=n;j+) y+; /n*n,例,x=1; for (i=1;i=n;i+)for (j=1;j=i;j+)for (k=1;k=j;k+)x+;,例,3、选择执行的成分,如 if 语句的执行时间,决定于then 子句、else 子句耗时较多的部分 4、如果算法的执行时间是一个与问题规模n无关的常数,则算法的时间复杂度为常数阶,记作T(n)=O(1)。,例: temp = i; i = j; j = temp;,算法分析(续),例如: +x;s=0 for (a=1;a=

41、n;+a)+x;s+=x; for (b=1;b=n;+b) for (c=1;c=n;+c) +x;s+=x;,含基本操作“x加1”的语句频度分别为:1、n和n2,则对应的时间复杂度分别为:O(1)、O(n)和O(n2),分别称为常数阶、线性阶和平方阶。此外,还有对数阶和指数阶等。,算法分析(续),5、很多算法的时间复杂度不仅与问题的规模有关,而且还与它所处理的数据集的状态有关。通常是根据数据集中可能出现的最坏情况估计出算法的最坏时间复杂度。,算法分析(续),常数阶 对数阶 线性阶 线性对数阶 平方阶 立方阶 K次方阶 指数阶,常见的时间复杂度,算法的存储空间要求,算法的空间复杂度 S(n) = O(g(n)表示随着问题规模n的增长,算法运行所需存储量的增长率与g(n)的增长率相同,算法存储量包括,输入数据所占空间 程序本身所占空间 辅助变量所占空间,若输入数据所占空间只取决于问题本身和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间 若所需额外空间相对于输入数据量来说是常量,则称此算法为原地工作 若所需存储量依赖于特定的输入,则通常按最坏情况考虑, 本章小结,数据、数据结构等基本概念 数据结构的三个方面的内容 线性和非线性结构的逻辑特征 数据存储的四种基本方法 算法、算法的时间复杂度及其分析的简易方法,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报