04-从现实问题到数据结构
从现实问题到数据结构
数据结构不是凭空发明的一堆容器名字。它是对现实问题的分析、抽象的产物:先有现实中的事物和关系,抽出共同结构,才落成数据结构。而且数据结构不止一种——领域数据(业务对象)、通用结构(Core)、平台数据(Infrastructure)是三类完全不同的东西,各有各的来源和用途。
一、数据结构从哪里来
教材常按容器讲:数组、链表、栈、队列、树、图、哈希表……好像它们是独立存在的知识。
但它们其实是从现实问题里长出来的。每个数据结构背后都有一个现实场景在逼它出现:
1 | 现实问题 抽象出来 数据结构 |
关键一步是抽象:把现实问题里的具体人、盘子、学号抹掉,只留下「顺序」「先来后到」「层级」「连通」这些结构关系。
数据结构 = 对现实问题分析抽象后得到的结构关系。
二、领域数据:业务对象是数据结构的第一类
数据结构真正落到程序里,第一类不是数组链表,而是领域数据(Domain)——它描述业务对象。
比如调试器里的领域对象:
1 | Process 进程 |
比如:
1 | struct ProcessInfo { |
这个 ProcessInfo 是对现实中「进程」的分析抽象:进程有什么属性(pid、名字、基址)?谁需要它(进程列表功能)?它和别的对象什么关系(一个进程有多个线程)?
领域数据 = 从现实业务问题分析抽象出来的对象。 它是数据结构的「领域层」。
三、通用结构:Core——与业务无关的容器
第二类是通用数据结构(Core),与业务无关:
1 | Vector List Queue Stack |
1 | template<class T> |
它可以在网络、日志、音频、游戏、调试器里用——没有任何业务含义。
这两类的来源完全不同:
1 | Domain 数据 ← 从「这个业务领域」分析抽象(调试器→进程/断点) |
Domain 回答「这个世界有什么对象」,Core 回答「这些对象用什么容器组织」。
四、基础设施数据:Infrastructure——平台资源也是数据结构
第三类常被忽略——平台数据(Infrastructure):
1 | SocketHandle sockaddr_in OVERLAPPED |
1 | struct SocketContext { |
这不是业务对象(不是领域数据),也不是通用容器(不是 Core),它描述的是平台资源:操作系统/驱动/文件格式给程序的东西。
五、三类数据一览
1 | Data |
放错层的典型症状:
1 | ❌ 把 Platform 结构丢进 Domain |
六、数据结构、算法、接口是同一个抽象过程的三面
「功能 = 算法 + 数据结构 + 接口」里的三者,其实来自同一个分析抽象过程:
1 | 现实问题 |
而且数据、算法、接口三类各自都有同样的分层:
| 类型 | Domain | Core | Infrastructure |
|---|---|---|---|
| 数据 | ProcessInfo、Breakpoint | Vector、HashMap | SocketContext、PEHeader |
| 算法 | 内存扫描、断点管理 | 排序、搜索、图算法 | PE 解析、协议解析 |
| 接口 | IProcessService | IContainer | IProcess、INetwork |
Domain 并不是「所有数据结构的目录」,而是「业务数据结构的目录」——这一点和领域模型、领域对象分析两条线直接相关。
七、和其他线的关系
1 | 数据结构 ←→ 领域模型(本系列另一条线) |
收束
1 | 数据结构不是容器清单,是从现实问题分析抽象出来的 |
先有现实问题的分析,才有数据结构。 理解「数据从哪来、属于哪一层」,比背下所有容器名字更重要。
