什么是数据结构?
数据结构是指数据在计算机系统中的组织和存储方式。数据是能够带给我们信息的数值、文字、图像、视频、符号等内容,数据按照一定的结构组织在一起称为数据的逻辑结构,数据的逻辑结构以何种方式存储到物理空间称为数据的存储结构,数据的逻辑结构和存储结构统称为数据结构。为了更好地理解数据结构,下面我们来看几个例子。例1:使用计算机管理学生信息问题。学生信息包括学号、姓名、籍贯、年龄、年级、班级等数据字段,计算机要能够存储这些数据,并能对这些数据进行增加、删除、修改和查询操作。在计算机中如何组织和存储这些数据呢?既能方便操作,又能节省存储空间,最简单的方式就是将学生信息设计为表结构(见图1-1),每一个学生的信息为表中的一条记录,记录中的单个数据项为学生的数据字段,学生的学号和姓名为关键数据字段。用户可以通过学号或姓名查找某一学生的信息,也可以添加、删除或修改学生的信息。这些操作都是针对表的操作,从而将计算机管理学生信息问题转化为表和对表的增、删、改、查运算。
图1-1学生信息表例2:使用计算机辅助决策贷款申请问题。用于贷款申请辅助决策主要判断申请者的Age(年龄)、HasJob(是否有工作)、OwnHouse(是否有房产)、CreditRating(信贷评级)。Age可能的取值为:young、middle、old;OwnHouse和HasJob可能的取值为:true和false;CreditRating可能的取值为fair、good、excellent。决策过程从Age开始,根据申请者的年龄构成三个不同的决策分支,每个决策分支可以分别根据HasJob、OwnHouse、CreditRating的值进行后续决策,直至决策完成,这样就构成了一棵决策树,从而将计算机辅助决策贷款申请问题转换为决策树模型,以及对决策树模型的查询操作。
图1-2贷款申请决策辅助模型以图1-2贷款申请辅助决策树模型为例,决策程序首先判断申请者的年龄,根据年龄值选择不同的分支,若年龄值为young,再判断申请者是否有工作:若HasJob值为Fasle,再判断申请者是否有住房,若有住房申请通过,否则申请失败;若HasJob值为True,则申请通过。例3:使用计算机解决推销员最短行程问题。推销员需要访问某地区的所有城镇推销商品,最后回到出发点,计算机如何安排推销员的推广路线使总行程最小。若用顶点表示城镇,边表示连接两城镇的路,边上的权重表示距离,于是推销员问题就转化为在加权图中寻找一条经过每个顶点至少一次的最短闭通路问题(见图1-3)。
图1-3某地区城镇加权连通图表示连通城镇之间的交通,边线的权重表示距离。可以判断经过每个顶点至少一次的最短闭通路为:
(V1,V2,v1,V3)
即V1到V2,V2返回到V1,再由V1到V3,边线的权重和为4。
前面的三个案例,程序处理的不再是纯数值数据,而是表、树、图结构化的数据,数据结构就是研究类似表、树、图这样的结构化数据在计算机的存储和运算。
数据结构在计算机科学的地位
世界上第一个程序员是英国著名诗人拜伦的女儿阿达·洛芙莱斯,阿达有非常好的数学天赋,她在翻译数学家费德里科·路易吉关于巴贝奇分析机的《分析机概论》论文时,对论文进行了详尽的注释,并预想到这台机器不仅能执行计算,还能执行运算,可以被运用到音乐、制图和科学研究中。为此它专门设计了一个可以在分析机上运行的程序,用于计算出有理数数列——伯努利数,分析机是最早的计算机模型,它主要用于数值运算。图灵机是英国数学家图灵提出的一个可用于计算的模型,模型由一个控制器、一个读写头和一条无限长的纸带组成。纸带上有用于计算的数字或符号,控制器控制读写头在纸带上移动并读取或修改纸带上的数字或符号。发出读写命令的控制器内部有一个有限状态转换表,状态转换表根据当前状态及从纸带读取的内容来确定下一个状态并控制读写头的移动,状态转换循环往复,直至完成计算。控制器内部的有限状态转换表可以理解为编写的程序,图灵机已经可以处理符号并能够对程序流程进行控制。世界上第一台通用计算机埃尼阿克在年2月的美国宾夕法尼亚大学研制成功,是图灵机的完全再现。埃尼阿克用存储器来存储程序指令和数据,并通过运算器执行程序指令和运算,并使用二进制替代十进制计数,降低了运算电路的复杂度,埃尼阿克是现代计算机的模型,现代计算机一直采用埃尼阿克的计算机结构。现代计算机的应用领域已不再局限于科学计算,更多地应用于控制、管理等非数值处理领域,计算机处理的数据也由数值发展到字符、表格、图形、图像、视频、声音等具有一定结构的数据,运行在计算机上的程序需要对这些非数值数据进行存储和运算,由此诞生了数据结构技术。年唐纳德克努思教授在《计算机程序设计艺术》一书中,首次提出了算法及数据结构的概念。70年代初,数据结构作为一门独立的课程开始进入大学课堂,采用的教学语言有Pascal、Java、C、C++等编程语言。《数据结构》在计算机科学中是一门综合性的专业基础课,它主要研究非数值性程序设计中数据的物理存储和逻辑结构,以及它们之间的关系和运算。它是一般程序设计的基础,也是操作系统、编译程序、数据库系统及其它大型应用程序的设计基础。