数据结构 绪论

文章目录

1 什么是数据结构

1.1 数据结构

数据结构是一本研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。

2 基本概念和术语

2.1 数据(data)

数据(data)是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。

数据就是能够被计算机识别、存储和加工处理的信息的载体。

它是计算机程序加工的“原料”。

2.2 数据元素(data element)

数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

2.2.1 数据项(data item)

有时,一个数据元素可由若干个数据项(data item)组成。

数据项是数据的不可分割的最小单元。

2.3 数据对象(data object)

数据对象(data object)是性质相同的数据元素的集合,是数据的一个子集。

2.4 数据结构(data structure)

数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。

数据元素相互之间的关系称为结构(structure)。

2.4.1 基本数据结构

数据逻辑结构

通常有下列4类基本结构

2.4.1.1 集合

结构中的数据元素之间除了“同属一个集合”的关系外,别无其他关系。

(这和数学中的集合概念是一致的)

2.4.1.2 线性结构

结构中的数据元素之间存在一个对一个的关系。

2.4.1.3 树形结构

结构中的元素之间存在一个对多个的关系。

2.4.1.4 图状结构(网状结构)

结构中的数据元素之间存在多个对多个的关系

2.4.2 形式定义

数据结构的形式定义为:数据结构是一个二元组

Data Structure = (D, S)

其中D是数据元素的有限集,S是D上关系的有限集。

2.4.3 逻辑结构

结构定义中的“关系”,描述的是数据元素之间的逻辑关系,因此又称为数据的逻辑关系

2.4.4 物理结构(存储结构)

数据结构在计算机中的表示(又称映像)称为数据的物理结构,又称存储结构。

2.5 位(bit)

在计算机中表示信息的最小单位是二进制数的一位,叫做位(bit)。

2.6 元素(element)(结点(node))

在计算机中,我们可以用一个由若干位组合起来形成的一个位串表示一个数据元素,通常称这个位串为元素(element)或结点(node)。

2.7 数据域(data field)

当数据元素由若干数据项组成时,位串中对应于各个数据项的子位串称为数据域(data field)。

因此,元素或结点可看成是数据元素在计算机中的映像。

2.8 数据元素之间的关系在计算机中的表示方法与存储结构

2.8.1 顺序映像、顺序存储结构

用一组地址连续的存储单元依次存放数据元素,数据元素之间的逻辑关系通过元素的地址直接反映

顺序存储

顺序映像的特点

借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。

2.8.2 非顺序映像

非顺序映像的特点

借助指示元素存储地址的指针(pointer)表示数据元素之间的逻辑关系。

2.8.2.1 链式存储结构

用一组地址任意的存储单元依次存放数据元素,数据元素之间的逻辑关系通过指针间接地反映

链式存储

2.8.2.2 索引存储结构

构造原理:利用数据元素的索引关系来确定数据元素的存储位置,由数据元素本身与索引表两部分组成。

特点:如查找、插入和删除等操作的时间效率较高,但存储空间开销较大。

2.8.2.3 散列存储结构

构造原理:通过事先准备好的散列函数关系与处理冲突的方法来确定数据元素的存储位置。

特点:诸如查找、插入和删除等操作的时间效率较高,主要缺点是确定好的散列函数比较困难。

2.9 数据的逻辑结构与物理结构

逻辑结构与物理结构

逻辑结构与存储结构

数据的逻辑结构和物理结构是密切相关的两个方面

任何一个算法的设计取决于选定的数据(逻辑)结构,而算法的实现依赖于采用的存储结构。

2.10 数据类型(data type)

数据类型(data type)是一个值得集合和定义在这个值集上的一组操作的总称。

按照“值”的不同特性,高级程序语言中的数据结构可分为两类:

2.10.1 原子类型

非结构的原子类型,原子类型的值是不可分的

2.10.2 结构类型

结构类型的值是由若干成分按某种结构组成的,因此是可以分解的,并且它的成分可以使非结构的,也可以是结构的。

2.11 抽象数据类型(Abstract Data Type, ADT)

2.11.1 定义与特性

抽象数据类型(Abstract Data Type, ADT)是指一个数据模型以及定义在该模型上的一组操作。

抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。

“抽象”的意义在于数据类型的数学抽象特性。

一个含抽象数据类型的软件模型通常应包含定义、表示和实现3个部分。

2.11.2 三种类型

若按其值的不同特性,可细分为下列3种类型:

2.11.2.1 原子类型(atomic data type)

属原子类型的变量的值时不可分解的

2.11.2.2 固定聚合类型(fixed-aggregate data type)

属该类型的变量,其值由确定数目的成分按某种结构组成。

2.11.2.3 可变聚合类型(variable-aggregate data type)

和固定聚合类型相比较,构成可变聚合类型“值”的成分数目不确定。

2.11.3 形式定义

抽象数据类型的形式定义为

(D, S, P)

其中,D是数据对象,S是D上的关系集,P是对D的基本操作集。

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

2.12 多形数据类型(泛型?)

多形数据类型(polymorphic data type)是其值的成分不确定的数据类型。

3 抽象数据类型的表示与实现

4 算法和算法分析

4.1 算法

4.1.1 定义

  • 算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作

  • 算法是用来解决某个特定课题的指令的集合。

  • 算法是由人们组织起来准备加以实施的一系列有限的基本步骤。

  • 算法是一组解决问题的清晰指令,它能够对符合一定规范的输入,在有限的时间内获得所需要的输出。

4.1.2 重要特性

算法特性

一个算法还具有下列五个重要特性:

4.1.2.1 有穷性

一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。

4.1.2.2 确定性

算法的每一条指令必须具有确切的含义,读者理解是不会产生二义性。

并且,在任何条件下,算法只有唯一的一条执行路径。

即对于相同的输入只能得出相同的输出。

4.1.2.3 可行性

一个算法是能行的

即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。

4.1.2.4 输入

一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。

4.1.2.5 输出

一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。

4.1.3 算法的描述

4.1.3.1 采用自然语言描述
4.1.3.2 采用程序流程图的形式来描述
4.1.3.3 设计一种既脱离某种具体的程序设计语言,又具有各种程序设计语言的共同特点的形式化语言来描述
4.1.3.4 采用某种具体程序语言来描述

4.2 算法设计的要求(原则)

通常设计一个“好”的算法应考虑达到以下目标。

4.2.1 正确性

算法应当满足具体问题的需求。

4.2.2 可读性

算法主要是为了人的阅读与交流,其次才是及其执行。

4.2.3 健壮性

当输入数据非法时,算法也能适当地做出反应或者进行处理,而不会莫名其妙的输出结果。

4.3 算法效率的度量(算法分析)

算法分析 是指对算法质量优劣的评价。

算法的执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。

评价一个算法的时间性能时,主要标准就是算法的渐进时间复杂度。

4.3.1 事后统计的方法

利用计算机内的计时功能,不同算法的程序可以用一组或多组相同的统计数据区分

缺点:

  • 必须先运行依据算法编制的程序

  • 所得时间统计量依赖于硬件、软件等环境因素,掩盖算法本身的优劣

4.3.2 事前分析估计的方法

一个用高级程序语言编写的程序在计算机上运行时消耗的时间取决于下列因素

4.3.2.1 依据算法选用的何种策略
4.3.2.2 问题的规模
4.3.2.3 书写程序的语言

对于同一种算法,实现的语言越高级就,执行效率就越低。

4.3.2.4 编译程序所产生的机器代码的质量
4.3.2.5 机器执行指令的速度

4.3.3 渐进时间复杂度

一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记作

T ( n ) = O ( f ( n ) ) T(n) = O(f(n)) T(n)=O(f(n))

它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度

时间复杂度主要分析 T ( n ) T(n) T(n)的数量级

4.3.3.1 频度

以语句执行的次数的多少作为算法的时间量度的分析方法称为频度统计法。

语句的频度指的是该语句重复执行的次数。

整个算法的频度是指算法所有语句的频度之和。

4.3.3.2 时间复杂度排序

常数阶 O ( 1 ) O(1) O(1)

对数阶 O ( l o g 2 n ) O(log_2 n) O(log2n)

线性阶 O ( n ) O(n) O(n)

线性对数阶 O ( n l o g 2 n ) O(nlog_2n) O(nlog2n)

平方阶 O ( n 2 ) O(n^2) O(n2)

立方阶 O ( n 3 ) O(n^3) O(n3)

k次方阶 O ( n k ) O(n^k) O(nk)

指数阶 O ( 2 n ) O(2^n) O(2n)

l o g 2 n log_2n log2n经常写为 l o g n logn logn

指数级与对数阶之所以只写了以2为底,是因为根据换底公式,不同的底数只相差一个常数,因此在渐进意义下等阶

4.3.3.3 计算方法

取算法时间增长最快的那个函数项,将其系数改为1。

4.4 算法的存储空间需求

4.4.1 空间复杂度

空间复杂度作为算法所需存储空间的量度,记作

S ( n ) = O ( f ( n ) ) S(n) = O(f(n)) S(n)=O(f(n))

其中n为问题的规模(或大小)

4.4.2 原地工作

若额外空间相对于输入数据量来说是常数,则称算法为原地工作。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值