什么是数据结构

入我之眼,尽是数据结构

Posted by tokenian on October 29, 2021

搞软件的必然知道数据结构,它是程序员解决问题的重要工具,抽象问题模型,表达数据内在逻辑。大学时的老师姓高,是个50多岁的老太婆,我没有恶意,只是对她所代表的教书方式无法认同。

数据结构和数学有很大的关系,而我所接受的教育却没有把二者作平稳的过渡(大学和高中、初中作了完全的割裂),结果就是没有真正的明白。

维基百科对于数据结构的定义很中肯

计算机科学中,数据结构(英语:data structure)是计算机中存储、组织数据的方式。

数据结构意味着接口封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。

大多数数据结构都由数列记录可辨识联合引用等基本类型构成。举例而言,可为空的引用(nullable reference)是引用与可辨识联合的结合体,而最简单的链式结构链表则是由记录与可空引用构成。

数据结构可透过编程语言所提供的数据类型引用及其他操作加以实现。一个设计良好的数据结构,应该在尽可能使用较少的时间与空间资源的前提下,支持各种程序运行。

不同种类的数据结构适合不同种类的应用,部分数据结构甚至是为了解决特定问题而设计出来的。例如B树即为加快树状结构访问速度而设计的数据结构,常被应用在数据库和文件系统上。

正确的数据结构选择可以提高算法的效率(请参考算法效率)。在计算机程序设计的过程中,选择适当的数据结构是一项重要工作。许多大型系统的编写经验显示,程序设计的困难程度与最终成果的质量与表现,取决于是否选择了最适合的数据结构。

常见的数据结构,队列、数组、链表、堆栈、树、图、堆、散列表。程序员会选择适合应用的数据结构处理问题,比如MySql使用B+树作数据存储,MongoDB选择用B树作存储。B+树是B树的变种,为何它们会选择不同的数据结构呢。

MySql常见的面试问题,索引的左前缀规则,顺序扫描,排序优化皆是B+树存储特性导致的。作为NoSql的代表,MongDb的设计与MySql是大相径庭的。它们之间的行为为何会不同?

这里不解答问题,而是对数据结构的一些思考。

数据结构这个词包含两个东西,一个是数据(对应数学里的集合,集合中的元素各不相同),一个是结构(对应数据之间的逻辑)。对集合而言,编程语言里对应的概念是Set。如果集合元素之间可以重复,那就是List。在计算机的内存布局上,如果是顺序存储,就是数组;如果是通过指针关联,不连续存储,则是链表。为何c语言里有字节对齐的概念,比如布尔通常是一个字节,往往会对齐到4个字节。这是因为32的CPU限制的,4个字节正好是32位。

队列和堆栈反映了数据的出入方式不同。树、堆,是树的简化版本。散列表数据存储可以是数组,也可以是链表,它体现的更多是一种逻辑,是数学里的单调发散函数,x=>y,不同的x映射到分散的y空间,越离散越好。

理解了数据结构是数据和逻辑的组合,那么泛化的推广。对一个App而言,用户看到的界面,图像、文字、音乐都可以被视为数据。给用户的操作,按钮,手势,输入框,则可被视为逻辑。App是一种形而上的数据结构,我们开发的后台应用服务也可以这么理解,它暴露的接口提供数据,而内部业务逻辑提供严密的内部生态循环。如果逻辑被破坏了,那么产出的数据就有问题。测试人员检验逻辑,黑客破坏逻辑牟利。

对程序员而言,数据结构可以衍生出很多变种,我们可以根据自己的业务需求去定制自己需要的,不用局限于教科书讲的那几种。不同的应用有自己独到的一面,这就需要程序员的创新能力。谷歌提出的BigTable列式存储是一种新的数据结构,养活了不少公司。

目前国内软件行业开发的大多是工具类应用,购物、娱乐、社交、办公,处理的是和人相关的问题。而美国对我们进行技术压制,禁止国内使用一些专业化软件,比如MATLAB、CAD 、CAE。这些都是工业软件,处理机器、学术相关的问题。这类软件的开发对程序员要求很高,需要掌握很多行业知识,数学、物理、化学。半导体对我们而言,是卡脖子的产业问题,它需要的软件目前国内厂商并不成熟。

在认识数据结构这个概念上,国内的大多数程序员依然停留在书本上,没有切实的思考。请产出你自己的数据结构吧!