【学习目标】
熟悉各名词、术语的含义,掌握基本概念。理解算法五个要素的确切含义。掌握计算语句频度和估算算法时间复杂度的方法。
【重点和难点】
本章讨论的都是一些基本概念,因此没有难点,重点在于了解有关数据结构的各个名词和术语的含义,以及语句频度和时间复杂度、空间复杂度的估算 。
【知识点】
数据、数据元素、数据结构、数据类型、抽象数据类型、算法及其设计原则、时间复杂度、空间复杂度。
【学习指南】
1. 熟悉各名词、术语的含义,掌握基本概念,特别是数据的逻辑结构和存储结构之间的关系。分清哪些是逻辑结构的性质,哪些是存储结构的性质。
2. 了解抽象数据类型的定义、表示和实现方法。
3. 熟悉类C语言的书写规范,特别要注意值调用和引用调用的区别,输入、输出的方式以及错误处理方式。
4. 理解算法五个要素的确切含义和对算法正确性的理解。
5. 掌握计算语句频度和估算算法时间复杂度的方法。
1.1 数据结构讨论的范畴
1.2 基本概念
1.3 算法和算法的量度
1.1 数据结构讨论的范畴
Niklaus Wirth: Algorithm Data Structures = Programs
程序设计: 算法: 数据结构:
为计算机处理问题编制 一组指令集
处理问题的策略
问题的数学模型
结构静力分析计算
例如: 数值计算的程序设计问题
─━ 线性代数方程组
─━ 环流模式方程 (球面坐标系)
全球天气预报
非数值计算的程序设计问题
例一: 求一组(n个)整数中的最大值
算法: ? 模型:?
基本操作是“比较两个数的大小”
取决于整数值的范围
例二:计算机对弈
算法:? 模型:?
对弈的规则和策略
棋盘及棋盘的格局
例三:足协的数据库管理
算法:? 模型:?
需要管理的项目? 如何管理? 用户界面?
各种表格
概括地说:
数据结构是一门讨论“描述现实世界实体的数学模型(非数值计算)及其上的操作在计算机中如何表示和实现”的学科。
1.2 基本概念
一、数据与数据结构
二、数据类型
三、抽象数据类型
一、数据与数据结构
所有能被输入到计算机中,且能被计算机处理的符号的集合。
数据:
是计算机操作的对象的总称。
是计算机处理的信息的某种特定的符号表示形式。
是数据(集合)中的一个“个体”
数据元素:
是数据结构中讨论的基本单位
数据对象是性质相同的数据元素的集合 是数据的子集
数据项:
是数据结构中讨论的最小单位
数据元素可以是数据项的集合
例如:
描述一个运动员的数据元素可以是
称之为组合项
数据结构:
带结构的数据元素的集合
假设用三个 4 位的十进制数表示一个含 12 位数的十进制数。
3214,6587,9345 ─ a1(3214),a2(6587),a3(9345)
则在数据元素 a1、a2 和 a3 之间存在着“次序”关系 ?a1,a2?、?a2,a3?
3214,6587,9345 a1 a2 a3
6587,3214,9345 a2 a1 a3
≠
例如:
又例,在2行3列的二维数组{a1, a2, a3, a4, a5, a6} 中六个元素之间 存在两个关系:
行的次序关系: 列的次序关系:
row = {,,,}
col = {,,}
a1 a3 a5 a2 a4 a6
a1 a2 a3 a4 a5 a6
再例,在一维数组 {a1, a2, a3, a4, a5, a6} 的数据元素之间存在如下的次序关系:
{| i=1, 2, 3, 4, 5}
或者说,数据结构是相互之间存在着某种关系的数据元素的集合。
可见,不同的“关系”构成不同的“结构”
数据结构包括以下几个方面:
数据元素之间的逻辑关系,即逻辑结构 数据元素及其关系在计算机存储器中的存储方式,即数据的存储结构 施加在该数据上的操作,即数据的运算
数据的逻辑结构可归结为以下四类:
线性结构
树形结构
图状结构
集合结构
数据结构的形式定义为:
数据结构是一个二元组
Data_Structures = (D, S)
其中:D 是数据元素的有限集, S 是 D上关系的有限集。
数据的存储结构(物理结构)
—— 逻辑结构在存储器中的映象
“数据元素”的映象 ?
“关系”的映象 ?
数据元素的映象方法:
用二进制位(bit)的位串表示数据元素
(321)10 = (501)8 = (101000001)2
关系的映象方法:
(表示?x, y?的方法)
顺序映象(顺序存储方法)
以相对的存储位置表示后继关系
例如:令 y 的存储位置和 x 的存储位置之间差一个常量 C
而 C 是一个隐含值,整个存储结构中只含数据元素本身的信息
x
y
链式映象(链式存储方法)
需要用一个和 x 在一起的附加信息指示 y 的存储位置
y x
不要求在逻辑上相邻的结点在物理位置上也相邻,结点间的逻辑关系由附加 的指针字段表示。
索引存储方法 存储结点信息的同时,建立附加的索引表。 索引表中的每一项称为索引项,索引项的一般形式是关键字与地址。 散列(或哈希)存储方法 根据结点的关键字通过散列函数直接计算出一个值,并将这个值作为该结点的存储地址。
在不同的编程环境中,
存储结构可有不同的描述方法。
当用高级程序设计语言进行编程时,通常可用高级编程语言中提供的数据类型描述之。
例如:
以三个带有次序关系的整数表示一个长整数时,可利用 C 语言中提供的整数数组类型。
typedef int Long_int [3]
定义长整数为:
二、数据类型
在用高级程序语言编写的程序中, 必须对程序中出现的每个变量、 常量或表达式,明确说明它们所 属的数据类型。
例如,C 语言中提供的基本数据类型有:
整型 int
浮点型 float
字符型 char
逻辑型 bool ( C 语言)
双精度型 double
实型( C 语言)
数据类型 是一个 值的集合 和定义在此集合上的 一组操作 的总称。
不同类型的变量,其所能取的值的范围不同,所能进行的操作不同。
三、抽象数据类型 (Abstract Data Type 简称ADT)
是指一个数学模型以及定义在此数学模型上的一组操作。
例如,抽象数据类型复数的定义:
数据对象: D={e1,e2|e1,e2∈RealSet } 数据关系: R1={| e1是复数的实数部分 | e2 是复数的虚数部分 }