Post
理解数据结构分类与二进制编码原理
数据结构分类与基本数据类型的二进制存储机制
概述
本文围绕计算机科学中两类核心数据结构(线性与非线性)的分类实现,以及基本数据类型的二进制存储规则展开。重点解析数据结构的底层实现基础,以及计算机如何通过原码、反码、补码等编码方式存储数值型数据。
数据结构分类与实现基础
线性数据结构
线性结构以线性方式组织数据元素,其特点是元素间存在一对一的邻接关系。主要类型包括:
- 数组:通过连续内存存储元素,支持随机访问,但长度固定
- 链表:由节点组成,每个节点包含数据和指向下一个节点的指针,支持动态扩展
- 栈:遵循先进后出(LIFO)原则,常用于括号匹配、递归等场景
- 队列:遵循先进先出(FIFO)原则,适用于任务调度等场景
- 哈希表:通过哈希函数实现键值对存储,支持快速查找(一对一映射)
这些结构可通过数组或链表实现。例如:
- 数组可实现栈(通过指针控制边界)、队列(通过首尾指针控制)、哈希表(通过数组存储键值对)
- 链表可实现树(节点包含子节点指针)、图(邻接表存储边关系)
非线性数据结构
非线性结构中元素间存在多对多或一对多的关联关系,主要类型包括:
- 树:层次化结构,每个节点最多有一个父节点,如二叉搜索树、B树
- 堆:满足父节点与子节点特定关系的树形结构,常用于优先队列(最大堆/最小堆)
- 图:由节点和边构成,支持任意复杂关系表示,如邻接矩阵或邻接表存储
- 哈希表(非线性场景):在存储多值映射时,可能采用链地址法等非线性扩展方式
需注意:原始笔记中对哈希表的分类存在矛盾——线性结构中描述为"一对一",非线性结构中描述为"一对多",这可能源于不同实现方式的差异。
基本数据类型的二进制存储
存储基础
现代计算机以二进制形式存储数据,基本数据类型是CPU可直接运算的类型,主要包括:
- 整数类型:byte(8位)、short(16位)、int(32位)、long(64位)
- 浮点数类型:float(32位)、double(64位)
- 字符类型:char(通常16位,支持Unicode)
- 布尔类型:bool(通常用1位表示)
1字节(byte)由8位(bit)组成,存储时需考虑符号位和数值位的分配。
编码规则
计算机通过三种编码方式表示有符号整数:
-
原码
最高位为符号位(0正1负),其余位表示数值。例如:
+5 → 0 0000101
-5 → 1 0000101 -
反码
正数反码与原码相同,负数反码是对原码除符号位外的所有位取反。例如:
-5 → 1 1111010 -
补码
正数补码与原码相同,负数补码是反码基础上加1。例如:
-5 → 1 1111011
补码是现代计算机中最常用的表示方式,解决了原码和反码中+0与-0的冗余问题,并简化了加减法运算。
注意:原始笔记中未明确说明浮点数的存储规则,此处仅讨论整数类型的编码方式。
实现边界说明
-
数据结构实现
所有数据结构最终都基于数组或链表实现,但具体选择取决于场景需求。例如:- 需要频繁随机访问时优先选数组
- 需要动态扩展时优先选链表
-
编码规则适用性
原码、反码、补码规则适用于整数类型,浮点数采用IEEE 754标准(原始笔记未涉及)。不同编程语言对基本数据类型的存储可能略有差异,需参考具体语言规范。 -
存储单位差异
不同操作系统对字节的定义可能存在差异(如某些嵌入式系统中1字节为4位),但现代主流系统均采用8位/字节标准。