前言
数据结构,一门数据处理的艺术,精巧的结构在一个又一个算法下发挥着他们无与伦比的高效和精密之美,在为信息技术打下坚实地基的同时,也令无数开发者和探索者为之着迷。
也因如此,它作为博主大二上学期最重要的必修课出现了。由于大家对于上学期C++系列博文的支持,我打算将这门课的笔记也写作系列博文,既用于整理、消化,也用于同各位交流、展示数据结构的美。
此系列文章,将会分成两条主线,一条“数据结构基础”,一条“数据结构拓展”。“数据结构基础”主要以记录课上内容为主,“拓展”则是以课上内容为基础的更加高深的数据结构或相关应用知识。
欢迎关注博主,一起交流、学习、进步,往期的文章将会放在文末。
在生活中,我们经常会遇到一类问题,这类问题总是包含着这样的元素
- 有若干的任务需要完成
- 要完成一项任务总要先完成一系列的前置任务
- 有一个或多个任务没有任何前置任务
常见的,大学课程的修习就遵循这这样一种规则。一些科目的学习需要一些前置科目,例如数据结构就需要先学习程序设计和离散数学。
在培养计划中随手挑选出几门课程,他们就能够构成如下的结构
另外,在工程项目上,这样的结构也不在少数。一些工作需要依赖另一些前置工作的完成,也有些工作不需要任何前置工作就能启动。
我们用教材上的图作为例子:
(确实,教材上的图比自己画的好看…)
拓扑排序与AOV网络
上文中讨论的有向图结构,一个顶点表示一项活动或任务,有向边表示行动之间的前后关系。
这样的图,被我们称作AOV网络,英文全称是: A c t i v i t y O n V e r t e x N e t w o r k Activity\ On\ Vertex\ Network Activity On Vertex Network
将问题抽象成为这种结构之后,自然而然的就会产生一种需求,那就是科目应该按照什么顺序学习,或者工程中的各项活动应该按照什么顺序进行,即获得一个顶点序列,使其中的每个顶点,其前驱结点都在序列前面出现过。
计算这个序列的过程,就是所谓的拓扑排序( T o p o l o g i c a l s o r t i n g Topological\ sorting Topological sort