第一章:绪论
1.1从问题到程序\r1.2有关概念和术语\r1.3算法及算法分析\r1.4关于数据结构的学习
计算机解决具体问题方法步骤:\r①从具体问题抽象出一个适当的数学模型\r②设计一个解此数学模型的算法\r③用程序语言编写程序\r什么是数据结构呢?\r例1、图书馆信息检索系统自动化问题\r例2、计算机和人对弈问题\r例3、教学计划编排问题\r数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作等的学科。
1.1从问题到程序
1.2有关概念和术语
1、数据(Data)\r数据是描述客观事物、表达信息的载体,能输入计算机并被识别、存储和处理。\r2、数据元素(Data Element)\r数据元素是组成数据的基本单位, 是数据集合的个体,由若干个数据项组成。\r3、数据项(Data Item)\r数据项(Data Item)是不可分割的并且具有独立含义的最小数据单位。\r4、数据对象(Data Object)\r数据对象是性质相同的数据元素的集合,是数据的一个子集。
1.2有关概念和术语
4、数据结构(Data Structure)\r数据结构是指相互之间存在一种或多种特定关系的数据元素集合。\r数据结构包括如下几个方面:\r(1)数据元素之间的逻辑关系,即数据的逻辑结构。\r(2)数据元素及其关系在计算机存储器中的存储方式,即数据的存储结构,也称为数据的物理结构。\r(3)施加在该数据上的操作,即数据的运算。 \r数据的逻辑结构:\r四类基本数据结构:集合结构、线性结构、树型结构、图状结构\r(1)集合结构:结构中的数据元素之间除了同属于一个集合的关系外,无任何其它关系。一种松散的结构,本书不做专门讨论。
(2)线性结构:结构中的数据元素之间存在着一对一的线性关系。 \r结点之间关系:一对一。\r特点:开始结点和终端结点都是惟一的,除了开始结点和终端结点以外,其余结点都有且仅有一个前驱结点,有且仅有一个后继结点。顺序表就是典型的线性结构。\r\r\r(3)树形结构:结构中的数据元素之间存在着一对多的层次关系。 \r结点之间关系:一对多。\r特点:开始结点惟一,终端结点不惟一。除终端结点\r以外,每个结点有一个或多个后续结点;除开始结点外,\r每个结点有且仅有一个前驱结点。\r(4)图形结构:结构中的数据元素之间存在着多对多的任意关系。 \r结点之间关系:多对多。\r特点:没有开始结点和终端结点,所有结点都可能有多个前驱结点\r和多个后继结点。
1.2有关概念和术语
线性结构——线性表、栈、队、字\r 符串、数组、广义表\r非线性结构——树、 图
逻辑结构
1.2有关概念和术语
数据结构的形式定义:\r数据结构是一个二元组Data_Structure=(D, R),其中: D是数据元素的有限集,R是D上关系的有限集。\r例如,学生表中共有7个结点,依次用k1~k7表示,则对应的二元组表示为B=(K,R),其中:\rK={k1,k2,k3,k4,k5,k6,k7}\rR={r} \rr={
1.2有关概念和术语
又例如,有如下数据即一个矩阵:
对应的二元组表示为B=(K,R),其中:\rK={2,6,3,1,8,12,7,4,5,10,9,11}\rR={r1,r2} 其中,r1表示行关系,r2表示列关系\rr1={<2,6>,<6,3>,<3,1>,<8,12>,<12,7>,<7,4>,<5,10>,<10,9>,<9,11>}\rr2={<2,8>,<8,5>,<6,12>,<12,10>,<3,7>,<7,9>,<1,4>,<4,11>}
一个二维数组
1.2有关概念和术语
1.2有关概念和术语
数据的物理结构(存储结构):\r数据的逻辑结构在计算机中的存储表示(映象)。\r两种基本的存储结构:顺序存储结构、链式存储结构 \r5、数据类型(Data Type)\r数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。\r一般来说,高级语言中的数据类型可分为两类:\r非结构的原子类型:原子类型的值是不可分解的。\rC语言中的标准类型(整型、实型、字符型、枚举型)及指针和空类型。\r结构类型:结构类型的值是由若干成分按某种结构组成的,因此是可以分解的,并且它的成分可以是原子型或结构型。\rC语言中的数组、结构体、共用体。
C语言的数据类型:
1.2有关概念和术语
1.2有关概念和术语
6、抽象数据类型 (Abstract Data Type,ADT)\r抽象数据类型是指基于一类逻辑关系的数据类型以及定义在这个类型之上的一组操作。\r“抽象”的意义在于数学特性的抽象。\r一个ADT定义了一个数据对象,数据对象中各元素间的结构关系,以及一组处理数据的操作。\rADT 通常由用户定义且用以表示应用问题的数据模型,通常由基本的数据类型组成,并包括一组相关服务操作。\r抽象数据类型和数据类型实质上是一个概念。
在算法的五大特征中,最基本的是有限性、确定性和可行性。
确切的说,算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示计算机的一个或多个操作。\r1.3.1算法的特性\r(1)有限(穷)性:算法必须在执行有穷步之后结束,而每一步都必须在有穷时间内完成。\r(2)确定性:算法中每一步操作的含义都必须是确定的,不能有二义性。\r(3)可行性:一个算法必须是可行的,即算法中每一操作都能通过已知的一组基本操作来实现。\r(4)输入:一个算法可以有零个或多个输入。\r(5)输出:一个算法有一个或多个输出。
1.3算法及算法分析
考虑下列两段描述:\r(1)描述一\rvoid exam1() \r{ n=2;\r while (n%2==0) n=n 2; \r printf("%d\n",n);\r}\r(2)描述二\rvoid exam2()\r{ y=0;\r x=5/y;\r printf(“%d,%d\n”,x,y);\r}\r这两段描述均不能满足算法的特征,试问它们违反了哪些特征?\r解:(1)算法是一个死循环,违反了算法的有穷性特征。\r (2)算法包含除零错误,违反了算法的可行性特征。
华中科大考研题
1.3算法及算法分析
一个好的算法一般应该具有的基本特征(算法设计的要求):\r(1)正确性(Correctness)\r正确性(Correctness)的几个层次\r所设计的程序没有语法错误;\r所设计的程序对于几组输入数据能够得出满足要求的结果; \r所设计的程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得到满足要求的结果。 \r程序对于一切合法的输入数据都能产生满足要求的结果。\r(2)可读性(Readability)\r可读性(Readability):可供理解的难易程度\r易读性(Legibility):便于阅读的难易程度\r(3)健壮性(Robustness)\r鲁棒性(Robustness) :指系统的健壮性。\r(4)高效性(Efficiency)\r高效率(Time efficiency)\r低耗(Space efficiency)
1.3算法及算法分析
1.3.2算法描述\r(1)用自然语言表示算法\r?自然语言简单但易于产生二义。\r(2)用流程图表示算法\r(3)用N-S图表示算法\r?直观但不擅长表达数据的组织结构。\r(4)用伪代码表示算法(类语言)\r?可襒掉语言中的细节,专注算法本身的描述。\r(5)用高级程序设计语言表示算法\r?较为准确但又比较严谨但细节过多。 \r\rNiklaus E. Wirth给出的公式:算法 数据结构=程序
1.3算法及算法分析
1.3.3算法分析\r和算法执行时间相关的因素:\r1.算法选用的策略\r2.问题的规模\r3.编写程序的语言\r4.编译程序产生的机器代码的质量\r5.计算机执行指令的速度分析\r\r通常有两种衡量算法效率的方法:\r事后统计法:1.必须执行程序\r 2.其它因素掩盖算法本质\r事前分析估算法\r\r常用分析算法:时间复杂度和空间复杂度
1.3算法及算法分析
1、时间复杂度\r一个特定算法的基本运算次数T(n),只依赖于问题的规模(通常用整数量n表示),随问题规模n的增大,算法的执行时间的增长率和问题规模n的函数f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度,记作:T(n)=O(f(n))。\r一个算法的执行时间大致上等于其所有语句执行时间的总和。\r一个算法是由控制结构和原操作构成,则算法时间取决于两者的综合效果。\r算法执行时间大致为基本运算(一般是最深层循环内的语句)所需的时间与其运算次数(也称为频度)的乘积。\r语句频度是指该语句在一个算法中重复执行的次数。 \r原操作是指从算法中选取一种对所研究问题是基本运算的操作, 用随着问题规模增加的函数来表征, 以此作为时间量度。也就是说,一个算法的时间复杂度是指该算法的基本运算次数。
1.3算法及算法分析
多数情况下,求最深层循环内的简单语句(原操作)的重复执行的次数。\r当难以精确计算原操作的执行次数时,只需求出它关于n的增长率或阶即可。\r当循环次数未知(与输入数据有关),求最坏情况下的简单语句(原操作)的重复执行的次数。\r确定时间复杂度时,一般只求出T(n)的最高阶,忽略其低阶项和常系数,本质上讲,是一种最高数量级的比较。
1.3算法及算法分析
一个没有循环的算法的基本运算次数与问题规模n无关,记作O(1),也称作常数阶。\r一个只有一重循环的算法的基本运算次数与问题规模n的增长呈线性增大关系,记作O(n),也称线性阶。\r常量阶:O(1)\r线性阶:O(n)\r平方阶:O(n2)\r立方阶:O(n3)\r指数阶:O(2n)\r对数阶:O(log2n)\r二维阶:O(nlog2n)\r各种不同数量级对应的值存在着如下关系:\rO(1) 1.3算法及算法分析 常用的时间复杂度 1.3算法及算法分析 常用的时间复杂度频率表\r\r\r\r\r\r\r一般情况下,随n的增大,T(n)的增长较慢的算法为最优的算法。应尽可能选择使用多项式阶O(nk)的算法,而避免使用指数阶的算法。 1.3算法及算法分析 例:求两个n阶方阵的相加C=A B的算法如下,分析其时间复杂度。\r #define MAX 20 /*定义最大的方阶*/\r void matrixadd(int n,int A[MAX][MAX],\r int B[MAX][MAX],int C[MAX][MAX])\r { int i,j;\r for (i=0;i 1.3算法及算法分析 例:分析以下算法的时间复杂度。\rint fun(int n)\r{\r int i,j,k,s; \r s=0;\r for(i=0;i<=n;i ) \r for(j=0;j<=i;j ) \r for(k=0;k<=j;k ) \r s ; /*基本语句或基本操作*/\r return(s);\r}\r解:该算法的基本操作是语句s ,其频度:T(n)= \r \r =O(n3)\r则该算法的时间复杂度为O(n3)。 1.3算法及算法分析 例:两个n×n阶矩阵相乘。\rfor(i=0;i 1.3算法及算法分析 例如:下列程序段\rfor(i=1;i 1.3算法及算法分析 例:分析以下算法的时间复杂度。\rvoid func(int n)\r{\r int i=0,s=0;\r while (s 基本语句 1.3算法及算法分析 本章介绍了数据结构的基本概念,主要学习要点如下: \r1、数据、数据元素、数据结构、数据类型等基本概念和术语;\r2、数据结构的定义,数据结构包含的逻辑结构、存储结构和运算三方面的相互关系;\r3、数据的逻辑结构和存储结构及其相互关系;\r4、逻辑结构的四种基本类型和存储结构两种基本机内表示方法;\r5、算法的定义、特性及书写算法的基本要求,注意算法与程序的区别;\r6、算法的性能分析的简单分析方法,语句频度的计算和估算算法时间复杂度的方法。 本章小结