浅谈数据结构以及其特点
文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。
资料仅供学习交流使用。
作者:Aliven888
1、简介:
这边文章将会从数据结构的定义、逻辑结构、存储结构、数据运算、相互关系、算法的时间复杂度等几个方面对数据结构进行介绍。
2、什么是数据结构
在了解数据结构之前,我们先了解下什么是数据、数据元素、数据项以及数据对象
-
什么是数据?
数据实际上可以简单理解为我们对客观事物的符号表示;在计算机科学中,随着我们对计算机技术的深入理解,可以把数据理解为所有能输入到计算机中并被计算机程序处理的符号的总称。比如我们在Windows编程中常用的数据类型(int, double, string 等),都是数据的体现。 -
什么是数据项?
数据项是数据的最小单位。 -
什么是数据元素?
数据元素是表示数据的基本单位;一个数据元素可以由若干个数据项组成。例如,如果我们把一个学生比作数据元素,那么它就是由学号,姓名等若干数据数据项组成的。 -
什么是数据对象?
数据对象简单可以理解为是数据元素相同(或者相似)的数据组成的集合的总称。 -
什么是数据结构
数据结构是指相互之间存在着某种关系的数据元素的集合,数据结构中的关系主要指相邻关系,其主要包含三方面的内容:逻辑结构,存储结构和数据运算;关于这三个方面的内容,下面会一一介绍。
3、数据的逻辑结构
数据的逻辑结构主要描述的就是数据元素之间的逻辑关系,它与数据的存储结构没有任何关系,同一逻辑结构的数据可以对应多种存储结构。总的来说,数据的逻辑结构主要分为以下几类。
3.1、线性结构
线性结构是指在该结构中的数据元素之间存在一对一的关系。在线性结构中,开始端元素和结束端元素都是唯一的,并且除了开始端元素和结束端元素外,每一个数据元素都有且仅有一个前驱元素和一个后继元素。

3.2、树形结构
树形结构是指在该结构中的数据元素之间存在着一对多的关系。树形结构只有一个开始端元素(也成为根节点),但是却会有多个结束端元素;除了开始端元素外,每个元素都仅有一个前驱元素,但是会有零个或者多个后继元素。

3.3、图形结构
图形结构是指该结构中的数据元素之间存在着多对多的关系,每个元素都可以有多个前驱元素,也可以有多个后继元素。

4、数据的物理结构
数据的物理结构又称为存储结构,是数据的逻辑结构在计算机中的存储形式(又称映像)。它包含数据元素的表示和关系的表示。
数据元素之间的关系在计算机中有两种不同的表示:顺序存储(映像)和非顺序存储(映像),其中顺序存储(映像)是借助数据元素在存储器中的物理位置来表示数据元素之间的逻辑关系的,而非顺序存储(映像)则是借助指针(指向数据元素的物理存储地址)表示数据元素之间的逻辑关系。
实际上,数据结构中常用的物理存储方式有一下几种。
4.1、顺序存储方法
该方法是把数据元素存放在物理地址连续的存储单元中,逻辑上相邻的两个元素其物理存储地址也是相邻的,数据元素之间的逻辑关系和物理关系是一一对应的。在C/C++中常见的数组就是这种存储方式。
4.2、链式存储方法
该方法是把数据元素存放在任意存储单元中的,逻辑上相邻的两个元素之间在物理位置上并不一定相邻(各个元素间物理空间地址是随机的),而他们之间的关联是有各元素附带的指针字段建立起来的。在C/C++中,常见的链表就是这样方式。
4.3、索引存储方法
该方法通常是在存储元素节点信息的同时,还建立的附加的关系索引表。索引表中的每一项称为索引项,索引项有关键字+地址组成(关键字:唯一标识一个节点, 地址:指向节点的指针)。这种带有索引的存储结构可以大大提高数据的查找速度。
4.4、散列(哈希)存储方法
该方法的基本思想是根据节点的关键字通过哈希函数直接计算出该节点的存储地址,这种存储方式从本质上讲数顺序存储和链式存储的一个扩展。
5、数据的运算
数据运算的实现和执行效率都与存储结构有关。一个数据结构所包含的数据运算的种类和个数,以及每种运算中的参数个数和类型,都应依旧数据结构的实际用途和需求来设定。