数据结构学习之路
写在前面
因为是新的学期,要学习这门听起来很难的这门让人头秃的数据结构了,所以想着借以SCDN这个强大的平台,来记录自己的学习历程,或许,你也和我一样正在学习这门课,希望你看到我的文章时,也能对你有所帮助吧。(顺便说明,本人比较懒,不定时更新哈)
这篇先来讲讲什么是数据结构吧。
要学习数据结构,首先当然的了解它是什么,有什么用途?先给出我load下来的官方词条解释:
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
看到这一段话,好像也不是很明白,但大概知道了,可能他就是解决某个问题的某个特定的模式?差不多,在这里我们更多的把它称作是计算机存储数据的形式。如何理解呢?就像是C语言的我们自己写的结构体、C++里我们自定义的类(后面会统一用抽象数据结构,也就是ADT进行描述)。其中,最基础的包含些什么,他又要研究些什么呢?
首先需要知道这样几个概念:
数据、数据元素、结点、数据项、数据对象
数据类型是一组性质相同的值集合以及定义在这个值集合上的一组操作的总称。数据类型中定义了两个集合,即该类型的取值范围,以及该类型中可允许使用的一组运算。
高级语言又将数据类型分为了两大类:
原子类型其值不可分解。
结构类型其值由若干成分按某种结构组成,可分解,并且它的成分可以是非结构的,也可以是结构的。
如计算机中使用的二进制,在汇编语言中则可以给出各种数据的十进制表示,他们就是二进制数据的抽象。在高级语言中,则给出更高一级的数据抽象,出现了数据类型, 如整型、 实型、字符型等。到抽象数据类型出现,可以 可以这样看,高级语言中提供整型、实型、字符、记录、文件、指针等多种数据类型,可以利用这些类型构造出像栈、队列、树、图等复杂的抽象数据类型。 进一步定义更高级的数据抽象,如各种表、队、栈、树、图、窗口、管理器等。
是指基于一类逻辑关系的数据类型以及定义在这个类型之上的一组操作一个ADT定义了一个数据对象,数据对象中各元素间的结构关系,以及一组处理数据的操作。
抽象数据类型可用三元组表示ADT=(D,S,P)
D是数据对象,用结点的有限集合表示;
S是D上的关系的集合,用结点间的序偶的集合来表示;
P是对D的基本操作的集合。
ADT包括定义和实现两方面, 其中定义是独立于实现的。 定义仅给出一个ADT的逻辑特性,不必考虑如何在计算机中实现。抽象数据类型的特征是使用与实现分离, 实现封装和信息隐蔽,也就是说,在抽象数据类型设计时, 类型的定义与其实现分离。
ADT的表现与实现
ADT基本操作的定义
ADT基本操作:通常包含插入、删除、更新、查找、排序…(在之后的内容将详细应用,这里不做过多介绍)
抽象数据类型的实现
此后我将主要用用标准C语言(或C++)表示和实现ADT描述
这部分呢,可以理解为就是我们对数据元素之间的关系的抽象理解与描述。通常描述为一个二元组的形式:
Data_Structure=(D,R)
其中D是数据元素的有限集,R是D上关系的有限集。
我们对逻辑结构进行了以下分类:
存储结构(又称物理结构)是逻辑结构在计算机中的存储映象,是逻辑结构在计算机中的实现,它包括数据元素的表示和关系的表示(两部分内容,缺一不可)。
也就是说,你脑子里面有了这个逻辑结构了,你总得把他存到你的计算机里是不,计算机当然不知道你在描述什么,因此,你得先将这些数据存储到存储空间单元里(这里是建立一从D的数据元素到存储空间M单元的映象S),然后你还得告诉计算机,你存的这些个数据,他们有些什么关系( 即对于每一个d,d∈D, 都有唯一的z∈M,使S(D)=Z, 同时这个映象必须明显或隐含地体现关系R。)
因此,逻辑结构与存储结构的关系为:存储结构是逻辑关系的映象与元素本身的映象。
结构是数据结构的实现,两者综合起来建立了数据元素之间的结逻辑结构是数据结构的抽象,存储构关系。
存储结构又分为了两大类:
顺序印象(顺序存储结构)
用一组地址连续的存储单元依次存放数据元素,数据元素之间的逻辑关系通过元素的地址直接反映。
非顺序印象(非顺序存储结构,链式存储结构)
用一组地址任意的存储单元依次存放数据元素,数据元素之间的逻辑关系通过指针间接地反映。
算法理解为,更像是规则的有限集合, 是为解决特定问题而规定的一系列操作。他有这样的五个特性:
算法与程序的区别可以这样理解:
在数据结构这门课这里算法就是对数据的表示的相关的一系列的操作。
算法描述的工具:
条列式的步骤: 以条列式的步骤来描述解决问题的方法。
流程图(Flow Chart):用图形符号描述解决问题的方法。
伪代码(Pseudo Code):以夹杂程序语法和自然语言的形来描述解决问题的方法。
程序语句:直接以程序语法来描述解决问题的方法。
类C语言
算法的评价:
这里我们主要关心算法的时间复杂度和空间复杂度。(需要理解什么是原操作、语句频度,这里不做详细介绍了)
------《第一篇 数据结构初见面》
部分图片及文字来自转载