数据结构概述
数据结构与数学、计算机硬件和软件有十分密切的关系。其核心技术是分解与抽象,通过对问题的抽象舍弃数据元素的具体内容就得到逻辑结构。通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义——将上述两个方面结合将问题变换为数据结构。
数据结构是指互相之间存在着一种或多种关系的数据元素的集合。数据结构涉及数据元素之间的逻辑关系,数据在计算机中的存储方式和这些数据上定义的一组运算,一般称这三个方面为数据的逻辑结构、数据的存储结构和数据的运算。
1、逻辑结构
在任何问题中数据元素之间都不会是孤立的,在它们之间都存在着这样或那样的逻辑关系。这种关系称为逻辑结构。数据的逻辑结构包含两个要素:一个是数据元素的集合;另一个是关系的集合。
在形式上,数据的逻辑结构通常可以采用一个二元组来表示:
Data_Structure = (D, R), 其中D是数据元素的有限集,R是D上的关系的有限集。
根据数据元素间关系的不同特性,数据的逻辑结构通常分为以下四类:
1)集合:在集合中,数据元素间的关系是“属于同一个集合”。集合是元素关系极为松散的一种结构。
2)线性结构:该结构的数据元素之间存在一对一的关系。
3)树结构:该结构的数据元素之间存在着一对多的关系。
4)图结构:该结构的数据元素之间存在多对多的关系,亦称为网状结构。
由于集合是数据元素之间关系极为松散的一种结构,因此也可用其他结构来表示。
总体而言逻辑结构是具体问题的抽象,与数据的存储无关。数据如何在计算中表示一个数据结构,即在计算机中映射称为数据的物理结构,又称为存储结构。
2、存储结构
数据的存储结构最常用的是顺序存储和链式存储的方法。
1)顺序存储方法:把逻辑上相邻的元素存储在屋里位置相邻的存储单元中,结点间的逻辑关系有存储单元的邻接关系来体现。由此得到的存储表示称为顺序存储结构,在程序设计语言中通常用数组实现。
2)链式存储方法:对逻辑上相邻的元素不要求其物理位置相邻,元素间的逻辑关系通过相关联的指示来表示。由此得到的存储表示称为链式存储结构,在程序设计语言中通常使用指针类型或引用类型来实现。
除了顺序存储方法和链式存储方法外,有时为了查找的方便还采用索引存储方法和散列存储方法。
3)索引存储方法:在存储结点信息的同时建立附加的索引表。索引表中的每一项包含关键字和地址——关键字是能够唯一标识一个数据元素的数据项;地址指示出数据元素所在的存储位置。索引存储主要针对数据内容的存储而不强调关系的存储,索引存储方法主要面向查找操作。
4)散列存储方法:以数据元素的关键字的值为自变量,通过某个函数(散列函数)计算出该元素的存储位置。
以上四种存储方法中,顺序存储方法和链式存储方法是最基本与最常用的,索引和散列存储方法在具体实现时需要用到顺序和链式存储方法。在实际应用中,一种逻辑结构可以有不同的存储方法,选用何种存储结构来表示相应的逻辑结构要视情况而定,主要考虑运算的实现及算法的时空要求。
对于程序设计中的数据有了基本的了解,那么从具体问题抽象出来的数据如何在计算机中表示呢?通过对抽象数据类型的定义表示,如下:
以矩阵为例用上述形式表达其数据:
以上是伪代码表示,下面通过Java语言表示:
数据对象的类型可以被描述成一个类,如下: