之前学习数据结构基本都是数组、链表、树、图一个个学过来。很少去总结他们的内在特点和联系。到底什么是数据结构呢?数据结构的三要素:
- 数据的逻辑结构。
- 数据的存储结构。
- 数据的运算。
1.逻辑结构
1.1 集合结构
元素只是同属一个集合,元素之间没有任何逻辑联系。
1.2 线性结构
线性结构中的元素之间是一对一的关系。
1.3 树形结构
树形结构中的元素之间是一对多的关系。
1.4 图状结构
图状结构中的元素之间是多对多的关系。
2.关于逻辑结构的疑问思考
2.1 双向链表是线性结构么?
刚接触到逻辑结构的四种分类时候,有个疑问:双向链表,还是线性结构么?双向链表,每个节点(首位除外)都有一个前驱和一个后继,每个元素即是其它一个元素前驱同时也是另一个元素的后继,看起来一个元素不再对应一个元素而是对应两个元素。所以这样看起来双向链表不是线性结构而是图状结构。
这样理解的问题在哪里呢?
A、B两个元素,“A是B的前驱” & “B是A的后继”。这两句话看似表达了两个关系,实际上一件事。所以 B 有一个前驱节点A,有一个后继节点C。并不是 B 和A、C构成一对多的关系,只是 B 是 A 的后继,C 是 B 的后继的另一种表达。
所以,双向链表符合元素间是一对一的关系的定义,是线性结构。
3.存储结构
3.1 顺序存储
把逻辑上相邻的元素存储在物理位置上也相邻的存储单元里,元素之间的关系由存储单元的邻接关系来体现。
优点:可以实现随机存取,单个元素占用存储空间少。
缺点:需要连续的存储空间,不支持动态扩展,插入删除效率低。
3.2 链接存储
逻辑上相邻的元素在物理位置上不需要也相邻,借助指示元素存储地址的指针表示元素之间的逻辑关系。
优点:不要求连续的存储空间,支持动态扩展,插入删除效率高。
缺点:元素指针占用额外的存储空间,不支持随机访问,只能顺序访问。
3.3 索引存储
在存储元素信息的同时,还建立附加的索引表。索引表中的每一项称为索引项,索引项的一般形式是:(关键字,地址)。
优点:是检索速度快。
缺点:索引表会占用额外的存储空间,增加和删除数据时要修改索引表。
3.4 散列存储
又称为Hash存储,根据元素的关键字直接计算出该元素的存储地址。
优点:是检索、增加和删除结点的操作都很快。
缺点:散列函数计算增加耗时,散列函数不好可能出现元素存储单元的冲突。而解决冲突会增加时间和空间开销。