0
点赞
收藏
分享

微信扫一扫

第一章:数据结构的基本概念


抽象数据类型

抽象数据类型(Abstract Data Type,ADT)是将数据对象、数据对象之间的关系和数据对象的基本操作封装在一起的一种表达方式,它和工程中的应用是一致的。在工程项目中,开始编程之前,首先列出程序需要完成的功能任务,先不用管具体怎么实现,实现细节在项目后期完成,一开始只是抽象出有哪些基本操作。把这些操作项封装为抽象数据类型,等待后面具体实现这些操作。而其他对象如果想调用这些操作,只需要按照规定好的参数接口调用,并不需要知道具体是怎么实现的,从而实现了数据封装和信息隐藏。在C++中可以用类的声明表示抽象数据类型,用类的实现来实现抽象数据类型的具体操作。

抽象数据类型可以用以下的三元组来表示。

第一章:数据结构的基本概念_数据

ADT 抽象数据类型名{
        数据对象:<数据对象的定义>
        数据关系:<数据关系的定义>
        基本操作:<基本操作的定义>
 } ADT抽象数据类型名

(1)为什么要使用抽象数据类型?
抽象数据类型的主要作用是数据封装和信息隐藏,让实现与使用相分离。数据及其相关操作的结合称为数据封装。对象可以对其他对象隐藏某些操作细节,从而使这些操作不会受到其他对象的影响,这就是信息隐藏。抽象数据类型独立于运算的具体实现,使用户程序只能通过抽象数据类型定义的某些操作来访问其中的数据,实现了信息隐藏。
(2)为什么很多书中没有使用抽象数据类型?
既然抽象数据类型符合工程化需要,可以实现数据封装和信息隐藏,为什么很多数据结构书中的程序并没有使用抽象数据类型呢?因为很多人觉得数据结构难以理解,学习起来非常吃力,因此仅仅将数据结构的基本操作作为重点,把每一个基本操作讲解清楚,使读者学会和掌握数据结构的基本操作,便完成了数据结构书的基本任务。在实际工程中,需要根据实际情况融会贯通,灵活运用,这是后续话题。目前要掌握的就是各种数据结构的基本操作,本书也将基本操作作为重点讲述,并结合实例讲解数据结构的应用。
数据结构和算法相辅相成,密不可分,在学习数据结构之前,首先要了解什么是算法、好算法的衡量标准,以及算法复杂度的计算方法。


1.1 定义

  • 在任何问题中,数据元素都不是孤立存在的,而是在它们之间存在着某种关系,这种数据元素相互之间的关系称为结构(Structure)。数据结构是相互之间存在一种或多种特定关系的数据元素的集合。数据结构包括三方面的内容:逻辑结构、存储结构和数据的运算。数据的逻辑结构和存储结构是密不可分的两个方面,一个算法的设计取决于所选定的逻辑结构,而算法的实现依赖于所采用的存储结构。

1.2 逻辑结构

  • 逻辑结构是指数据元素之间的逻辑关系,即从逻辑关系上描述数据。它与数据的存储无关,是独立于计算机的
  • 数据的逻辑结构分为线性结构和非线性结构

第一章:数据结构的基本概念_时间复杂度_02

  • 集合 结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系。 类似于数学上的集合
  • 线性结构 结构中的数据元素之间只存在\_一对一\_的关系。比如排队
  • 树形结构 结构中的数据元素之间存在\_一对多\_的关系。比如家族族谱
  • 图状结构或网状结构 结构中的数据元素之间存在\_多对多\_的关系。 比如地图

1.3 物理结构

  • 存储结构是指数据结构在计算机中的表示(又称映像),也称物理结构。它包括数据元素的表示和关系的表示。数据的存储结构是逻辑结构用计算机语言的实现,它依赖于计算机语言。数据的存储结构主要有:顺序存储、链式存储、索引存储和散列存储。
  • 顺序存储:存储的物理位置相邻。(p.s. 物理位置即信息在计算机中的位置。)
  • 链接存储:存储的物理位置未必相邻,通过记录相邻元素的物理位置来找到相邻元素。
  • 索引存储:类似于目录,以后可以联系操作系统的文件系统章节来理解。
  • 散列存储:通过关键字直接计算出元素的物理地址(以后详解)。

1.4 算法的五个特征

第一章:数据结构的基本概念_时间复杂度_03

  • 1,有穷性:有限步之后结束
  • 2,确定性:不存在二义性,即没有歧义
  • 3,可行性:比如受限于计算机的计算能力,有些算法虽然理论上可行,但实际上无法完成。
  • 4,输入:能被计算机处理的各种类型数据,如数字,音频,图像等等。
  • 5,输出:一至多个程序输出结果。

1.5 算法的复杂度


1.5.1 时间复杂度:

  • 它用来衡量算法随着问题规模增大,算法执行时间增长的快慢;
  • 是问题规模的函数:T(n)是时间规模函数 时间复杂度主要分析T(n)的数量级
  • T(n)=O(f(n)) f(n)是算法中基本运算的频度 一般我们考虑最坏情况下的时间复杂度

时间复杂度: 算法运行需要的时间,一般将算法基本运算的执行次数作为时间复杂度的度量标准。

//算法1-3
sum=0; //运行1次
total=0; //运行1次
for(i=1;i<=n;i++) //运行n+1次,最后依次判断条件不成立,结束
{
    sum=sum+i; //运行n次
    for(j=1;j<=n;j++) //运行n*(n+1)次
    total=total+i*j; //运行n*n次
}

常用的时间复杂度大小关系:


复杂度如何计算

第一章:数据结构的基本概念_抽象数据类型_29

  • 时间复杂度计算(单个循环体)
  • 直接关注循环体的执行次数,设为k
  • 时间复杂度计算(多个循环体)
  • 两个运算规则:乘法规则,加法规则。


1.5.2 空间复杂度:

  • 它用来衡量算法随着问题规模增大,算法所需空间的快慢;
  • 是问题规模的函数:S(n)=O(g(n)) ;算法所需空间的增长率和g(n)的增长率相同。
  • 复杂度计算为重点

空间复杂度:算法占用的空间大小。一般将算法的辅助空间作为衡量空间复杂度的标准。 空间复杂度的本意是指算法在运行过程中占用了多少存储空间,算法占用的存储空间 包括如下。 (1)输入/输出数据所占空间。 (2)算法本身所占空间。 (3)额外需要的辅助空间。 输入/输出数据占用的空间是必需的,算法本身占用的空间可以通过精简算法来缩减,但这个压缩的量是很小的,可以忽略不计。而在运行时使用的辅助变量所占用的空间,即辅助空间是衡量空间复杂度的关键因素。

举报

相关推荐

0 条评论