期末考试了呀马上就,临时抱一下佛脚,说不定数据结构就考好了呢!(毕竟我是课代表啊,考不好也必须得好。。)
本章考点:各个概念的确切定义;分清逻辑结构和存储结构;ADT的表示;算法的五个要素;能分析给定算法的时间复杂度(重中之重)
正文:
学科形成和发展背景:自从1946年第一台计算机问世以来,计算机行业的飞速发展已远远超出人们对他的想象,如今计算机已经深入到人类生活的每一个领域。计算机的应用已经不再局限于科学计算,而更多的是用于控制,管理及数据处理等非数值问题的处理工作。于是,为了编写一个“好”的程序,人们开始考虑如何有效的描述、表示、处理数据等这些问题。除了不断提高计算机的技术外,很重要的一个方面是通过研究、分析数据本身的特点,利用这些本质特点找出数据之间的关系,然后合理地组织数据,以提高数据表示和处理的效率。
- 从具体问题中抽象出一个恰当的数学模型
- 设计一个解决此数学模型的算法
- 编写程序、进行测试、调整直到得到最终解答
寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间含有的关系,然后用数学语言加以描述。例如,预报人口增长增长情况的数学模型是微分方程。(这不是我的数学建模嘛。。)
对于非数值问题(像表、树、图之类的),描述这类问题所设计的对象不能用数值表示,对象之间的关系不能用方程和函数表示。这就给我们设计程序带来了问题,为了编写出一个好的程序,必须分析待处理的对象的特性,以及各处理对象之间存在的关系是什么,数据及数据之间的关系如何存储,如何求解。
数据结构的研究对象:非数值数据之间的结构关系、如何表示、如何存储、如何处理的问题。
简单来说,就是研究非数值计算的程序设计问题中计算机的操作对象以及他们之间的关系和操作。
(终于终于介绍概念了要。。)
- 数据:是所有能输入到计算机中并能被计算机程序处理的符号的总称。(计算机加工的“原料”)例如:整数、文档、算式等
- 数据元素(data element):数据的基本单位。
- 数据项(data item):数据元素的组成单位。是数据不可分割的最小单位。又被称为字段或者域。
- 数据对象(data object):具有相同特性的数据元素的集合,是数据的子集。例如:数据集合D={1,2,......,A,B,......,Z},则数据对象正整数N={1,2,3,......},数据结构对象字母C={A,B,......,Z}。
- 数据结构(data structure):数据元素及其相互关系。(另一种说法是 有结构的数据元素的集合 ,其中结构就是数据元素之间的关系)
数据结构是个二元组 Data_Structure=(D,S),其中D是数据元素的有限集合,S是D上关系的有限集合。
数据结构的三个要素:
- 逻辑结构:数据元素之间的关系(即数据元素之间的关联方式或“邻接方式”)。数据从存储结构上划分成四种基本结构:线性结构(数据元素之间一对一)、树形结构(数据元素之间一对多)、图形结构(数据元素之间多对多)和集合(数据元素之间无关系)。
- 存储结构(物理结构):逻辑结构在计算机中的存储映像,包括数据元素的表示和关系的表示。数据元素的表示:通常用位串表示。数据元素之间的关系在计算机中的表示分为顺序存储结构(相对位置)和链式存储结构(指针)。
- 运算集合:对数据定义的一组操作。运算定义在逻辑结构上,与存储结构无关。运算的实现依赖于存储结构。
例:设有一批数据元素,为了最快的存储某元素,数据结构宜用顺序存储结构;为了方便插入一个元素,数据结构宜用链式存储结构。
(嘻嘻,我终于会传图片了。。)
为了方便对算法的叙述,引入抽象数据类型(ADT)。
抽象数据类型是个三元组(D,S,P),其中D是数据元素有限集,S是D上关系有限集,P是对D的基本操作的有限集。
定义格式:
ADT 抽象数据类型名{
数据对象的定义
数据关系的定义
基本操作的定义
}ADT 抽象数据类型名
例:抽象数据类型复数的定义:
ADT Complex{
数据对象:D={real,image|real,image属于R}
数据关系:R={<real,image>}
基本操作:
InitComplex(&C)
操作结果:构造一个复数C.
OutputComplex(C)
初始条件:复数C存在.
操作结果:输出复数C的值.
......
}ADT Complex
(终于写完了这一段,我原来想从课件上拷下来,结果竟然是图片。。)
下面我们介绍算法:
首先引入概念:算法是解决问题的有限运算序列。
算法的特性:
- 输入:0个或多个输入;
- 输出:1个或多个输出;
- 有穷性:在有限步骤内结束;
- 确定性:组成算法的操作必须清晰无二义性,有唯一执行路径;
- 有效性:组成算法的操作必须能够在计算机上通过基本运算实现。(有的地方也叫 可行性)
选择的数据结构是否恰当直接影响算法的效率;而数据结构的优劣由算法的执行来体现。
算法=程序
(算法用某种程序设计语言具体实现时就是程序)
还有一个很拗口的东西:算法不是程序,程序一定是算法(虽然我觉得第二句也不对)。
算法设计要求:正确性、可读性、健壮性(完备的异常和出错处理)、高效性
算法性能分析:时间复杂度和空间复杂度。(下一篇主要介绍时间复杂度,敬请期待哈哈)
(距离期末考试还有八天,我的密码学还没有做完,我大概是疯了要。。)