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

[数据结构]前言——概述

2015-06-10 00:31 447 查看

数据结构的位置

计算机科学已经深入应用到各个领域,不仅有效地解决了各种工程和科学计算中的数值计算问题,而且也有效地解决了许多文本处理、信息检索、数据库管理、图像识别、人工智能等非数值的数据处理问题。数据结构有助于程序员更有效地组织数据、设计高效的算法、完成高质量的程序以满足错综复杂的实际需要。

数据结构是计算机学科的重要分支研究领域。数据结构和算法在计算机学科中的地位十分重要,其他计算机科学领域及有关的应用软件都要使用到各种数据结构。数据结构是算法分析与设计、操作系统、软件工程、数据库概论、编译技术、计算机图形学、人机交互等专业基础课和专业课程的先行课程。语言编译要使用栈、散列表及语法树操作系统中用队列、存储管理表及目录树等数据库系统运用线性表,多链表及索引树等进行数据管理;而在人工智能领域,依求解问题性质的差异将涉及到各种不同的数据结构,如广义表,集合、搜索树及各种有向图等等。数据结构在计算机科学技术中的定位如下图:



数据结构知识体系  

数据结构作为一门学科所研究的问题及内容如下图:


 

数据结构的研究对象(研究内容)

1.数据对象的结构形式,各种数据结构的性质 (逻辑结构);
2.数据对象和”关系”在计算机中的表⽰示 (物理结构/存储结构);
3.数据结构上定义的基本操作(算法);
4.算法的效率;
5.数据结构的应⽤用,如数据分类,检索.

数据的逻辑结构、存储结构和运算

从字面上来看,数据结构就是指数据间的相互关系。具体到计算机环境,谈到任何一种结构时,都自然地联系着作用在这种类型的数据上的运算(即函数),为了在计算机上执行这些运算,我们有必要把这些数据以某种方式存储在计算机中。因此,我们可以认为,所谓数据结构,就是由某种逻辑关系组织起来的一批数据,按一定的存储方法被存储于计算机中,并在这些数据上定义了一个运算的集合。也就是说,数据结构具有三个方面:数据的逻辑结构、数据的存储结构和数据的运算。

逻辑结构

常见逻辑关系有:线性结构、树形结构、图结构和集合结构。其中,线性结构是最简单的数据结构,例如,程序设计语言中往往都会介绍的线性表(包括数组和链表)、栈、队列、向量、字符串等。其中,字符串就是每个结点都是单个字符的线性表。实际上多维数组和广义表也是线性结构的推广。另外,文件其本质也是线性结构,不过由于存储在外存中,对文件数据的访问速度非常慢,因此,仔细研究文件结构和基于文件的外排序也是很有必要的。

二叉树和树是非常重要的数据结构,其应用十分灵活而广泛。二叉树可以看作是树的特例。例如,语言编译中要用到语法树,操作系统有目录树,数据库系统需要用索引树等进行数据管理,而在人工智能领域,需要用到搜索树等。

许多真实世界的问题都可以图来抽象地定义。例如,一张交通图可以用数据结构的图来形象化地表示:用结点表示城市,用边表示连接城市的高速公路;Web网页的关系也可以表示为图:Web网页作为结点,网页之间的链接作为边。图是一种最通用的逻辑结构,实际上,图
包含 
树 包含 二叉树 包含 线性表。

存储结构

数据的存储结构是建立一种由逻辑结构到存储空间的映射.常见的存储方法有:顺序方法、链接方法、索引方法、散列方法。其中,索引存储又分为线性和树形两种。文件结构的索引则往往用树形结构。顺序方法和链接方法适用在内存结构中。索引方法和散列方法适用在外存与内存交互结构。

顺序存储把一组结点存放在按地址相邻的存储单元里,结点间的逻辑关系用存储单元的自然顺序关系来表达的,即,用一块存储区域存储线性数据结构。顺序存储法为使用整数编码访问数据结点提供了便利。因为,顺序存储方法的存储空间除了存储有用数据外,没有用于存储其他附加的信息,所以顺序存储结构一般也被称为紧凑存储结构。特点:1、随机存取表中元素。2、插入和删除操作需要移动元素。
链接法是在结点的存储结构中附加指针字段来存储结点间的逻辑关系。链接法中数据结点包括两部分:数据字段存放结点本身的数据,指针字段存放指向其后继结点的指针。链接方法适用于那些需要经常进行增删结点的复杂数据结构。特点:

比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
逻辑上相邻的节点物理上不必相邻。
插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
查找结点时链式存储要比顺序存储慢。
每个结点是由数据域和指针域组成。

索引法是顺序存储的一种推广,用于大小不等的数据结点的顺序存储。通过建造一个由整数域Z映射到存储地址域的函数,把整数索引值映射到结点的存储地址,从而形成一个存储一串指针的索引表,每个指针指向存储区域的一个数据结点。特点:索引存储结构是用结点的索引号来确定结点存储地址,其优点是检索速度快,缺点是增加了附加的索引表,会占用较多的存储空间。
作为索引法的一种延伸和扩展,散列法利用散列函数进行索引值的计算,然后通过索引表求出结点的指针地址。特点:散列是数组存储方式的一种发展,相比数组,散列的数据访问速度要高于数组,因为可以依据存储数据的部分内容找到数据在数组中的存储位置,进而能够快速实现数据的访问,理想的散列访问速度是非常迅速的,而不像在数组中的遍历过程,采用存储数组中内容的部分元素作为映射函数的输入,映射函数的输出就是存储数据的位置,这样的访问速度就省去了遍历数组的实现,因此时间复杂度可以认为为O(1),而数组遍历的时间复杂度为O(n)。

运算

对于一种数据结构,往往需要定义一些运算。例如,建立数据结构、清除数据结构、插入一个新数据元素、删除某个数据元素、修改某个数据元素、排序、检索等。作为最常用的算法,排序和检索历来是数据结构讨论中的重点问题。排序算法最能够体现算法的魅力,它对算法速度要求非常高,其中内排序主要考虑的是怎样减少关键码之间的比较次数和记录交换次数,以提高排序速度。可以证明所有基于比较的排序算法的时间代价是Θ(nlog n),这也是排序问题的时间代价;而外排序则考虑外存的特性,尽量减少访外操作,以提高排序速度。检索则考虑怎样提高检索速度,这往往是与存储方法有关的。例如,我们可以利用索引存储来加快检索散列表、B树和B+树等高效的数据结构都具有极好的检索性能。数据结构知识体系如下图:



算法的效率问题

每一种数据结构与其相关的算法都有时间、空间开销和效率等问题。每当面临一个新的设计问题时,设计者都应该要权衡时间空间开销,设计出更有效的数据结构和算法,以适应问题的需要。

基本问题包括:对于给定的一类问题,最好的算法是什么?需要多少存储空间和时间?空间与时间的折衷方案是什么?存取数据最好的方法是什么?最好算法的最坏情况是什么?平均来说,算法的运行好到何种程度?算法一般化到何种程度——即什么类型的问题可以用类似的方法处理?

算法的一般性质包括:

    (1) 通用性  对于那些符合输入类型的任意输入数据,都能根据算法进行问题求解,包保证计算结构的正确性。

    (2) 有效性 组成算法的每一条指令都必须是能够被人或机器确切执行的。

    (3) 确定性  算法每执行一步之后,对于它的下一步,应该有明确的指示。即,保证每一步之后都有关于下一步动作的指令,不能缺乏下一步指令或仅仅含有模糊不清的指令。

    (4) 有穷性  算法的执行必须在有限步内结束。
常见的算法类型

在实际应用中,算法的表现形式千变万化,但许多算法的设计思想具有相似之处。归纳起来,常用的算法大致可分为以下几类:

    (1) 穷举法 基本思想是在一个可能存在可行状态(可行解)的状态全集中依次遍历所有的元素,并判断是否为可行状态。

    (2) 贪心法 基本思想是试图通过局部最优解得到全局最优解。

    (3) 分治法 基本思想是把一个规模较大的问题划分成相似的小问题,各个求解,再得整个问题的解。

    (4) 回溯法 基本思想是一步一步向前试探,等有多种选择时任意选择一种,只要可行就继续向前,一旦失败时就后退回来选择其它可能性。

    (5) 动态规划法 基本思想是把大问题分解为若干小问题,通过求解子问题来得到原问题的解。由于这些子问题相互包含,为了复用已计算的结果,常把计算的中间结果全部保存起来,自底向上多路经地求解计算原问题的解。

    (6) 分枝界限法 基本思想是在表示问题空间的树上进行系统搜索时采用广度优先策略,同时利用最优解属性的上下界来控制搜索的分枝。        

一个算法优劣的重要依据:渐进分析实现该算法的程序在计算机中执行时所需占用的机器资源的多少。另外介绍两个重要指标:算法的空间代价(或称空间复杂性)和算法的时间代价(或称时间复杂性)。渐进分析的结果是得到一个大O渐进表达式。

抽象数据类型

事实上,数据结构的三个侧面,以数据的逻辑结构和数据的运算定义更为重要。因为很多时候人们并不关心数据的存储结构和运算的具体实现。1983年Aho等人把数据结构的存储与实现细节剥离,定义了抽象数据类型(简称“ADT”)的概念。抽象数据类型是定义了一组运算的数学模型。例如栈结构,栈中元素的数学特性(即逻辑结构)表现为线性表,它们是有序的;栈的主要运算是进栈(push)、出栈(pop)、判栈空(isEmpty)等。这里我们并不涉及栈的存储方式以及栈中元素的类型等。这种抽象的数据类型可以在较高级的算法中直接引用,而不用考虑它的实现细节。这就使得设计者可以在不同的设计阶段采用不同的抽象数据类型作为设计的基础,在适当的抽象层次上考虑程序的结构和算法,从而很好地支持了逻辑设计和物理实现的分离,支持封装和信息隐蔽

大多数教材都是以数据的逻辑结构为主线,顺序介绍线性结构、树形结构、图结构和文件结构。在介绍每种数据结构时,再讨论其存储结构以及相关的算法。例如对于线性表,如果考虑到存储,可以分为顺序表和链表;考虑到运算的特殊性,则可以分为向量、栈和队列。对于一些比较重要的算法,再列出单独的章节来讨论,例如排序、检索、索引、存储管理等。



数据结构教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: