250 likes | 416 Views
数据结构. 主讲人:陈玉华. 第 1 章 绪论. 1.1 数据结构概述 1.2 基本概念 1.3 算法描述及分析. 1.1 什么是数据结构. 众所周知,计算机的程序是对数据进行加工处理。在大多数情况下,这些数据并不是无组织的,数据之间往往具有重要的结构关系,这就是数据结构的重要内容。那么,什么是数据结构呢?. 例 1-1 一个大学的学生成绩管理。. 在这种数据结构中,计算机处理的数据之间存在的 是一种 “ 一个对一个 ” 的简单 线性关系,称为线性数据结构。. 计信学院. 物电学院. …. 数学学院. 计算机系. 网络工程.
E N D
数据结构 主讲人:陈玉华
第1章 绪论 • 1.1 数据结构概述 • 1.2 基本概念 • 1.3 算法描述及分析
1.1 什么是数据结构 众所周知,计算机的程序是对数据进行加工处理。在大多数情况下,这些数据并不是无组织的,数据之间往往具有重要的结构关系,这就是数据结构的重要内容。那么,什么是数据结构呢?
例 1-1一个大学的学生成绩管理。 在这种数据结构中,计算机处理的数据之间存在的是一种 “一个对一个” 的简单线性关系,称为线性数据结构。
计信学院 物电学院 … 数学学院 计算机系 网络工程 教育技术 … … … … … 教师 学生 … 教师1 教师m • 例 1-2一所大学的部门管理。 在这种数据结构中,计算机处理的数据之间存在的是一种 “一个对多个” 的关系,称为树形数据结构。
B E B E 2 2 1 3 2 2 1 1 4 1 A D G A D G 3 4 1 2 1 2 C F C F 例 1-3 在 n个城市间建立通信网络,要求在其中任意两个城市间都有直接的或间接的通信线路,在已知某些城市之间直接通信线路预算造价的情况下,使网络的造价最低。 城市间的通信线路 最小造价通信线路 在这种数据结构中,计算机处理的数据之间存在的是一种 “多对多” 的关系,称为网状(图状)结构。
简单地说,数据结构是研究非数值计算程序设计问题中数据以及它们之间的逻辑关系和对数据操作的一门课程。重点分析数据之间抽象的相互关系,而不涉及数据的具体内容。简单地说,数据结构是研究非数值计算程序设计问题中数据以及它们之间的逻辑关系和对数据操作的一门课程。重点分析数据之间抽象的相互关系,而不涉及数据的具体内容。
1.2 基本概念 1. 数据 (data) 数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。 例如,一个利用数值分析方法求解代数方程的程序,其处理对象是整数和实数;一个编译程序或文字处理程序的处理对象是字符串。对计算机科学而言,数据的含义极为广泛,如图形、图像、色彩、声音等都可以通过编码而归之于数据的范畴。
2. 数据元素 (data element) 数据元素 是数据的基本单位,也称为结点,在计算机程序中通常作为一个整体进行考虑和处理。有时,一个数据元素可以由若干个数据项 (data item) 组成。 例如,某程序处理的数据是学生信息表,每个学生的信息就是一个数据元素,其中的姓名、性别、年龄等是这个数据元素中的数据项。数据项是数据处理中的最小单位。
3. 数据对象 (data object) 数据对象是性质相同的数据元素的集合,是数据的一个子集。 例如: 整数数据对象是集合 N = { 0,1,2,… }; 字母字符的数据对象是集合 C = { 'A' ,'B' ,… }。
4. 数据的逻辑结构 (data logical structure) 数据的逻辑结构反映的是数据元素之间的逻辑(数学)关系,并不依赖于计算机。 (1) 集合:结构中的数据元素之间除了 “同属于一个集合” 外,别无其他的关系。
(2) 线性结构:结构中的数据元素之间存在着一个对一个的关系。
(3) 树型结构:结构中的数据元素之间存在着一个对多个的关系。
20 12 5 5 9 13 8 12 (4) 图状结构或网状结构:结构中的数据元素之间存在着多个对多个的关系。
5. 数据的存储结构 (data memory structure) 数据的存储结构 ( 或称物理结构 ) 是数据在计算机存储器中的表示,包括数据的存储方式及数据之间的逻辑关系。数据的物理结构是依赖于计算机的。 (1) 顺序存储结构: 逻辑上相邻的数据元素在存储器中也相邻。
(2) 链式存储结构: 逻辑上相邻的数据元素在存储器中不一定相邻,但存储每个元素时都附加了指针(地址)字段,通过设置指针使不相邻存储的元素有了相邻的逻辑关系
6. 数据结构 (data structure) 数据结构是带有结构特性的数据元素集合,研究的是数据的逻辑结构和数据的存储结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。
1.3算法 描述及分析 算法(algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或者多个操作。算法设计依赖于数据的存储结构,因此对确定的问题,人们寻求在适宜的存储结构上设计一种效率较高的算法。
(1) 有穷性:必须总是(对任何合法的输入)在执行有穷步之后结束,且每一步都可以在有穷时间内完成。 (2) 确定性:每一条指令必须有确定的含义,读者理解时不会产生二义性,且在任何条件下,只有唯一的执行路径,即对于相同的输入只能得出相同的输出。 (3) 可行性: 算法中描述的操作都是可以通过已实现的基本运算执行有限次来实现的。 (4) 有输入:零个或多个输入,输入取自于特定对象的集合。 (5) 有输出:一个或多个输出,输出是与输入有特定关系的量。 1. 算法的重要特性
2. 算法的设计要求 (1) 正确性 (correctness)。算法应满足具体问题需求,设计或选择的算法应能正确反映这种需求。 (2) 可读性 (readability)。算法主要是为了人的阅读及人与人之间的交流,其次才是机器执行。可读性好有助于人对算法的理解,晦涩难懂的程序易于隐藏较多错误难以调试和修改。 (3) 健壮性 (robustness)。当输入数据非法时,算法也能适当地作出反应或处理,而不会产生莫名其妙的输出结果。 (4) 高效率与低存储 (high efficiency and low memory)。效率指的是算法执行时间。一个问题若有多个算法可解决,则执行时间短的算法效率高。存储量需求指的是算法执行过程中所需的最大存储空间。
3. 算法性能评价(算法效率的度量) 评价一个程序优劣的重要依据是看这个程序的执行需要占用多少机器资源。在各种机器资源中,最重要的是时间资源和空间资源。因此,在进行程序分析时,大家最关心的就是程序所用算法在运行时所要花费的时间代价和程序中使用的数据结构所占有的空间代价。通常就称之为时间复杂度(时间代价)和空间复杂度(空间代价)。
在一般情况下,算法中 “基本操作” 重复执行的次数是问题规模 n的某个函数 f (n),算法的时间度量记作:T (n) = O ( f (n) ) 此式表示随着时间规模 n的增大,算法执行时间的增长率和 f (n) 的增长率相同,所以 T(n) 称作算法的时间复杂度 (time complexity)。 由于算法时间复杂度分析只考虑相对于问题规模 n的增长率,因而在难以精确计算基本操作执行次数的情况下,只要求出它关于 n的增长率即可。我们可以在计算任何算法运行时间代价的时候,忽略所有的常数和低次项,用大 O表示法来表示算法的时间复杂度。 (1)算法的时间复杂度 一个算法由控制结构(顺序、分支和循环)和原操作(固有数据类型的操作)构成,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是 “基本操作” 的原操作,以该 “基本操作” 重复执行的次数作为算法运行时间的度量。
例如:在下列三个程序段中 3. 算法效率的度量 ① { ++x; s = 0; } ③ for ( j = 1; j <= n; ++j ) for ( k = 1; k <= n; ++k ) { ++x; s += x; } ② for ( i = 1; i <= n; ++i ) { ++x; s += x; } 含基本操作“x增 1” 的语句的重复次数分别为 1、n和 n2,则这三个程序段的时间复杂度分别为 O (1)、O (n) 和 O (n2)。
通常有如下的函数关系排序: c< log2 n< n< n log2n< n2< n3<2n 其中,c是与n无关的任意常数。上述函数排序与数学中对无穷大的分级完全一致,因为考虑的也是n值变化过程中的趋势。 按数量级将常见的时间复杂度递增排序,依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n2)、立方阶O(n3)、…、指数阶(2n)等。参见下图。