程序=算法+数据结构
N.沃思(Niklaus Wirth)教授提出:
程序=算法+数据结构
以上公式说明了如下两个问题:
(1)算法决定如何构造和组织数据(算法→数据结构)。
(2)算法的选择依赖于作为基础的数据结构(数据结构→算法)。
软件=程序+文档(软件工程的观点)
求解非数值计算的问题
主要考虑的是设计出合适的数据结构及相应的算法。
即:首先要考虑对相关的各种信息如何表示、组织和存储?
因此,可以认为:数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作的学科。
数据结构基本概念
几个概念:
数据(Data):是客观事物的符号表示。在计算机科学中指的是所有能输入到计算机中并被计算机程序处理的符号的总称。
数据元素(Data Element):是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。
数据项是数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。
数据对象(Data Object):是性质相同的数据元素的集合。是数据的一个子集。
什么是数据结构?
定义1—-
是相互之间存在一种或多种特定关系的数据元素的集合。
定义2—-
按某种逻辑关系组织起来的一批数据(或称带结构的数据元素的集合)应用计算机语言并按一定的存储表示 方式把它们存储在计算机的存储器中,并在其上定义了一个运算的集合。
逻辑结构
数据元素间抽象化的相互关系(简称为逻辑结构)。
与数据的存储无关,独立于计算机,它是从具体问题抽象出来的数学模型。
存储结构(物理结构)—-
数据元素及其关系(数据的逻辑结构)在计算机存储器中的存储形式。
是逻辑结构用计算机语言的实现,它依赖于计算机语言。
运算(算法)
逻辑结构—划分方法一
(1)线性结构—-
有且仅有一个开始和一个终端结点,并且所有结点都最多只有一个直接前趋和一个后继。
例如:线性表、栈、队列、串
(2)非线性结构—-
一个结点可能有多个直接前趋和直接后继。
例如:树、图等。
逻辑结构—划分方法二
一、集合 结构中的数据元素除了同属于一种类型外,别无其它关系。
二、线性结构 结构中的数据元素之间存在一对一的关系。
三、树型结构 结构中的数据元素之间存在一对多的关系。
四、图状结构或网状结构 结构中的数据元素之间存在多对多的关系。
存储结构
存储结构两方面的内容:
(1)数据元素自身值的表示(数据域)
(2)该结点与其它结点关系的表示(链域)
两种基本的存储方法:
(1)顺序存储方法(顺序存储结构)
(2)链接存储方法(链式存储结构)
同一种逻辑结构可采用不同的存储方法(以上两种之一或组合),这主要考虑的是运算方便及算法的时空要求。
数据结构的运算(对数据的操作)
⑴ 建立(Create)一个数据结构;
⑵ 消除(Destroy)一个数据结构;
⑶ 从一个数据结构中删除(Delete)一个数据元素;
⑷ 把一个数据元素插入(Insert)到一个数据结构中;
⑸ 对一个数据结构进行访问(Access);
⑹ 对一个数据结构(中的数据元素)进行修改(Modify)
⑺ 对一个数据结构进行排序(Sort);
⑻ 对一个数据结构进行查找(Search)。
数据类型及抽象数据类型
数据类型:在一种程序设计语言中,变量所具有的数据种类。
例1、 在FORTRAN语言中,变量的数据类型有整型、实型、和复数型
例2、在C语言中
数据类型:基本类型和构造类型
基本类型:整型、浮点型、字符型
构造类型:数组、结构、联合、指针、枚举型、自定义
注意:数据结构不同于数据类型,也不同于数据对象,它不仅要描述数据对象的数据类型,而且要描述数据对象各元素之间的相互关系。
抽象数据类型(Abstract Data Type ,简称ADT):是指一个数学模型以及定义在该模型上的一组操作。
ADT的定义仅是一组逻辑特性描述, 与其在计算机内的表示和实现无关。因此,不论ADT的内部结构如何变化,只要其数学特性不变,都不影响其外部使用。
ADT的形式化定义是三元组:ADT=(D,S,P)
其中:D是数据对象,S是D上的关系集,P是对D的基本操作集。
ADT的一般定义形式是:
ADT <抽象数据类型名>{
数据对象: <数据对象的定义>
数据关系: <数据关系的定义>
基本操作: <基本操作的定义>
} ADT <抽象数据类型名>
其中数据对象和数据关系的定义用伪码描述。
基本操作的定义是:
<基本操作名>(<参数表>)
初始条件: <初始条件描述>
操作结果: <操作结果描述>
初始条件:描述操作执行之前数据结构和参数应满足的条件;若不满足,则操作失败,返回相应的出错信息。
操作结果:描述操作正常完成之后,数据结构的变化状况和 应返回的结果。
算法
算法的概念和描述:
什么是算法?
所谓算法(Algorithm)是对特定问题求解方法(步骤)的一种描述。
为解决某一特定问题而由若干条指令组成的有穷序列。
适合于计算机程序实现的求解问题的方法
算法的概念和描述:
一个算法必须满足以下五个准则:
(1)有穷性—执行了有限条指令后一定要终止。
(2)确定性(无二义)—
算法的每一步操作都必须有确切定义,不得有任何歧义性。
(3)可(能)行性—
算法的每一步操作都必须是可行的,即每步操作均能在有限时间内完成。
(4)输入数据—
一个算法有n(n>=0)个初始数据的输入。
(5)输出数据—
一个算法有一个或多个与输入有某种关系的有效信息的输出。
? 常见函数的时间复杂度按数量递增排列及增长率。
常数阶O(1)
对数阶O(log2n)
线性阶O(n)
线性对数阶O(nlog2n)
平方阶O(n2)
立方阶O(n3)
……
k次方阶O(nk)
指数阶O(2n)
空间复杂度(Space complexity)
:是指算法编写成程序后,在计算机中运行时所需存储空间大小的度量。记作: S(n)=O(f(n))
其中: n为问题的规模(或大小)
该存储空间一般包括三个方面:
指令常数变量所占用的存储空间;
输入数据所占用的存储空间;
辅助(存储)空间。
一般地,算法的空间复杂度指的是辅助空间。
一维数组a[n]: 空间复杂度 O(n)
二维数组a[n][m]: 空间复杂度 O(n*m)