数据结构的存储方式 13

数据结构的存储方式

数据结构的存储方式只有两种:数组(顺序存储)和链表(链式存储)。

Q:不是还有散列表、栈、队列、堆、树、图等等各种数据结构吗,如何理解?

A:分析问题,⼀定要有递归的思想,⾃顶向下,从抽象到具体。

散列表、栈、队列、堆、树、图等各种数据结构都属于「上层建筑」,而数组和链表才是「结构基础」。

因为那些多样化的数据结构,究其源头,都是在链表或者数组上的特殊操作,API 不同而已。

数据结构 数组实现 链表实现
队列、栈 处理扩容缩容的问题 需要更多的内存空间存储节点指针
邻接矩阵 邻接表
散列表 线性探查法 拉链法
堆(完全二叉树) 链表「树」(二叉搜索树、AVL 树、红黑树、区间树、B 树等)
Redis 数据库

比如「队列」、「栈」这两种数据结构既可以使用链表也可以使用数组实现。用数组实现,就要处理扩容缩容的问题;用链表实现,没有这个问题,但需要更多的内存空间存储节点指针。

「图」的两种表示方法,邻接表就是链表,邻接矩阵就是二维数组。邻接矩阵判断连通性迅速,并可以进行矩阵运算解决一些问题,但是如果图比较稀疏的话很耗费空间。邻接表比较节省空间,但是很多操作的效率上肯定比不过邻接矩阵。

「散列表」就是通过散列函数把键映射到一个大数组里。而且对于解决散列冲突的方法,拉链法需要链表特性,操作简单,但需要额外的空间存储指针;线性探查法就需要数组特性,以便连续寻址,不需要指针的存储空间,但操作稍微复杂些。

「树」,用数组实现就是「堆」,因为「堆」是一个完全二叉树,用数组存储不需要节点指针,操作也比较简单;用链表实现就是很常见的那种树,因为不一定是完全二叉树,所以不适合用数组存储。为此,在这种链表「树」结构之上,又衍生出各种巧妙的设计,比如二叉搜索树、AVL 树、红黑树、区间树、B 树等等,以应对不同的问题。

对于 「Redis 数据库」,Redis 提供列表、字符串、集合等等⼏种常⽤数据结构,但是对于每种数据结构,底层的存储⽅式都⾄少有两种,以便于根据存储数据的实际情况使⽤合适的存储⽅式。

综上,数据结构种类很多,甚⾄你也可以实现⾃⼰的数据结构,但是底层存储无非是数组或链表。

数组和链表对比

数组由于是紧凑连续存储,可以随机访问 ,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块更大的空间,再把数据全部复制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)

链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度 O(1)。但是正因为存储空间不连续,你无法根据一个索引算出对应元素的地址,所以不能随机访问;而且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYdVz9a5' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片