数据结构与算法:第一章(概论)

一、基本概念和术语

1.数据(Data)是信息的载体,是描述客观事物的数、字 符、以及所有能输入到计算机中,被计算机程序识别和处理 的符号的集合。
2.数据元素(Data Element)是数据中的一个“个体” ,是数据的基本单位。在有些情况下数据元素也称为元素、 结点、顶点、记录等。数据元素用于完整地描述一个对象。 如:一个学生记录、棋盘中的一个格局、图中的一个顶点等 。
3.数据项(Data Item)是组成数据元素的有特定意义的 不可分割的最小单位。如构成一个数据元素的字段、域、属 性等都可称之为数据项。数据元素是数据项的集合。 如:学生信息表中的学号、姓名、性别、专业等。
4.数据对象(Data Object)是具有相同性质的数据元素 的集合,是数据的一个子集。 如:整数数据对象是集合N = { 0,±1,±2, … },字 母字符数据对象是字符集合C={‘a’,‘b’,…,‘z’},学生 数据对象等。
5.数据结构(Data Structure)通过抽象的方法研究一 组有特定关系的数据的存储与处理,数据结构主要研究三个 方面的内容。 (1) 数据之间的逻辑关系,即数据的逻辑结构; (2) 数据及其逻辑关系如何在计算机中存储实现,即数据的 存储结构; (3) 在某种存储模式下,对数据施加的操作是如何实现的, 即运算实现。
数据结构的三要素
数据结构与算法:第一章(概论)_第1张图片
6.数据的逻辑结构
集合结构:元素间的次序是任意的。元素之间除了 “属于同一集合”的联系外没有其他的关系。
线性结构:数据元素的有序序列。除了第一个和最 后一个元素外,其余元素都有一个前趋和一个后继, 1对1
树形结构:除了根元素外,每个节点有且仅有一个 前趋,后继数目不限,1对多
图型结构:每个元素的前趋和后继数目都不限,多 对多
数据结构与算法:第一章(概论)_第2张图片
7.数据的存储结构
(1) 顺序存储结构:借助元素在存储器中的相对位置表示数据元素之间 的关系,通常用数组来实现。
(2) 链接存储结构:借助表示元素存储地址的指针显式地指出元素之间 的逻辑关系,逻辑上相邻的元素其物理位置不要求相邻,通常借助指针 实现。采用链接存储结构除了存储数据元素本身之外还要存储指示元素 间关系的指针。
(3) 哈希(散列)存储方式:是专用于集合结构的数据存放方式。在哈 希存储中,用一个哈希函数将数据元素按关键字和一个唯一的存储位置 关联起来。方法是根据设定好的哈希函数f(key)和处理冲突的规则将一 组关键字映象到一个有限的连续的地址集(区间)上。
(4) 索引存储方式:数据元素被排成一个序列:d1,d2,…,dn,每 个结点d在序列里都有对应的位序i,位序可以作为结点的索引存储在索 引表中。检索时利用结点的顺序号i来确定结点的存储地址。
8.数据的运算
(1) 创建:创建某种数据结构;
(2) 清除:删除数据结构;
(3) 插入:在数据结构指定的位置上插入一个新元素;
(4) 删除:将数据结构中的某个元素删去;
(5) 搜索:在数据结构中搜索满足特定条件的元素;
(6) 更新:修改数据结构中的某个元素的值;
(7) 访问:访问数据结构中的某个元素;
(8) 遍历:按照某种次序访问数据结构中的每一元素,使每 个元素恰好被访问一次;

二、算法的定义及特性

算法是对特定问题求解步骤的一种描述,是 指令的有限序列。其中每一条指令表示一个或多个操作。简 单的说,算法就是解决特定问题的方法。描述一个算法可以 采用文字叙述,也可以采用传统流程图、N-S图或PAD图等 ,本书采用C++语言描述。

评价一个算法优劣的重要依据是看执行该算法的程序需要占 用多少机器资源:
◼ 程序所用算法运行时所要花费的时间代价
◼ 程序中使用的数据结构占有的空间代价

一个算法具有下列重要特性:
1.有穷性:即算法只执行有限步,并且每步应该在有限的时 间内完成。
2.确定性:即算法中的每一条指令必须有确切的合义,无二 义性,在任何条件下,算法只有唯一的一条执行路径,即对于 相同的输入只能得出相同的输出。
3.可行性:即算法中描述的操作都必须足够基本,即都是可 以通过已经实现的基本运算执行有限次来实现的;
4.输入: 算法具有零个或多个输入,也就是说算法必须有 加工的对象。输入取自特定的数据对象的集合。
5.输出:算法具有一个或多个输出。这些输出与输入之间有 某种确定的关系。这种确定关系就是算法的功能。

设计一个好的算法通常要考虑达到以下目标:
1.正确性(Correctness)
2.可读性(Readability)
3.健壮性(Robustness)
4.高效性(High efficiency)

三、算法效率的衡量方法

解决同一个问题总是存在着多种算法,而最重要的计算 资源是时间和空间,因此,评价一个算法优劣的重要依 据是:程序所用算法运行时所要花费的时间代价和程序 中使用的数据结构占有的空间代价,算法设计者需要在 两者之间采取折衷。进行算法性能分析的目的是寻找高 效的算法来解决问题,提高工作效率。那么,如何评估 各算法的好坏?或据此设计出更好的算法呢? 衡量算法效率的方法主要有两大类
1.事后统计的方法:利用计算机的时钟进行算法执行时 间的统计。在算法中的某些部位插入时间函数time ( ) 测定算法完成某一功能所花费的时间。这种方法有非常 明显的缺陷:首先必须把算法转变成为程序执行,其次 进行时间统计时依赖于硬件和软件环境,这容易掩盖算 法本身的优劣。
2.事前分析估算的方法:用高级语言编写的程序运行的 时间主要取决于如下因素:
(1) 算法选用的策略;
(2) 问题的规模。随着处理问题的数据增大,处理会越来 越困难复杂,把描述数据增大程度的量叫做问题规模。 规模越大,消耗时间越多。
(3) 编写程序的语言。对于同一个算法,实现语言的级别 越高,其执行效率就越低;
(4) 编译程序所产生的目标代码的质量。对于代码优化较 好的编译程序其所生成的程序质量较高; (5) 机器执行指令的速度。

显然,上述后面三条与算法设计是无关的。也就 是说同一个算法用不同的语言实现,或者用不同 的编译程序进行编译,或者在不同的计算机上运 行时,效率均不相同。这表明使用绝对的时间单 位衡量算法的效率是不合适的。去除掉这些与计 算机硬件、软件有关的因素,可以认为一个特定 算法的“运行工作量”的大小,只依赖于问题的规 模(通常用整数量 n 来表示),或者说:它是问 题规模的函数。

四、算法的时间复杂度

算法的时间复杂度(Time Complexity):
T(n)是该算 法的时间耗费,是其所求解问题规模n的函数。当问题规 模n趋向无穷大时,不考虑具体的运行时间函数,只考虑 运行时间函数的数量级(阶)这称为算法的渐进时间复 杂度(Asymptotic Time Complexity)。 渐进表示法的常用记法如下:
(1) 大 O 表示法 T(n)=O(f(N)) 说明:如果存在常量 c>0 和正整数N0>=1,当 N>=N0 时有 T(N)<=cf(N)。即给出了时间复杂度的上界,不可 能比 cf(N)更大。

(2) 大 Ω 表示法 T(n)=Ω(f(N)) 说明:如果存在常量 c>0 和正整数N0>=1,当 N>=N0 时有 T(N)>=cf(N)。即给出了时间复杂度的下界,不可 能比 cf(N)更小。

(3) 大 θ 表示法 T(n)=θ(f(N)) 说明:如果存在常量 c>0 和正整数 N0>=1,当 N>=N0时有 T(N)==cf(N)。即T(n)=O(f(N)) 与 T(n)=Ω(f(N)) 都成立,给出了时间复杂度的上界和下界。 经常将渐进时间复杂度大O表示法T(n) = O(f(n))简称 为时间复杂度
计算时间复杂度的基本原则:
(1) 在程序中找出最复杂、运行时间最长的程序段,计算它 的时间复杂度,也就是整个程序的时间复杂度。
(2) 数量级函数f(N)的选择:通常选择比较简单的函数形式, 并忽略低次项和系数。 常见的时间复杂度及其关系如下:

数据结构与算法:第一章(概论)_第3张图片
数据结构与算法:第一章(概论)_第4张图片
数据结构与算法:第一章(概论)_第5张图片
数据结构与算法:第一章(概论)_第6张图片
数据结构与算法:第一章(概论)_第7张图片
数据结构与算法:第一章(概论)_第8张图片
## 五、算法的空间复杂度
空间复杂度
(Space Complexity)或称为空间复杂性 是指解决问题的算法在执行时所占用的存储空间,也是衡 量算法有效性的一个指标,记作:

S(n)=O(g(n))

其中n为问题的规模(或大小)。表示随着问题规模 n 的 增大,算法运行所需存储量的增长率与函数 g(n) 的增 长率相同。

如果输入数据所占空间只取决于问题本身,和算法无关, 则在讨论算法的空间复杂度时只需分析除输入和程序之外 的辅助变量所占的额外空间即可。如果所需额外空间相对 于输入数据量来说只是一个常数,则称此算法为“原地工 作”,此时的空间复杂度为 O(1);如果算法所需的存储 量与特定的输入有关,同时间复杂度一样,也是按照最坏 的情况进行考虑。

六、抽象数据类型

和数据结构的形式定义相对应,抽象数据类型可用以下三元 组表示:
(D,R,P) 其中D是数据对象,即具有相同特性的数据元素的集合。R 是D上的关系集合,P是对D的基本操作集合。 抽象数据类型的伪代码定义格式:
ADT 抽象数据类型名 {
数据对象D:<数据对象的定义>
数据关系R:<数据关系的定义>
基本操作P:<基本操作的定义>
}ADT 抽象数据类型名

随着程序设计的发展,数据结构的发展经历了三个 阶段:无结构阶段、结构化阶段和面向对象阶段。 本书采用C++语言描述抽象数据类型和算法, C++语言作为一种面向对象的程序设计语言是在吸 收结构化程序设计语言的优点的基础上发展起来的。 面向对象的程序设计方法其本质是把数据和处理数 据的过程抽象成一个具有特定身份和某些属性的自 包含实体即对象。

前面介绍过,计算机科学家N.Wirth教授曾经提出一个著 名的公式“算法 + 数据结构 = 程序”,这个公式在软件 开发的进程中产生了深远的影响,但是,它并没有强调数 据结构与解决问题的算法是一个整体,因此在面向对象程 序设计阶段,有人主张将它修改为:
◼ 程序 = 对象 + 对象 + …
◼ 对象 = 数据结构 + 算法

你可能感兴趣的:(数据结构与算法)