数据结构的定义:
一种是数据结构的逻辑层面:数据结构的逻辑结构
一种是存在于计算机世界的物理层面,既数据结构的存储结构
数据结构=逻辑结构+存储结构
数据结构=逻辑结构+存储结构+(在存储结构上的)运算/操作
数据结构的三个方面:
数据的逻辑结构:
线性结构–>线性表 栈 队列 串及数组
非线性结构–>树形结构 图形结构
数据的存储结构:
顺序储存 链式存储 索引存储 散列存储
数据的运算:检索 排序 删除 修改等
一般来说 比如讲线性表 就是讲线性表的:结构 ,储存结构 ,讲他的运算-排序 删除 修改等三个方面往下细分。
数据结构体系图:
逻辑结构:
线性结构:
逻辑结构是抽象出来的一种思维 与具体的实现无关。生活中的案例可以想象成排队打饭的一列人 ,或者是一串冰糖葫芦。而像地铁导图,公司上下级部门之间的关系之类的 不属于一种线性结构。
一条线性结构的基本条件:
- 必须满足有一个唯一的头部:“第一元素”
- 必须满足有一个唯一的尾部:“最后一个元素”
- 必须满足除第一个元素外有一个直接的:“后继元素”
- 必须满足除最后一个元素外有一个直接的:“前继元素”
线性结构 就是一种一对一的数据结构。
非线性结构:
同样的这里讲的逻辑结构也是与具体实现无关。在生活中可以想象成地铁图形 ,可以想象成有多个节点的图。
树形结构:
- 只有唯一的一个头元素“第一元素”
- 但是有一个或者多个的下一级元素
- 每个元素的上一级元素有且只有一个“上一级元素”。
集合结构:
- 确定性(集合中的元素必须是确定的)
- 唯一性(集合中的元素互不相同。列如:集合A={1,a},则a不能等于1)
- 无序性(集合中的元素没有先后之分),如果集合(3.4.5)和(3.5.4)算作同一个集合
该结构的数据元素的关系是“属于同一个集合”,无其他关系/
因为集合元素关系很弱,数据结构中不对该数据结构进行研究。
网状结构:
- 每个元素可以有多个直接前驱元素,也可以有多个后继元素,特点是多对多的联系
树形:
网状:
集合:
细致的分类一下:
集合结构,线性结构,树状结构,网状结构。
逻辑结构有四种基本类型:结合结构,线性结构,树状结构,网状结构。
表和树是最常用的两种高效的数据结构。很多算法都是用这两种数据结构来设计实现的,
数据的存储结构:
数据的存储结构主要包括数据元素本身的存储以及数据元素之间的关系表示,是数据的逻辑结构在计算机中的表示。
常见的存储结构有:顺序结构 链式存储 索引存储 以及散列存储
顺序存储结构:
- 把逻辑上相邻的节点存储在物理位置上相邻的存储单元中,结点之间的逻辑关系油存储单元的邻接关系来体现。又此得到的存储结构为顺序存储结构,通常顺序存储结构是借助于计算机程序设计语言(例如c/c++)的数组来描述的
- (数据元素的存储对应于一块连续的存储空间,数据元素之间的前驱和后继关系通过数据元素,在存储器中的相对位置来反映)
顺序结构:
优缺点:
优点,是节省存储空间,因为分配给数据的存储单元全用存储单元全用存放节点的数据,节点之间的逻辑关系没有占用额外的存储空间。采用这种方法时,可现实对节点的随机存取,即每一个结点对应一个序号,由该序号可以直接计算除来节点的存储地址
缺点,插入和删除操作需要移动元素,效率较低。如下列图。
链式存储结构:
数据元素的存储对应的是不联系的存储空间,每个存储节点对应一个需要存储的数据元素。
每个节点是由数据域和指针域组成。元素之间的逻辑关系通过存储节点之间的连接关系反映出来。
特点:
- 比顺序存储结构的存储密度小(每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
- 逻辑上相邻的节点物理上不必相邻
- 插入,删除灵活(不必移动节点,只要改变节点中的指针)
- 查找节点时链式存储要比顺序存储慢。
图示:
比较链式存储结构和顺序存储结构
链式存储结构原则上是要存数据 还要存下一条数据的头部地址,看上去是浪费空间的,但是他有一百条数据就存储一百条数据,有十条就存储十条数据。不需要空闲的节点,
而顺序存储结构,虽然看上去只需要存储一条元素,但是要事先定义好长度,比如定义了一百条长度,只存储了十条 反而更浪费空间。
索引存储结构:除建立存储节点信息外,还建立了附加的索引来标识结点的地址。
比如图书,字典的目录。
散列存储结构:根据节点的关键字直接计算除该结点的存储地址
添加查询速度快。就跟数组中按照索引查找元素 找第一个 和找第一万个是一样的速度。