(一)绪论 | 如何判断某数据结构是逻辑结构还是存储结构,是线性结构还是非线性结构

如何判断某数据结构是逻辑结构还是存储结构

首先,数据结构分为两个层次:

  • 逻辑结构
  • 存储结构(物理结构)

其中,相关的一些说法:

  • 逻辑结构是用来描述数据元素间的逻辑关系,是一个抽象概念,与数据的实际存储无关,独立于计算机存在。
  • 存储结构是数据元素及其相互之间的关系在计算机存储器中的存储方式,简而言之就是实际的物理存储方式。
  • 总结:逻辑结构是数据结构的抽象,存储结构是数据结构的实现,两者综合起来才建立了数据元素完整的结构关系。只有逻辑结构,数据无法实际存储;只有存储结构,数据不知道该用哪种合适的方式存储。逻辑结构就好比理论思想;存储结构就好比某种具体的实践方式。
  • 当一个结构,在逻辑结构中只有一种定义,而在物理结构中却有两种选择,那么我们可以判断该结构属于逻辑结构。

举例:栈是一种线性的逻辑结构,在存储结构中,它可以使用顺序存储(数组),也可以使用链式存储(链表)。所以说栈是一种逻辑结构。

  • 相反,当某种结构在原有逻辑结构基础上加上了某种限定,使得其在物理结构中只有一种定义,那么这个结构就属于存储结构。相当于某种思想(逻辑结构)的具体某一种实践方式(存储结构)。

物理结构分为四种:

  • 顺序存储结构

把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。
元素之间的关系由存储单元的邻接关系来体现。其优点是可以实现随机存取,每个元素占用最少的存储空间;缺点是只能使用相邻的一整块存储单元,因此可能产生较多的外部碎片。

  • 链式存储结构

不要求逻辑上相邻的元素在物理位置上也相邻,借助指示元素存储地址的指针来表示元素之间的逻辑关系。
其优点是不会出现碎片现象,能充分利用所有存储单元;缺点是每个元素因存储指针而占用额外的存储空间,且只能实现顺序存取。

  • 索引存储结构

在存储元素信息的同时,还建立附加的索引表。
索引表中的每项称为索引项,索引项的一般形式是(关键字,地址)。
其优点是检索速度快;缺点是附加的索引表额外占用存储空间。另外,增加和删除数据时也要修改索引表,因而会花费较多的时间。

  • 散列存储结构

根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储。
其优点是检索、增加和删除结点的操作都很快;缺点是若散列函数不好,则可能出现元素存储单元的冲突,而解决冲突会增加时间和空间开销。

如何判断某种数据结构是线性结构还是非线性结构

按照“数据元素之间是否是一对一的关系”,逻辑结构可划分为两种:
线性结构与非线性结构。

  • 线性结构:有且仅有一个开始结点和一个终止结点,除了头尾,每个数据元素都有一个直接前驱和直接后继,是一对一的关系。
  • 非线性结构:一个结点可能有多个直接前驱和后继,比如树、图(注意,树、图是逻辑结构);也可能没有任何关系,比如集合。

一些容易混淆的概念:

注意:数组是存储结构中,对顺序存储结构的物理实现,跟上面所说的一些逻辑结构不是一码事。

注意:顺序存储结构不等于线性表,因为线性表是逻辑结构,而顺序存储结构是存储结构(物理结构),二者根本不在一个范畴,因此不能放在一起比较。
另外:顺序存储结构不仅能实现对线性表、队列、栈(线性结构),还能实现树和图(非线性结构),即数组能实现的逻辑结构不止一种,线性和非线性的逻辑结构都可以通过数组实现。

另外提一个:顺序表。顺序表是在计算机内存中以数组的形式保存的线性表。即对于线性表这种逻辑结构,使用数组的方式进行顺序存储,为顺序表。因此顺序表是存储结构。
而有序表,仅仅指的是关键字有序的线性表,仅描述一种数据元素间的逻辑关系。它既可以链式存储,也可以顺序存储,因此有序表属于逻辑结构。

常见的逻辑结构

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

  • 队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

数据结构中提到的串,即字符串,由 n 个字符组成的一个整体( n >= 0 )。这 n 个字符可以由字母、数字或者其他字符组成。

存储结构

  • 循环队列

为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue)。循环队列是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。其实现方式为单链表。

  • 哈希表
  • 单链表

单链表对应的逻辑结构是线性表。它是线性表的链式存储结构。

【由于目前只是学习了第一章,有很多涉及到后面章节的知识还不太懂,所以先写到这里,后续再回来进行补充完善】

你可能感兴趣的:(数据结构,数据结构)