1 - 数据结构
数据结构: 类型、分类与应用
数据结构是计算机在内存种用于组织数据的集成块。它在高效地组织、处理、访问、存储数据时十分重要。但这不是数据结构的全部。不同类型的数据结构具有它们自己的特点、特性、应用、优点与缺点。因此,如何基于自己的任务选择最优的数据结构,这个数据结构意味着什么,有哪些数据结构,这些数据结构能用来做什么,了解上面的几个问题是十分重要的。
什么是数据结构
一个数据结构是用来存储、组织数据的存储结构。它是计算机组织数据的一种方式,以保证计算机能够高效访问、更新数据。如果数据需要进行处理、更新、存储,那么它就不再仅限于访问、更新数据这样的组织形式了。有几类基础的先进的数据结构类型,可以用到几乎所有的程序或软件系统中。
数据结构与数据类型
我们已经知道数据结构的一些信息了,有时候我们会对数据结构与编程语言中的数据类型产生混淆,这里我们给到这两类内容的区别:
数据类型 | 数据结构 |
---|---|
指派给变量的类型 | 不同数据的集合 |
具有值,信息密度低 | 单个对象具有多种类型的数据,信息密度高 |
不具有时间复杂度 | 时间复杂度扮演着重要的角色 |
int 、float 、double 等 |
栈、队列、树 |
数据结构分类
在我们日常生活中就具有很多的数据结构的使用案例。且为了解决不同的数学、逻辑问题,使用了不同的数据类型。通过使用合理的数据结构,我们可以短时间组织、处理大量的数据,下面,让我们看一下我们日常使用的数据结构类型吧。
-
线性数据结构:
数据以顺序或线性形式组织,每一个元素连接到它的前一个与后一个毗邻元素,比如数组、栈、队列、链表等。
-
静态数据结构
静态数据结构具有固定的内存大小,易于访问,比如数组
-
动态数据结构
动态数据结构的内存大小是不固定的,大小可以在运行时按需分配,比如队列、栈等
-
-
非线性数据结构:
数据结构不以顺序或线性形式组织,在非线性数据结构中,我们不能够靠单个路径编历所有元素,比如树、图
数组
数组是线性数据结构,它具有连续的内存空间。用来将相同数据类型的数据存储到一起。它允许以较短的时间内处理大量数据。数组中的第一个元素的索引为 0
,对数据具有不同的操作,比如,查找、排序、插入、编历、反转、删除等。
数组特性:
- 数组是一类基于索引的数据结构,使用索引可以快速定位到数组中的参数
- 如果用户想要存储大量相同类型的数据,那么数组是一个不错的方式
- 数组支持二维数组
- 数组可以用来实现栈、队列、堆、散列表等
- 查找过程实现十分简单
数组应用:
- 解决矩阵问题
- 数据库记录
- 实现排序算法
- 用来实现其他数据结构,如栈、队列、堆、散列表等
- 用作
CPU
调度 - 计算机中查表
- 用在语言处理中
现实生活中的数据应用:
- 存储数值计算数据
- 用作图像处理
- 用作记录管理
- 书页是现实生活中的数组
链表
链表是线性数据结构,链表数据不存储在连续的存储空间中,在链表中的元数通过指针连接到一起。
链表的类型:
- 单向链表
- 双向链表
- 循环链表
- 双向循环链表
链表特性:
- 链表使用额外的空间存储链信息
- 初始化链表时,无需知道全局需要的链空间大小
- 链表可以用来实现栈、队列、图等
- 链表的第一个节点称为头节点
- 尾节点通常指向
NULL
- 链表可以轻松实现插入与删除
- 每一个节点包含指针指向下一个节点
- 链表可以收缩或扩张
链表应用:
- 可用于实现栈、队列、图等
- 可以用作长整型数值计算
- 可以用于表示稀疏矩阵
- 连接文件分配
- 帮助内存管理
- 通过存储常量到节点,实现多项式操作
现实生活中的应用:
- 用作轮询调度算法
- 用作照片浏览器,可以使用上一个、下一个来对照片进行切换
- 在音乐播放器中,歌曲链接着上一首歌与下一首歌
栈
栈式一个线性数据结构,遵循后进先出规则。
栈特性:
- 在很多算法中用到,比如汉诺塔、树编历、递归等
- 栈可以使用数组或链表实现
- 遵循后进先出
- 插入与删除只能在栈顶进行
栈应用:
- 用于算术表达式中
- 用于递归
- 用于括号检查
- 反转字符串
- 用于内存管理
- 处理函数调用
现实生活中的应用:
- 浏览器使用栈数据结构来保持对前一个浏览站点的记录
- 电话记录使用栈结构
队列
队列是一个线性数据结构,遵循先进先出规则。
队列特性:
- 先进先出
- 对里是相似数据类型的顺序列表
队列应用:
- 处理网站流量
- 持有媒体播放器的播放列表
- 队列用在操作系统或中断处理中
- 它帮助管理共享资源,比如打印机、
CPU
任务调度等 - 同步数据传输,比如管道、文件
IO
,套接字等
现实生活中的应用:
- 排队买票
树
树是非线性数据结构,树中的数据像树一样组织。在树种,最高的节点称为根节点,每一个节点包含一些数据,这个数据可以是任何类型。它包含中心节点,结构节点,子节点,节点之间通过边连接。不同的树数据结构允许快速简便的访问数据。树具有不同的术语比如,节点、根节点、边、树高度、树的层级等。
树特性:
- 树是一类递归数据类型
- 树的高度可由根节点到叶子节点的最长路径确定
- 节点具有深度,根节点深度为
0
树应用:
- 堆是一个使用数组实现的树结构,并以此来实现优先队列
B-Tree
与B+Tree
在数据库中实现索引- 语法树帮助编译器设计中,帮助进行扫描、戒心生成代码
K-D Tree
空间分隔树,在K
维空间中组织点- 生成树在计算机网络的路由器中使用
现实生活中的应用:
- 游戏开发
- 决策树是高效的机器学习工具,通常用在决策分析
- 树帮助实现流程图
- 域名服务器使用树数据结构
- 社交网络中最常使用树结构
图
图是非线性数据结构,由顶点与边构成。一个图由有限的顶点与有限的边组成。图用来解决最具有挑战性与罪复杂的编程问题。图具有不同的术语,路径、度、毗邻顶点等。
图特性:
- 一个顶点的偏心率为距所有顶点的最远点
- 具有最小偏心率的顶点视为图的中心点
- 所有顶点的偏心率最小值是图的半径
图应用:
- 用于表示计算流
- 用作建模图
- 操作系统使用资源分配图
- 在万维网中,网页呈现节点
现实生活中的应用:
- 谷歌地图中城市坐落为顶点,城市间的路作为边
- 社交网络中,每一个在网络上的人是一个顶点,所有的好友关系作为边