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

这句话怎么理解,不是还有散列表、栈、队列、堆、树、图等等各种数据结构吗?

我们分析问题,⼀定要有递归的思想,⾃顶向下,从抽象到具体。你上来就列出这么多,那些都属于「上层建筑」,⽽数组和链表才是「结构基础」。因为那些多样化的数据结构,究其源头,都是在链表或者数组上的特殊操作,API不同⽽已。

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

栈(Stack)。撤回,即 Ctrl+Z,是我们最常见的操作之一,大多数应用都会支持这个功能。你知道它是怎么实现的吗?答案是这样的:把之前的应用状态(限制个数)保存到内存中,最近的状态放到第一个。这时,我们需要栈(Stack)来实现这个功能。栈中的元素采用 LIFO (Last In First Out),即后进先出


队列(Queue)与栈类似,都是采用线性结构存储数据。它们的区别在于,栈采用 LIFO 方式,而队列采用先进先出,即FIFO(First in First Out)

队列

图(Graph)的两种表⽰⽅法,邻接表就是链表,邻接矩阵就是⼆维数组。邻接矩阵判断连通性迅速,并可以进⾏矩阵运算解决⼀些问题,但是如果图⽐较稀疏的话很耗费空间。邻接表⽐较节省空间,但是很多操作的效率上肯定⽐不过邻接矩阵。


散列表(Hash)就是哈希表,通过散列函数把键映射到⼀个⼤数组⾥。⽽且对于解决散列冲突的⽅法,拉链法需要链表特性,操作简单,但需要额外的空间存储指针;线性探查法就需要数组特性,以便连续寻址,不需要指针的存储空间,但操作稍微复杂些。

散列表(哈希表)

树(Tree),⽤数组实现就是「堆」,因为「堆」是⼀个完全⼆叉树,⽤数组存储不需要节点指针,操作也⽐较简单;⽤链表实现就是很常⻅的那种「树」,因为不⼀定是完全⼆叉树,所以不适合⽤数组存储。为此,在这种链表「树」结构之上,⼜衍⽣出各种巧妙的设计,⽐如⼆叉搜索树、AVL树、红⿊树、区间树、B树等等,以应对不同的问题。


前缀树(Prefix Trees 或者 Trie)与树类似,用于处理字符串相关的问题时非常高效。它可以实现快速检索,常用于字典中的单词查询,搜索引擎的自动补全甚至 IP 路由。

前缀树

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

综上,数据结构种类很多,甚⾄你也可以发明⾃⼰的数据结构,但是底层存储⽆⾮数组或者链表,⼆者的优缺点如下:

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

数组

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

链表

第一次在知乎写文章哈,如有不足,敬请指正!

数组是逻辑结构还是存储结构_数据结构之存储方式相关推荐

  1. 假设以邻接矩阵作为图的存储结构_图的存储

    因为图的结构特点,使得其在存储.遍历也相对复杂一些. 邻接矩阵存储图 最简单的方式就是将图的顶点用一维数组存储进来,然后将边信息存储在二维矩阵中,这两个数组合称为图的邻接矩阵(Adjacency Ma ...

  2. 数据结构 二叉树的存储结构_线程二叉树| 数据结构

    数据结构 二叉树的存储结构 线程二叉树 (Threaded Binary Tree ) A binary tree can be represented by using array represen ...

  3. 假设以邻接矩阵作为图的存储结构_学习数据结构第五章:图(图的存储方法)...

    第五章:图(图的存储方法) 1.邻接矩阵法 下面是一个无向图的表示,我们使用一个一维数组存放点集,使用一个二维数组存放边集 二维数组表示边:行号表示其实端点,列号表示结束端点,值表示该边是否存在,以及 ...

  4. html树形结构_数据结构-线性表.md

    数据结构基本概念 相互之间存在一种或多种特定关系的数据元素集合. (ER图:实体关系图) 数据对象中数据元素之间的关系 逻辑结构 1.集合结构 2.线性结构 3.树形结构 4.图形结构 下图:从又到左 ...

  5. access表怎么生成表结构_数据结构——单链表讲解

    单链表 单链表的创建分为头插入法和尾插入法两种,两者并无本质上的不同,都是利用指针指向下一个结点元素的方式进行逐个创建,只不过使用头插入法最终得到的结果是逆序的. 1.单链表概念&设计 单链表 ...

  6. 线性表之链式存储结构_单链表相关算法

    在存储结构上,不需要连续的存储空间,需要上一个结点的指针域 指向下一个结点即可,找到一个结点就可以找到下一个结点. 学习教材是大话数据结构,加上自己的一些个人理解.这个算法 有点绕,需要对指针 相关内 ...

  7. java单链表存储结构_Java数据结构——单链表

    单链式存储线性列表 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的 (图片来自网络,侵删) 存储单元由两部分组成,数据源和指针,数据源 ...

  8. 广义表头尾链表存储结构_单向循环链表的存储结构和操作

    单向循环链表的存储结构 单向循环链表(Circular Linked List)是单向链表的一种扩充,当单向链表带有头结点时,把单向链表中尾结点的指针域由空指针改为头结点的指针(当单向链表不带头结点时 ...

  9. mysql 存储 结构,mysql目录与存储结构(一)

    mysql索引与存储结构(一) 首先从一个问题说起. 问题现象: 查询语句如下: -- sql1 SELECT w.wid, w.rid FROM warestock w JOIN product p ...

最新文章

  1. 珍爱网java高级等通知?_珍爱网独家JAVA开发工程师面试题及流程详解
  2. input 不显示边框_不需要使用JavaScript
  3. c++ websocket客户端_阿里面经WebSocket实时通信
  4. MySQL 高级repeat循环
  5. 收藏的 sql经典语句 ---来自网上
  6. 在Cloudfoundry上部署RESTful服务
  7. axios 是如何封装 HTTP 请求的
  8. 让我们的linux的shell命令待颜色
  9. python之 前端HTML/CSS基础知识学习笔记
  10. iOS入门-公司通讯录项目(教你一步步完成一个公司通讯录)
  11. 网络靶场攻防综合实验
  12. 一文带你玩转 DataStore
  13. Word排版的正确姿势!(Word论文排版教学)
  14. 四十六、Stata离散选择模型,时间序列和面板数据
  15. C语言揭秘二战德军的顶级加解密技术——恩格玛机!
  16. 教授专栏14 | 陈泰元: 提升公司治理之路--高管薪酬追回条款
  17. 123457123457#0#-----com.yuming.ZuiNiuChengYu--前拼后广--最牛成语
  18. 计算机二级考试场次是随机的,计算机二级考试知多少
  19. php实现ctrl+f,Ctrl+F 到底有多好用?这 5 个骚操作,让你变身快捷键达人
  20. 用户的登录及注册功能

热门文章

  1. open wrt 跟换主题_Openwrt编译进阶-修改密码、路由连接数、时区及主题
  2. 一款插件如何让Github变得不一样?
  3. Java 14 Hotspot 虚拟机垃圾回收调优指南!
  4. 通宵加班、猝死频发,但仍建议你不要轻易买保险
  5. 都在说微服务,那么微服务的反模式和陷阱是什么(三)
  6. php读取excel文件_php读取EXCEL文件 php excelreader读取excel文件
  7. mysql 按条件导出数据_mysql命令行按任意查询条件导出指定数据
  8. java grizzly_java grizzly实现http服务器
  9. ajax为什么会全局刷新,为什么发送ajax请求页面也会刷新呢?
  10. pip Not supported proxy scheme None