数据结构与算法分析~笔记1绪论

为了编写出一个“好”的程序,必须分析待处理数据的特征、数据间的相互关系以及数据在计算机内的存储表示,并利用这些特性和关系设计出相应的算法与程序,这就是数据结构所要研究的问题。

1.1 数据结构的概念

一般来说,计算机解决一个具体问题时,大致需要经过下列步骤:一、建立数学模型,二、构造求解方法,三、选择存储结构,四、编写程序,五、测试。
计算机解决问题的过程:
在这里插入图片描述
算法是解决特定问题的步骤和方法,数据结构是问题的数学模型,程序则是计算机处理问题编制的一组指令集。数据结构是研究程序设计中计算机操作的对象以及它们之间的关系和运算的一门学科。
概括地说,数据结构是研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的一门学科。
数据结构相关概念及术语
数据(Data)是信息的载体,在计算机科学中是指能输入到计算机中并能被计算机程序识别和处理的符号集合,它是计算机操作对象的总称,是计算机处理的信息的某种特定的符号表示形式。数据可以分为两大类:一类是整数、实数等数值型数据;另一类是图形、图像、声音、文字等非数值型数据。
数据元素(Data Element)是数据的基本单位,在计算机程序中,通常作为一个整体进行考虑和处理,是数据结构中讨论的基本单位。数据元素具有广泛的含义,一般来说,能独立、完整地描述问题的一切实体都是数据元素。
数据项(Data Item)是构成数据元素的不可分割的最小单位,一个数据元素可以由若干的数据项组成。
数据对象(Data Object)是具有相同性质的数据元素的集合,是数据的一个子集。
数据结构(Data Structure)是指相互之间存在一种或多种特定关系的数据元素的集合。数据元素之间存在着某种关系,这种数据元素之间的关系称为结构(Structure)。根据数据元素之间关系的不同特性,数据结构通常分为以下4类基本结构。
(1)集合:数据元素之间就是“属于同一个集合”,除此之外没有任何关系。
(2)线性结构:数据元素之间存在着一对一的线性关系。
(3)树形结构:数据元素之间存在着一对多的层次关系。
(4)图状结构或网状结构:数据元素之间存在着多对多的任意关系。
逻辑结构(Logical Structure)是指数据元素之间逻辑关系的整体。所谓的逻辑关系是指数据元素之间的关联方式或邻接关系。
物理结构(Structure)是指数据结构在计算机中的表示(即映像),又称存储结构(Storage Structure)。它研究的是数据结构在计算机中的表示方法,包括数据结构中数据元素的表示以及数据元素之间关系的表示。
(Bit)是指在计算机中表示信息的最小单位,是二进制数的一位。在计算机中,可以用由若干位组合起来形成的位串来表示任何一个数据元素。这个位串为元素(Element)或结点(Node)。当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域(Data Field)。因此,元素或结点可看成是数据元素在计算机中的映像。

通常数据元素在计算机中有两种不同的表示方法:顺序映像(Sequential Mapping)和非顺序映像(Non-Sequential Mapping),并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
顺序映像的特点是借助数据元素在存储器中的相对位置来表示数据元素之间的逻辑关系,所以顺序存储就是把逻辑上相邻的数据元素存储在物理位置相邻的存储单元中,由此得到的存储表示称为顺序存储结构。
非顺序映像的特点是借助指示数据元素存储地址的指针(Pointer)表示数据元素之间的逻辑关系,所以链式存储就是用一组任意的存储单元存储数据元素,不要求其物理位置相邻,数据元素之间的逻辑关系通过附设的指针字段来表示,由此得到的存储表示称为链式存储结构。

1.2 数据类型和抽象数据类型

类型(Type)是指一组值的集合。例如,布尔(Boolean)类型由true和false这两个值组成。
数据类型(Data Type)则是一组值的集合以及定义在这个值集上的一组操作的总称。
按“值”的不同特征,高级程序语言中的数据类型可分为两类:非结构的原子类型和结构类型。原子类型的值是不可分解的。结构类型的值则是由若干成分按某种结构组成的,因此是可以分解的,并且它的组成部分可以是非结构的原子类型,也可以是结构类型。
在某种意义上,数据结构可以看成是“一组具有相同结构的值”,则结构类型可以看成由一种数据结构和定义在其上的一组操作组成。
抽象数据类型(Abstract Data Type,简称ADT)则是指一个数学模型(数据结构)以及定义在该模型上的一组操作。所谓抽象(Abstract)就是抽出问题的本质特征而忽略非本质的细节,是对具体事务的一个概括。抽象数据类型的定义仅仅取决于它的一组逻辑特性,而与计算机内部如何表示和实现无关。
抽象数据类型和数据类型实质上是一样的。
另一方面,抽象数据类型的范畴更广,它不再局限于前述各种处理器中已定义并实现的数据类型,即固有数据类型(如整型、字符型、浮点型等数据类型),还包括用户在设计软件系统时自己定义的数据类型。
抽象数据类型有两个重要特征:数据抽象和数据封装。数据抽象(Data Abstraction)是指用ADT描述程序处理的实体时,强调其本质的特征、所能完成的功能以及它和外部用户的接口(即外界使用它的方法)。数据封装(Data Encapsulation)是将实体的外部特性和其内部实现细节分离,并且对外部用户隐藏其内部实现细节。所以,抽象数据类型设计时,把类型的定义与实现分离开来。数据结构包括数据元素以及元素之间的关系,因此抽象数据类型一般由数据元素、关系及操作3种要素来定义。

1.3 算法和算法分析

算法(Algorithm)是对特定问题求解步骤的一种描述,是指令的有限序列,其中每一条指令表示一个或多个操作。
一个算法应具有以下5个重要特性:有穷性,确定性、可行性、有输入、有输出。
算法的含义与程序十分相似。算法代表了对问题的解,而程序(Program)则是算法在计算机上使用某种程序设计语言的具体实现。两者之间又有区别,算法必须满足有穷性,程序则可以不满足。例如,操作系统一旦启动后,只要整个系统不遭到破坏,它将永远不会停止,即使当前没有作业要处理,它仍然会处于动态等待作业中,不满足有穷性,所以操作系统是一个在无限循环中执行的程序,而不是算法。另外,程序中的指令必须是机器可执行的,而算法中的指令没有此限制。
算法设计的要求:同一个问题可能有多种求解的算法,如何设计一个好的算法,主要有以下几个要求。
(1)正确性(Correctness):要求算法满足当前具体问题的需求,即算法的执行结果能够满足预定的功能和性能要求。要求一个算法满足正确性一般分为4个层次:
① 算法没有语法错误;
② 算法对于随意的几组输入数据能够得出符合要求的结果;
③ 算法对于精心设计的典型、苛刻的几组合法输入能够得出符合要求的结果;
④ 算法对于所有合法的输入数据都能得出符合要求的结果。
(2)可读性(Readability):算法应当是可读的,这是理解、调试和修改算法的需要。
(3)健壮性(Robustness):算法应具有容错性或例外处理能力。即当输入数据非法或运行环境改变时,算法能恰当地做出反应或进行处理,而不会产生错误动作或陷入瘫痪。
(4)效率与存储量需求:效率指的是算法执行所需的时间,存储量需求指算法执行过程中所需要的最大存储空间。
算法的性能分析与度量:评价一个算法的优劣一般可以从算法的运行时所消耗时间和所占用的存储空间来度量,即算法的时间复杂度和空间复杂度。
要对一个算法做出全面的分析通常有以下两种方法。
(1)事后统计的方法:查阅相关资料统计算法的执行时间和实际占用空间,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此,人们常采用另一种事前分析估算方法。
(2)事前分析估算的方法:当一个算法转换成高级程序语言编写的程序在计算机上运行时,它所消耗的时间取决于下列因素:① 算法选用的策略;② 问题的规模:例如求200以内还是2000以内的素数;③ 编写程序的语言:对于同一个算法,实现语言的级别越高,执行效率就越低;④ 编译程序所产生的机器代码的质量;⑤ 机器执行指令的速度。
事先分析估算的方法是通过分析问题规模,求出该算法的一个时间界限函数,以此来衡量算法的时间复杂度。
一个程序的时间复杂度(Time Complexity)是指程序运行从开始到结束所需要的时间。
算法是由控制结构和原操作构成的,其执行时间取决于两者的综合效果。其中,控制结构包括顺序结构、分支结构和循环结构3种;原操作则是指对固有数据类型的操作。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作:T(n)=O(f(n))。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度(Asymptotic Time Complexity),简称时间复杂度。
算法的时间复杂度取决于最内层循环包含的基本操作语句的频度,通常以最坏情况下的时间复杂度作为该算法的时间复杂度。
一个程序的空间复杂度(Space Complexity)是指程序运行从开始到结束所需的存储空间的度量,记作S(n)=O(f(n))其中n为问题的规模,f(n)为所需存储空间关于问题规模n的函数表达式。
一个上机执行的程序运行所需的存储空间包括以下两部分。
(1)固定部分:这部分存储空间用来存储程序代码、常量、简单变量、定长成分的结构变量。
(2)可变部分:这部分空间大小与算法在某次执行中处理的特定数据的大小和规模有关。若额外空间相对于输入数据量来说是常数,则称此算法为原地工作。算法的空间复杂度主要考虑算法在运行过程中临时占用的存储空间的大小,一个算法的临时存储空间是指函数体内新开辟的空间,不包括参数占用的空间。
如果所占用空间依赖于特定的输入,则除特别指明外,均按最坏情况来分析。

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值