线性表及其顺序存储结构的理解

2019-07-28  本文已影响0人  pujess

线性表

零个或多个数据元素的有限序列

1. 面向何种问题?

在数据结构的第一篇基本理解里面有提到面向问题的逻辑结构,而线性表就是一个描述问题的逻辑结构
因此我们需要先弄清楚线性表描述的是什么样的问题

一年中的十二星座?马路边的一排整齐排列的单车?...

上面说的问题都对,通俗来说线性表就是一列相同性质的事物。
它有两个极为重要的特点,线性表描述的问题一定必须满足:

  1. 前驱后继的唯一性
    !!线性表第一个元素没有前驱,最后一个元素没有后继,凡是中间元素必有且仅有一个前驱与一个后继。!!
  2. 有限性(无限的数列只存在数学概念中,所以这一特性只作为了解)

2. 线性表的抽象数据类型?

前面文章提到抽象数据类型实际上是一个数学模型,所谓数学模型可以理解成有共性,而线性表的共性就是前面所说的前驱后继关系。

类型 共性 操作
整型 都是整数 加减乘除...
线性表 遵循前驱后继唯一和有限性 增删查改...
整型线性表 都是整数且遵循前驱后继唯一且有限 加减乘除+增删查改

(理解可以按上面表格这么理解)

Data 与物理结构相关性
数据对象:D={ai|ai=ElemSet,i=1,2,..,n,n≥0} 与存储物理结构无关
数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,...,n} 与存储物理结构有关
Operation 与物理结构相关性
InitList(*L):初始化操作,建立一个空的线性表。 方法内实现过程与物理结构有关,而定义(传参、返回什么类型)与其无关
ListEmpty(L):判断线性表是否为空表。若为空表,返回true;否则,返回false。 方法内实现过程与物理结构有关,而定义(传参、返回什么类型)与其无关
ClearList(*L):将线性表清空。 方法内实现过程与物理结构有关,而定义(传参、返回什么类型)与其无关
GetElem(L,i,*e):将线性表L中的第i个位置的元素值,返回给e。 方法内实现过程与物理结构有关,而定义(传参、返回什么类型)与其无关
LocateElem(L,e):在线性表中L中查找与e相等的元素。若存在,返回元素序号;否则,返回0表示不存在。 方法内实现过程与物理结构有关,而定义(传参、返回什么类型)与其无关
ListInsert(*L,i,e):在线性表L中的第i个位置,插入新元素e。 方法内实现过程与物理结构有关,而定义(传参、返回什么类型)与其无关
ListDelete(L,i,e):删除线性表中的第i个元素,并用e返回其值。 方法内实现过程与物理结构有关,而定义(传参、返回什么类型)与其无关

实际上会有很多更复杂的操作,但是都是可以通过组合上面的基本操作达到目的的!

这里很清楚的看到,方法定义(仅仅是种类,实现过程还是和物理结构有关的)是由线性表特性决定好的,和存储的物理结构无关,而Data中的数据关系则是要根据具体的物理结构具体去定义。

顺序存储结构

1. 理解

顺序存储的特点(也可能可以说是目的吧):就是通过计算数据存储的地址,获取元素
(对比链式存储:通过一步步寻找找到数据存储的地址,获取元素)
不要小瞧计算两个字,它意味着
1.可以快速通过常数规模的计算量就找到存储地址
2.并不意味着数据必须按照连续存储的方法存储
怎么去理解?意思就是,即使是数组我也不需要连续存储,每一个数据隔一个存储单位放在硬盘里也行,隔两个存储单位也行,因为唯一不同的就是我计算地址的时候是:首地址+第i个*2 和 首地址+第i个*3 的区别

线性表顺序存储结构

1. 三个属性

线性表顺序存储结构有三个属性,它们是为了计算公式而存在的,有了这三个属性就能完全描述线性表的顺序存储结构:

2. 三个属性的java具体实现

详见https://www.jianshu.com/p/569ab283dfa0

3. 操作方法的java具体实现

详见https://www.jianshu.com/p/569ab283dfa0

上一篇下一篇

猜你喜欢

热点阅读