一、数据结构
在老一些的程序员中,可能都听说过,程序其实就是数据结构+算法这种说法。它是由尼克劳斯·维特在其著作《算法+数据结构=程序》中提出的,然后在一段时期内这种说法非常流行。这里不谈论其是否正确,只是通过这种提法,大家就可以看出数据结构的重要性。
在计算机科学中,数据结构是一种组织、管理和存储数据的方式,使得数据可以高效地访问和修改。更确切地说,数据结构是数据值的集合,表示数据之间的关系,以及应用于数据的函数或操作。
二、数据结构的作用
在程序开发的过程中,往往会遇到一些规律性数据,这和前面讨论设计模式中有些类似。处理这些规律性的数据而形成的数据处理和存储方式,可以被抽象出来让所有的程序公用,这种整体的管理规律性数据的过程形成的抽象数据集合,就可以认为是数据结构的雏形。当这种形式被公认、抽象并结构化后定义后,就形成了数据结构。如同数学中的一些定理,可以在某些范围内适用。
当这种不同的规律性数据处理被抽象的数据集合越来越多,就可以发现在程序开发过程中流程变得更清晰、数据管理更方便,这就是数据结构的作用。数据结构就是为了让数据的管理更加规范化并提高数据处理的效率。
三、常见的数据结构
大家基本都学习过数据结构,即使是跨界转过来的开发者,多少也学习过数据结构。所以这里就不再详细阐述各种数据结构了,只简单的综述一下即可,重点是整体上说明数据结构的层次。
1、线性数据结构
在现实世界中,大家经常可以遇到的这样一种数据,它重复很多遍,但内容基本雷同。比如排列好的一箱、两箱、三箱...苹果,类似的数据描述非常多,而这种数据有一个明显的特点就是单纯的线性表示,或者干脆说就是字面意思上的线性的排列。这种数据结构在日常生活中经常遇到,象排名、排队等等。换句话说,掌握了线性数据结构,对日常生活中的数据处理,就有了一个适当抽象。
这种数据结构在C++中常见的就是数组、链表以及队列等。
2、集合类型的数据结构
同样,在现实世界中,有些数据是没有规律也没有顺序的,比如花园里有很多种花,高的低的,大的小的,红的白的,而集合类的数据结构就可以应用在这种场景上。比如花的集合,就可以把整个花园中的花都描述出来。集合这种数据类型,可以当作是对复杂数据类型的一种处理方式。
集合,宏观和微观的理解有些许的不同,广义上凡是能将一组数据表示的数据结构都可以称为集合,如vector、array、list等,而狭义的集合则是指set这种数据结构。
3、树形的数据结构
之所以叫做树这种数据结构,主要是它确实是象树,就和象形文字一样,树就是一种在分叉的基础上再分叉的一种递归的行为。虽然从理论上讲这种数据结构可以递归到无穷,但实际大家都明白,无论是现实世界还是计算机世界,递归都是要有终点的。
树这种数据结构一般在STL中基本无法直接访问,主要是做为一些数据结构做为底层支撑,如map、set等。当然,一些开源的框架或自己封装的可能会有这种树的数据结构。
4、图形的数据结构
现实世界有树,也有另外一种更复杂的情况,比如城市的道路、飞机的航线,这些都是图的一种实际例子。图是是一种很复杂的数据结构,一般来说,开发者直接应用到图的可能性很小,一般都是局限于一些具体的场景,如GIS、复杂数据计算等。图形象上来说,可以简单理解为大家常见的网状结构。
树其实就是图,只不过它是图的一种特例;而图可以拆解出N个树。树通过加或结节的扩展形成图,而图可以通过某种算法获取出树。
5、其它
比如组合的数据类型,或新创建的一些数据类型,比如跳表等。当然,随着技术的进步,数据结构一定会有发展的情况,也会出现一些新的数据结构,大家要注意跟踪最新的技术前沿的相关动态。
四、数据结构的意义
数据结构的意义就在于让数据管理的抽象能够更普适于最大多数的应用场景,进而在此基础上衍生出更多的设计、思想和工程实践的应用。数据结构是通往计算机编程的一个必经之路,是连通现实世界与计算机世界的桥梁。
五、总结
数据结构本质就是对数据处理的一种抽象,它做到了相对上整体的最优。即无论从访问、操作和存储都达到了一个最佳的平衡。它既是一种数据意义上的建模也是一种解决问题的思维范式,不但满足了数据处理本身的功能又可以为系统设计和工程实现提供了模式化的解决方案。
要想做一个优秀的程序员和架构师,数据结构是绕不过去的。要想学好算法,数据结构更是基础。