您的位置:首页 > 理论基础 > 数据结构算法

数据结构 第一章 绪论

2013-09-11 00:00 204 查看
本章要求:

1、了解:研究数据结构的目的和意义

2、了解:数据结构基本概念和相关术语

3、掌握:算法基本概念和算法评价依据

4、掌握:算法的时间复杂度和空间复杂度

1.1数据结构:数据结构是计算机存储和组织数据的方式。

数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。

沃斯---“算法+数据结构=程序”

1.2基本概念和术语

1.2.1数据与数据元素

数据:数据(Data)是对客观事物的符号表示,它能被计算机识别、存储和加工处理。

数据元素:数据元素(Data Element)是数据的基本单位,有时也称元素、节点、顶点或记录。

一个数据元素可能由若干个数据项(Data Item)组成,也可仅有一个数据项。

数据项是最小的识别单位,有时也称为字段、域或属性。

例:人口信息查询系统中身份证号码、姓名等组成了一个数据元素,即一个数据元素包含了两个以上的数据项。

数据结构包括以下三方面内容:

(1)数据的逻辑结构

(2)数据的存储结构

(3)数据运算 运算的定义直接依赖于逻辑结构,但运算的实现必须依赖于存储结构。

1.2.2数据的逻辑结构和存储结构

数据的逻辑结构是程序员根据具体问题抽象出来的数学模型。数据中元素通常有以下几种逻辑结构:

(1)集合:任何两个元素之间都没有逻辑关系,每个元素都是孤立的。

(2)线性结构:结构中元素之间存在一对一的关系,即所谓的线性关系。

例:人口信息表中就是一个线性结构,在这个结构体中,各元素(由一个人的身份证号码、姓名和其他信息组成)排列成一个表,第一个元素后紧跟着第二个元素,第二个元素之后紧跟着第三个元素,依次类推,整个结构就像一条“链”,故有线性结构之称。

(3)树形结构:结构中的数据结构之间存在一对多的关系(呈分支,层次状态)

(4)图状结构:结构中的元素存在多对多的关系,也就是说元素之间的逻辑关系可以是任意的。在这种结构中,元素之间的逻辑关系也称 邻接关系。

通常将树形结构和图状结构归纳为非线性结构。因此,数据中的逻辑结构可分为两大类:

线性结构和非线性结构

数据的存储结构(也称物理结构)是指数据在计算机内的表示方法,是逻辑结构的具体实现。

存储结构包含两方面内容:数据元素本身的表示、数据元素间逻辑关系的表示

数据的存储结构有以下四种基本方式:

(1)顺序存储:其方法是把数据元素依次存储在一组地址连续的存储单元中,元素间的逻辑关系由存储单元的位置直接体现,由此得到的存储表示称为顺序存储结构。(高级语言中,常用一维数组来实现顺序结构存储,该方法主要运用于 线性结构,非线性结构也可通过某种线性化的处理,实现顺序存储)

(2)链式存储:将数据元素存储在一组任意的存储单元中,而用附加的指针域表示元素之间的逻辑关系,由此得到的存储称为链式存储。(使用这种结构时,往往把一个数据元素及附加的指针放在一个结构体中作为一个节点。高级语言中,常用指针变量来实现链式存储)

(3)索引存储:该方法的特点是在存储数据元素的同时,还建立附加的索引表。

索引表中的每一项被称为索引项。索引项的一般形式是(关键字,地址)

若每个数据元素在索引表中均有一个索引项,该索引称为稠密索引

若一个索引对应一组数据元素,该索
3ff0
引称为稀疏索引。

(4)散列存储:该方法依据数据元素的关键字,用一个事先设计好的函数计算出该数据元素的存储地址,然后把它存入该地址中。这种函数称为散列函数,由散列函数计算出的地址称为散列地址。

1.2.3数据运算

数据运算是对数据施加的操作。最常用的基本运算有:检索(查找)、插入、删除、更新、排序等。

小结:数据结构包含逻辑结构,存储结构和运算。同意逻辑结构采用不同的存储结构,得到不同的数据结构,我们常用不同的数据结构来识别它们。例如:

线性结构采用顺序存储,我们称之为顺序表;采用链式存储则称为链表。

同一逻辑结构定义不同的运算也会导致不同的数据结构,例如:

若限制线性结构的插入、删除在一端进行,称该结构为栈;

若限制插入在一端进行,而删除在另一端进行,则称为队列。

更进一步,若栈采用顺序存储,则称为顺序栈;若采用链式存储,则称为链栈。顺序栈和链栈也是不同的数据结构。

1.2.4数据类型与抽象数据类型

数据类型:数据类型是一个值的集合和在这个集合上定义的一组操作的总称。

按“值”可否分解,可把数据类型分为两类:

(1)原子类型:其值不可分解,如C语言的基本类型(整型、字符型、实型、枚举型、指针类型和空类型)

(2)结构类型:其值可分解成若干成分(分量),如C语言的数组类型,结构类型等。结构类型的成分可以是原子类型,也可以是某种结构类型。

抽象数据类型:抽象数据类型是指一个数学模型以及定义在该模型上的一组操作。

抽象数据类型和数据类型实质上是一个概念。

1.3算法和算法描述语言

算法:算法是对特定问题求解步骤的描述,是指令的有限序列,其中每条指令表示一个或多个操作。

一个算法必须具备以下五个特性:

(1)有穷性:一个算法对任何合法的输入必须在执行有限步骤之后结束,且每步都可在有限时间内完成。

(2)确定性:算法的每条指令必须有确切含义,不能有二义性。

(3)可行性:算法是可行的,即算法描述的操作均可通过已经实现的基本运算的有限次执行来实现。

(4)输入:一个算法有零个或多个输入,这些输入取自算法加工对象的集合。

(5)输出:一个算法有一个或多个输出,这些输出应是算法对输入加工后乎合逻辑的结果。

1.4算法分析

1.4.1算法评估

算法评估的四个指标:

(1)正确性:

1.没有语法错误

2.算法对几组输入数据能够得出满足规格说明要求的结果

3.算法对于精心选择的经典、苛刻并带有刁难性的几组输入数据能够得出满足规格说明要求的结果。

4.算法对于一切合法的输入数据都能够得出满足规格说明要求的结果。

(2)可读性:

1.良好的程序要有程序说明文件,即要有注释://、/*....*/、、、、、

2.空行 起着分隔程序段落的作用,使程序布局更加清楚。

3.代码行

4.对齐

5.变量命名(要能读懂表达什么)

(3)健壮性:当输入数据非法是运行环境改变时,算法能恰当的做出反应或进行处理,不会产生莫名奇妙的输出结果。(因此,算法要对输入数据和参数进行合法性检查)

例:从键盘输入三角形的三条边的长度,其三角形的面积。当输入的三个值不能组成三角形时,不应继续计算,应该报出输入错误并进行处理。

(4)时空效率:要求算法的执行时间尽可能的短,占用的存储空间尽可能的少。

但时空要求往往是相互矛盾的,节省了时间可能牺牲空间,反之亦然。设计者应在时间和空间上有所平衡。

1.4.2 算法性能分析与度量

当我们把一个算法转换为程序并在计算机上执行,其运行时间取决于以下因素:

(1)硬件的速度,例如是使用486机还是使用586机

(2)书写程序的语言。级别越高的语言,执行效率越低

(3)编译程序所生成目标代码的质量

(4)问题的规模

一个算法的时间复杂度(T(n)):指算法从开始到结束所需要的时间,记T(n)=O(f(n))(时间就是该算法中每条语句的执行时间之和,而每条语句执行时间又是该语句执行次数(也称频度)与执行语句所需时间的乘积)

常见的时间复杂度,按数量级递增排序有:

c<log2n<n<nlog2n<n^2<n*n*n<10^n

一个算法的空间复杂度(S(n)):算法所需存储空间的度量,记S(n)=O(f(n))

这里所说算法所需的存储空间,通常不含输入数据和程序本身所占的存储空间,而是指算法对输入数据进行运算所需的辅助工作单位和存储为实现计算所需信息的辅助空间。这类空间也称额外空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: