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