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

数据结构

2016-03-10 15:27 489 查看
数据结构是数据的组织形式,可以用来表示特定的对象数据。在计算机程序设计中,操作的对象是各式各样的数据,这些数据往往拥有不同的数据结构,如数组、接口、类等。而算法和数据结构具有千丝万缕的联系。所以在正式将具体算法之前我们先来了解一下什么是数据结构。

数据结构概述

数据结构是计算机中对数据的一种存储和组织方式,同事也泛指相互之间存在一种或多种特定关系的数据集合。数据结构是计算机艺术的一种体现,合理的数据结构能够提高算法的执行效率,还可以提高数据的存储效率。

什么是数据结构

什么是数据结构,数据结构的具体定义又是什么呢?数据结构是计算机程序设计的产物,其实,到现在为止,计算机技术领域中还没有一个同意的数据结构的定义。不同的专家往往对数据结构有不同的描述,例如:

数据结构是数据对象、存在于该对象的实例以及组成实例的数据元素之间的各种关系,并且这种关系可以通过定义相关的函数来给出。

还有人认为一个数据结构的设计过程可以分为抽象层、数据结构层和实现层。其中抽象层是指抽象数据类型层,即ADT层,主要讨论数据的逻辑结构及其运算;数据结构层讨论一个数据结构的表示;实现层讨论一个数据结构在计算机内的存储细节及运算的实现。

虽然没有统一的定义,但是这些定义都具有相同含义。我们可以这样简单理解数据结构,一个数据结构是由数据元素依据某种逻辑联系组织起来的,对数据元素间逻辑关系的描述成为数据的逻辑结构。由于数据必须在计算机内存储,数据的存储结构是其在计算机内的表示,也就是数据结构的实现形式。另外,讨论一个数据结构,必须涉及在该类数据上执行的运算。

数据结构是一切算法的基础,不仅如此,数据结构可以说是程序涉及语言的基础。

数据结构中的基本概念

深入了解数据结构之前,读者需要简单掌握数据结构中涉及的一些基本概念,主要包括如下内容。

1.数据(Data):数据是信息的载体,其能够被计算机识别、存储和加工处理,是计算机程序加工的“原材料”。数据包括的类型非常广,如基本的整数、字符、字符串、实数等,此外,图像和声音也可以认为是一种数据。

2.数据元素(Data Element):数据元素是数据的基本单位,也称为元素、节点、顶点、记录等。一般来说,一个数据元素可以由若干数据项组成,数据项是具有独立含义的最小标识单位,数据项也可称为字段、域、属性等。

3.数据结构(Data Structure):数据结构指的是数据之间的相互关系,即数据的组织形式。

数据结构的内容

一般来说,数据结构包括三方面的内容,数据的逻辑结构、数据的存储结构和数据的运算:

1.数据的逻辑结构(Logical Structure):数据元素(Data Element)之间的逻辑关系。

2.数据的存储结构(Storage Structure):即数据元素(Data Element)及其逻辑关系在计算机存储器中的表示形式。

3.数据的运算:即能够对数据施加的操作。常用的运算包括检索、插入、删除、更新、排序等。

数据机构中的这三方面是一个有机的整体,缺一不可。数据的逻辑结构

、数据的存储结构和数据的运算任何一个发生变化都将导致一个全新的数据结构出现。

数据结构的分类

数据结构有很多种,一般来说,按照数据的逻辑结构来对其简单地分类,可分为线性结构和非线性结构两类

线性结构

简单地说,线性结构就是表中各个节点具有线性关系。如果从数据结构的语言来描述的话,线性结构应该包括如下内容:

线性结构是非空集。

线性结构有且仅有一个开始节点和一个终端节点;

线性结构所有节点最多只有一个直接前趋结点和一个直接后继结点。

线性表是典型的线性结构,还有栈、队列和串等都是线性结构。

非线性结构

简单地说,非线性结构就是表中各个结点之间具有多个对应关系。如果从数据结构的语言来描述,非线性结构应该包括如下内容:

非线性结构是非空集。

非线性结构的一个结点可能有多个直接前趋结点和直接后继结点。

在实际应用中,数组、广义表、树结构和图结构等数据结构都是非线性结构。

数据结构的几种存储方式

数据的存储结构是数据结构的一个重要内容。在计算机中,数据的存储结构可以采用如下4中方法来实现。

1.顺序存储方式

顺序存储方式就是在一块连续的存储区域一个接一个地存放数据。顺序存储方式把逻辑上相邻的结点存储在物理位置上相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。顺序存储方式也称为顺序存储结构(Sequential Storage Structure),一般采用数据或者结构数据来描述。

线性存储方式主要用于线性逻辑结构的数据存放,而对于图和树等非线性逻辑结构则不适合。

2.链接存储方式

链接存储方式比价灵活,其不要求逻辑上相邻的结点在物理位置上相邻,结点间的逻辑关系由附加的引用字段表示。一个结点的引用字段往往指向下一个结点的存放位置。

链接存储方式也称为链式存储结构(Linked Storage Structure),一般在原数据项中增加引用类型来表示结点间的位置关系。

4.索引存储方式

索引存储方式是采用附件的索引表的方式来存储结点信息的一种存储方式。索引表由若干索引项组成。索引存储方式中索引的一般形式为:(关键字、地址)。其中,关键字是能够唯一标识一个结点的数据项。

索引存储方式还可以细分为如下两类:

1.稠密索引(Dense Index):这种方式中每个结点在索引表中都有一个索引项,其中,索引项的地址指示结点所在的存储位置;

2.稀疏索引(Spare Index):这种方式中一组结点在索引表中只对应一个索引项。其中,索引项的地址指示一组结点的起始存储位置。

散列存储方式

散列存储方式是根据结点的关键字直接计算出该结点的存储地址的一种存储方式。

在实际应用中,往往需要根据具体数据结构来决定采用哪种存储方式。同一逻辑结构采用不同的存储方法,可以得到不同的存储结构。而且这4种基本存储方法,即可单独使用,也可组合起来对数据结构进行存储描述。

常用的数据结构

在计算机科学的反战过程中,数据结构也在随着发展。目前,程序设计中常用的数据结构包括如下内容:

1.数组(Array)

数组是一种聚合数据类型,是将具有相同类型的若干变量有序地组织在一起的集合。数组可以说是最基本的数据结构,在各种变成语言中都有对应。一个数组可以分解为多个数组元素,按照数据元素的类型,数组可以分为整数型数组、字符型数组、对象数组、浮点型数组等。数组还可以有一维、二维及多维等表现形式。

2.栈(Stack)

栈是一种特殊的线性表,其只能在一个表的一个固定端进行数据结点的插入和删除操作。栈按照后进先出的原则来存储数据,也就是说,先插入的数据将被压入栈低,最后插入的数据在栈顶,读出数据时,从栈顶开始逐个读出。站在会编语言程序中经常用于重要数据的现场保护。栈中没有数据时,称为空栈。

3.队列(Queue)

队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。一般来说,进行插入操作的一端称为队尾,进行删除操作的一端称为队头。队列中没有元素时,称为空队列。

4.链表(Linked List)

链表是一种数据元素按照链式存储结构存储的数据结构,这种存储结构在物理上具有非连续的特点。链表由一系列数据节点构成,每个数据结点包括数据域和引用域两部分。其中,引用域保存了数据结构中下一个元素存放的地址。链表结构中数据元素的逻辑顺序是通过链表中的引用链接次序来实现的。

5.树(Tree)

树是典型的非线性结构,其是包括n各结点的又穷集合K。在树结构中有且仅有一个根结点,该结点没有前趋结点。在树结构中其它结点有且仅有一个前趋结点,而且可以有m个后继结点,m≥0。

6.图(Graph)

图是另外一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。如果两个顶点之间存在一条边,那么就表示这两个顶点具有相邻关系。

7.堆(Heap)

堆是一种特殊的树形结构,一般讨论的堆都是二叉堆。堆得特点是其根节点的值是所有节点中最小的或者最大的,并且根结点的两个子树也是一个堆结构。

8.散列表(Hash)

散列表源自于散列函数(Hash function)其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较而直接取得所查记录。

选择合适的数据结构解决实际问题

计算机给程序员带来很大的方便。计算机能够处理的问题一般可以分为两类:数值计算问题和非数值计算问题。

数值计算问题在早起的计算机发展中占据了很大的比例。例如,线性方程的求解、矩阵的计算等。这类问题一般需要程序设计的技巧和相应的数学知识,而数据结构方面涉及的内容较少。

随着计算机应用范围的扩大,一些非数值计算问题越来越突出,称为计算机解决的焦点问题。目前来说,非数值计算问题大约占据了80%的计算机工作时间。搞笑解决这类问题不仅需要数学知识,而且还需要设计合理的数据结构。例如,在一个包含大量数据的电话号码簿中查找指定号码的问题,运动比赛的赛程时间安排问题等。这些问题往往不能简单地用数学公式来表示,还需要合理地选择数据结构来处理。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 数据 算法