第一章 绪论
【学习重点】
1. 数据结构及相关概念;
2. 数据的逻辑结构和存储结构,二者之间的关系;
3. 算法及特性;
4. 大0记号。
【学习难点】
1. 抽象数据类型的理解和使用;
2. 伪代码的理解和使用;
3. 算法的时间复杂度分析。
1.1 数据结构在程序设计中的作用
程序设计的一般过程如下:
人(设计方案) 计算机(执行方案)
问题 想法 算法 程序
程序语言
数据模型 数据表示 编程环境
基本思路 数据处理 设计方案
计算机不能分析问题并产生问题的解决方案,必须由人(即程序设计者)分析问题,确定问题的解决方案,编写程序,然后让计算机执行程序最终获得问题的解。
1.2 本书讨论的主要内容
1.计算机能解决的问题一般可分为数值问题和非数值问题。数值问题的方程一般是数学方程,非数值问题的数据模型一般是线性表、树、图等。
2.本书讨论非数值问题的数据组织和处理,主要内容有如下四点:
1).数据的逻辑结构:线性表,数,图等数据结构,其核心是如何组织待处理的数据以及数据之间的关系。
2).数据的存储结构:如何将线性表,数,图等数据结构存储到计算机的存储器中,其核心是如何有效的存储数据以及数据之间的逻辑关系。
3).算法:如何基于数据的某种存储结构实现插入,删除,查找等基本操作,其核心是如何有效的处理数据。
4).常用数据处理:包括查找技术,排序技术,索引技术等
1.3 数据结构的基本概念
1.数据是信息的载体,指所有能输入计算机中能被计算机程序识别和处理的符号集合。数据分为:整数实数等数值数据,文字、图形、图像等非数值数据两大类。
数据元素是数据的基本单位,构成数据元素的最小单位是数据项。
如图所示:
2.数据结构 分为逻辑结构和存储结构。
1)数据的逻辑结构是指数据元素之间逻辑关系的整体。
根据数据元素之间逻辑关系的不同,数据结构分为以下四类:
a集合:数据元素之间就是“同属一个集合”,除此之外,没有任何关系。
b线性结构:数据结构之间存在一一对应的线性关系。
c树结构:数据元素之间存在一对多的层次关系。
d图结构:数据结构之间存在多对多的任意关系。
树结构和图结构也称非线性结构。
2)数据的存储结构又称物理结构,是分为顺序存储结构和链接存储结构。
a顺序存储结构:顺序存储结构使用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系是由元素的存储位置来表示的。
b链接存储结构:用一组任意的存储单元存储数据。数据元素之间的逻辑关系用指针来表示。
3.抽象数据类型(ADT)
1)数据类型:是一组值的集合以及定义于这个值集上的一组操作的总称。规定了该类型数据的取值范围和对这些数据所能采取的操作。
2)抽象:所谓抽象,就是抽出问题本质的特征而忽略非本质的细节,是对具体事物的一种概括。
3)抽象数据类型(ADT):是一个数据结构以及定义在该结构上的一组操作的总称。
数据类型指的是高级程序设计语言支持的基本数据类型。由类的
数据类型和ADT的区别 成员变量来实现。
ADT 指的是自定义的数据类型。ADT的每个操作由类的成员函数来实现。
1.4 算法及算法分析
1.什么是算法
算法是对特定问题求解步骤的一种描述,指指令的有限序列。
算法必须满足五个重要特性:
a输入:一个算法有零个或多个输入(即算法可以没有输入),这些输入通常取自于某个特定的对象集合。
b输出:一个算法有一个或多个输出(即算法必须要有输出),通常输入与输出之间存在着某种特定的关系。
c有穷性:一个算法必须总是在执行有穷步后结束,且每一步都在有穷时间内完成。
d确定性:算法中的每一条指令必须有确切的含义,不存在二义性。并且,在任何条件下,对于相同的输入必须有相同的输出。
e可行性:算法描述可以通过已经实现的基本操作执行有限次来实现。
2.算法的描述方法
优点:容易理解。
自然语言
缺点:容易出现二义性,并且算法通常都很冗长。
优点:直观易懂。
流程图
算法的描述方法 缺点:严密性不如程序设计语言,灵活性不如自然语言。
程序设计语言
注:伪代码不是一种实际的编程语言,但在表达能力上类似于编程语言,同时极小化了描述算法的不必要的技术性细节是比较合适的描述算法的方法,被称为“算法语言”或“第一语言”。
3.算法分析
1)、度量算法效率的方法:
事后统计:先将算法实现,然后输入适当的数据运行,测量其时间和空间开销。缺点:1、编写程序实现算法将花费较多的时间和精力;2、所得实验结果依赖于计算机的软硬件等环境因素,有时容易掩盖算法本身的劣势。
事前分析估算——渐进复杂度:它是对算法所消耗资源的一种估算方法。
2)、算法的时间复杂度:
影响算法时间代价的最主要因素是问题规模。问题规模是指输入量的多少,它可以从问题描述中得到。
为了客观地反映一个算法的执行时间,可以用算法中基本语句的执行次数来度量算法的工作量。基本语句是执行次数与整个算法的执行次数成正比的语句,基本语句对算法运行时间的贡献最大,是算法中最重要的操作。
a最好、最坏和平均情况:
对于某些算法,即使问题规模相同,如果输入数据不同,其时间开销也不同。
b算法的空间复杂度:
算法的空间复杂度是指在算法的执行过程中,需要的辅助空间数量。辅助空间是指除算法本身和输入输出数据所占据的空间外,算法临时开辟的存储空间。通常记作:
S(n)=O(f(n))
其中,n为问题规模,分析方法与算法的时间复杂度类似。
算法分析举例
分析算法的时间复杂度的基本方法是:找出所有语句中执行次数最大的那条语句作为基本语句,计算基本语句的执行次数,取其数量级放入大O中即可。
定理1-1:若A(n)=amnm+am-1nm-1+…+a1n+a0 是一个m次多项式,则A(m)=O(nm)