当前位置:文档之家› 数据结构课程总结——第一章绪论

数据结构课程总结——第一章绪论

第一章——绪论前言(为什么会有数据结构这门课)计算机主要应用在两个方面:一个是数值计算,另一个是非数值计算。

早期的计算机只能处理数值计算(也就是数学上的运算,特点是计算过程复杂,数据类型相对简单,数据量较少),这时候人们主要通过程序设计的思想来处理处理问题。

随着计算机渗入生活,人们开始要求计算机参与处理非数值计算(特点是计算过程相对简单,数据结构相对复杂,数据的组织排列结构从某种意义上决定着非数据计算应用的有效性,数据的组织排列结构成为处理和解决数据处理问题的核心),这时候原来的程序设计以程序为中心的设计过程已经无法满足大量的非数值计算。

急需一门以复杂数据为中心,研究数据的合理组织形式,并设计出基于合理数据组织结构下的高效程序的科学来指导计算机的发展。

数据结构就是在这种环境下诞生的。

每种数据结构类型都分四个描述层次——概念层、逻辑层、存储层、运算实现层。

而数据结构往往在逻辑层上为程序抽象出算法,并对算法进行优化。

最终推出较优的指导性算法,方便后续的具体程序设计。

什么是数据结构数据结构是随着计算机科学的发展而建立起来的围绕非数值计算问题的一门科学。

准确来说,数据结构就是研究大量数据在计算机中存储的组织形式,并定义且实现对数据相应的高效运算,以提高计算机的数据处理能力的一门科学。

这里的运算主要指的是非公式化的运算,如数据存取、插入、删除、查找、排序和遍历等运算。

也就是说,数据结构是管信息管理和存储的,研究怎么存比较好,怎么管理相对比较优化。

而这里就涉及到一个问题:信息应该怎么表示,根据程序设计中介绍的思路,要在电脑中写入一个数据,应该包括它的属性和它的位置。

只要有他的位置和属性都确定了,那这个数据就完整地被存储到计算机中了。

所以,信息是由信息元素的值及信息元素之间的相互关系(逻辑顺序)和信息元素在计算机中的存储方式(物理顺序)共同组成。

逻辑结构就是代表了信息本身的属性,他是与计算机本身无关的“逻辑组织结构”它的构成是由数据的值、数据与数据之间的关联方式两个部分组成。

而存储方式则是代表他在计算机的位置,是将具有逻辑组织结构的数据在计算机的存储介质上如何存放的“物理组织结构”。

做好了逻辑和储存两方面的处理,信息才真正变成了计算机中的一个数据。

同时,根据定义,另一个问题无法忽视,什么高效运算?在我看来,高效运算指的就是算法的优化。

因为算法不仅要实现问题的要求,而且,应该是高效地完成。

低效的算法无法满足用户的需求或根本不能运用于实际。

低效的处理算法设计的程序即使运用高速运算的计算机也可能不能满足用户的处理要求。

数据结构的相关概念信息和数据的区别在哪?信息的意义更加广泛,他包括了现实中客观事物的数据集合,而数据则是单单指信息以某一特定符号表示的形式,是计算机加工的对象。

也就是说,数据是信息的特有形式,这种形式是为计算机服务的。

什么是数据元素?数据元素是数据集合中的个体,是数据组成的基本单位。

(强调的是抽象上的不可再分的最小性,并不一定指某一项,这与马克思眼中抽象的基本粒子的概念有点相似)数据结构中结构有两种:逻辑结构和物理结构1.逻辑结构(线性与非线性)逻辑结构描述数据元素与数据元素之间的关联方式,简称为关系,表示的是事物本身的内在联系。

(定义非常好了,一个关系就能说明内涵了。

这种抽象的逻辑结构,可以理解成计算机纪录我们的人际网络等方面的一个结构就好)其中的线性结构就包括线性表,堆栈和队列等,他们的共同特点是只能有一个直接前驱元素和一个直接后继元素。

所以他们元素之间的正逆关系都是“一对一”的。

关于非线性结构,这个就比较复杂了,我们的生活往往都是由非线性结构形成的。

如树形结构,图状或网状结构。

你想想你的家族族谱是不是一个树形结构?你的人际网络是不是图状的?不敢想象一个只存在线性结构的世界是怎么样的。

在这种非线性结构中,数据元素不一定存在确定的前后次序,甚至是无序的,数据元素之间存在从属、或互为从属、或离散关系。

如树型结构中,数据元素之间存在着“一对多”的从属关系。

图或网状结构中,数据元素之间存在着“多对多”的互为从属关系。

在纯集合结构中,数据元素具有“同属于一个集合”的关系。

2.物理结构定义:也称为存储结构,是逻辑结构的数据元素在计算机的物理存储空间上地映象(存储),映象不仅包含数据元素本身,而且包含着数据元素之间的关联方式,即关系的映象。

(这个定义用了什么映像,我觉得太麻烦了。

我只能直接上我自己的理解。

在我看来,存储结构就是你前面说的逻辑结构中抽象上的关系和信息本身的内容,要存在计算机中,到底应该怎么存。

怎么存才能反映出你本身的内容和原来那种关系,这种关系在计算机物理存储空间上的体现就是存储结构,也可以叫做映象(存储))映象可以分为:顺序映象和非顺序映象。

也可以叫作顺序存储和非顺序存储。

顺序存储:是指数据元素在一块连续地物理存储空间上存储,物理存储空间只用于存放数据元素值本身。

这里的顺序是空间的连续,这种存储方式直接把两个元素的关系(逻辑结构)体现在它们的相对位置关系上。

非顺序存储:是指数据元素在物理存储空间上非连续地存储,物理存储空间不仅存放数据元素本身,而且为实现数据元素之间的关联(逻辑结构),在每个数据元素存储的相邻空间中存储该数据元素关联的另一个或多个数据元素的起始地址。

用非顺序存储,数据元素之间就不一定在物理空间上相邻了,他们的逻辑关系也不再体现在物理的相邻上了,而是体现在“指针和链接”上。

这样,数据元素的逻辑结构不再被顺序的物理结构所局限,通过链表的结构,非线性结构得以被计算机存储。

3.一个数据元素应包含的区域1、数据域数据域是物理存储空间中存储数据元素中数据值的空间。

所占用的空间大小(字节数)依实际应用的数据元素中包含的信息量的大小而定。

(就是放除了关系之外的那些内在的属性的地方,如一个人的姓名等)2、链接域链接域又称指针域,是非顺序存储映象时表示数据元素之间关系的地址存储空间,是额外的空间付出。

所占用的空间大小(字节数)一般地与特定计算机的地址表示有关。

(说白了就是放地址的地方,在顺序存储结构中,物理上的相邻就已经反映了逻辑结构,也不需要指针指向下一个或者上一个指针了,自然也不存在链接域了。

)4. 存储空间分配问题怎么分配存储空间,对于顺序存储和非顺序存储,我们应该进行不一样的对待。

对于顺序存储,我们采用静态存储空间分配和释放的方法:一次性获取足够的物理存储结构,用完一次性释放。

对于非顺序存储,我们采用动态存储空间的分配和释放方法:用多少分配多少,用和存同时进行(C++中用new函数分配空间)。

释放时某个数据元素空间不使用时,立即释放。

(在C++中要用delete释放空间,C++不会主动释放空间,如果你不释放,就是在制造蠕虫病毒!!!!)5.数据类型、抽象数据类型和数据结构1.数据类型数据类型具体含义是,它描述了一组数据和在这组数据上的操作或运算及其操作或运算的接口。

2.抽象数据类型抽象数据类型是指不涉及数据值的具体表示,只涉及数据值的值域,操作或运算与具体实现无关,只描述操作或运算所满足的抽象性质的数据类型和接口。

6.算法及算法分析、算法描述定义:算法是非空的、有限的指令序列,遵循它就可以完成某一确定的任务。

在我看来,由于一个算法解决一个问题,那么他就是函数的一种非语言抽象化的表述。

而计算机运行的程序,则是一个或者多个算法具体化语言化的产物。

但程序与算法是有区别的,他们二者是一个多对一的关系。

多个程序对应同一算法,一个算法可以通过多种语言来实现。

另外,算法必须可终止,但程序不一定,程序可以在无外力的作用下一直执行下去,且可以无输入和输出。

算法必须要在具体运行细节上进行修饰才能转化成程序。

为了进一步区分程序和算法的区别,以下列出算法的五大特点:1、有穷性(不是死循环)2、确定性3、可行性(算法可行,指在计算机的运行速度的范围内运算,如果要运行个十多二十年,那么这个算法也就没有可行的意义了)4、有输入5、有输出7.程序性能一个程序的性能的好坏,主要取决于运行这个程序的时间长短和空间占用程度。

空间复杂性(空间占用程度)数据的空间复杂性包括指令空间,数据空间和环境栈空间。

指令空间就是那个编译后的文件大小,一般来说,这个无需担心。

而数据空间和环境栈空间才是影响一个程序性能的关键。

对于数据空间来说,数据元素值占用的空间是考量重点,数据元素值太多,会严重占用内存,造成程序运行的缓慢,甚至死机。

而环境栈空间中返回地址、局部变量的值、参数的值越多,调用或递归的层次越深,所需有环境栈空间就越大,就越容易耗尽环境栈空间,造成性能下降。

其中尤其以递归函数的影响最严重。

当然,这一部分的空间是可变部分,只要合理安排好递归的结构,尽量错开同时运行的时间,就可以有效降低对栈空间的消耗。

注:环境栈用来保存函数调用和返回时需要的信息的。

由于程序是由算法发展而来的。

程序性能的好坏,本质上就是反应原算法的效率问题。

时间复杂性(时间的长短)根据课本所述,程序在计算机上运算所消耗的时间主要取决于下述因素:程序运行时所需要输入的数据总量消耗的时间。

对源程序进行编译所需要的时间。

计算机执行每条机器指令所需要的时间。

程序中关键指令重复执行的次数。

前三条都是和计算机硬件相关的问题,对总的时间影响不大且不是数据结构主要要讨论的问题。

但第四个程序中关键指令重复执行的次数,对程序性能的影响常常是指数级别的。

一个优良的算法指导下写出的程序和一个普通代码指导下写出的程序,最后的时间可能天壤之别。

具体来说,时间复杂性大致上可以从两个方面估算:一是关键操作,特别是关键的循环、递归结构;二是关键步骤的执行次数,二者最终决定了时间的长短。

附:典型的复杂性函数的表示(a,b,c为已知数):常数函数:O(g(n))= O(9+12)= O(1)线性函数:O(g(n))= O(a*n+b) =O(n)对数函数:O(g(n))= O((a*n*log2n +b*n)= O(n*log2n)平方函数:O(g(n))= O(a*n2+b*n)= O(n2)指数函数:O(g(n))= O(an + b*n2+c*n)=O(an)常数函数是指算法的复杂性与算法中处理数据对象的数量(规模)无关。

相关主题