《数据结构》系列笔记|附扫描手写笔记 1.0开篇-数据结构在学什么?
~~后面作者会在2025.5.26 00:00前(博主最守时啦)
还会整理出讲解和思维导图大家放心,主页还有其他博文欢迎参考 关注博主 高效学习~~
各位同学大家好,从这个小节开始,我们会正式进入数据结构这门课的正课内容,先来看第一章绪论部分。绪论这个章节其实并不是四零八大纲当中要求掌握的章节。
只不过对绪论这个章节的学习能够帮助大家搭起一个学习的思维框架。学完绪论之后,大家就会知道之后各个具体的数据结构应该用什么样的思路,什么样的方法来学习好,那这个小节中我们会首先介绍一些数据结构相关的基本概念。
我们会把一些相互之间关联性比较强的概念放在一起,帮助大家理解。另外,我们还会介绍数据结构的三要素,也就是说在学习各种数据结构的时候。
大家需要关注的三个方面的问题。分别是逻辑结构,物理结构和数据的运算,我们会先学习数据结构的三要素,然后再回头来讲解抽象数据类型这个概念。
因为理解了三要素之后再回头理解这个概念会相对轻松一些。那这个小节会涉及比较多的概念,比较无聊,给大家的学习建议是可以抓大放小啊,不必纠结于某一个具体的细节概念。
因为这些概念其实都不是特别重要,并且随着之后课程的学习,会对这些概念的理解越来越深刻。另外,我们还会在这个小节的末尾。
把最重要的那些概念在。带大家创一遍好,那首先来看一些最基本的概念,第一个要认识的是什么?是数据。
数据是信息的载体,是描述客观事物的数字符及能够输入到计算机中,并且被计算机程序。识别和处理的符号集合,那其实从计算机的视角来看。
所谓的数据啊,对于计算机来说就是一些二进制零和一,对吧?因为计算机能够识别和处理的只有二进制数,我们现实世界当中的所有数据。
只要我们能够确定一个转换规则,其实都可以转换成二进制表示的形式。那什么是数据元素呢?这是王道叔给的定义。数据元素是数据的基本单位。
通常作为一个整体进行考虑和处理。然后一个数据元素由若干个数据项组成,其实什么是数据元素?什么是数据项?这个得看我们到底是要用计算机来处理什么样的问题。
我们要根据我们实际的业务需求来确定到底什么是数据元素,什么是数据项,比如说大家去吃海底捞的时候不是会有海底捞的排队排号的系统吗?那对于海底捞的这个排号系统来说,所谓的一个数据元素。
其实就会对应一波顾客,因为每一波顾客在排队的时候,他都会取一个号,而每一波顾客排队的信息当中。包含了这波顾客。
他的号数对吧?同时还需要记录这个顾客的取号时间。另外,根据实际的业务需求,可能还需要记录这一波顾客他到底有多少人。
也就是就餐人数是多少。那在这个应用场景当中,每一波顾客的信息其实就是一个数据元素,而每个数据元素当中又会由多个数据项组成。再比如说我们玩微博的时候。
每一个人的账户都会有一个基本信息,那么在微博这个应用的呃业务场景下。所谓的一个数据元素,其实就是对应一个账户,一个账号。
而每一个账号,它会包含这个账号的昵称。还有性别,生日等等,这一系列的信息每一项基本的信息就是一个数据项。
另外对于一些复杂的信息,比如说像生日信息,也许我们可以把它拆解为。更多个数据项把它拆分成年,月。
日这样的形式,那么这样的多个数据项把它组合起来,表示一个整体的信息,我们可以把这样的一个整体称为组合项。总之呢。
我们要根据实际的业务需求,业务情况来确定我们要把哪些内容作为一个整体。是根据实际的业务需求来确定的好,那接下来要学习的两个概念是数据结构和数据对象。在讲数据结构之前。
先来看一下什么叫结构,比如在我们小学的时候学过一些汉字,老师会告诉我们一个汉字是什么样的结构,比如这个汉字是左右结构。这个是左中右。
这个是上中下结构,那不难看出所谓的结构其实指的就是它的各个元素,它们之间的一个关系。比如像慢这个字,可以把它拆解成三个部分。
那这三个部分或者说这三个元素,它们之间的结构关系就是上中下这样的结构,所以所谓的数据结构指的就是。相互之间存在一种或多种特定关系的数据元素的集合,也就是说数据结构强调的是各个数据元素之间。
它们到底有什么关系?而数据对象这个概念只强调数据元素,具有相同的性质,但是并不强调数据元素之间的关系好,还是来讲海底捞的例子。
之前我们说了,在海底捞排队的某一波顾客的信息,我们可以把它看作一个数据元素,那不同的顾客,他们的排队信息其实逻辑上看是存在某一种。
先后关系的,比如在某个特定的门店排队的那些顾客的信息,他们之间就会存在一种先后的关系。三号顾客在四号之前,四号顾客在五号之前。
所以由于这些数据元素之间,它们存在某一种关系,因此由这些相互之间有关系的数据元素。就组成了一个数据结构,那这儿我们看的是a门店的顾客信息。
那假设还有另外一个门店也有一些顾客在排队。但是显然另一个门店的顾客排队信息,也就是这些数据元素,其实和上边这些数据元素并没有直接的关联关系。但是。
由于这些数据元素,它们都具有相同的性质,所以我们可以把所有门店的排队顾客信息都看作是同一个数据对象里的数据元素。相信用这个例子并不难理解,数据结构强调的是数据元素之间一定要存在某种关系。
而数据对象只需要要求在这个集合当中的所有数据元素都具有相同的性质就可以了。好,那既然数据结构要强调,要关心的是各个数据元素之间的关系,那么当我们在学习。
在设计一个数据结构的时候,应该注意数据结构的哪些方面呢?那这就涉及到下一个知识点,数据结构的三要素,分别是逻辑结构。
物理结构和数据的运算。我们来依次看一下,首先来看逻辑结构。逻辑结构指的就是数据元素之间,它们的逻辑关系是什么?
那数据的逻辑结构分为集合线性结构,树形结构和图状结构,或者叫网状结构。分为这样的四种,我们依次来看一下那集合这种结构。
其实和我们数学里的集合是一样的概念。就是指各个数据元素,它们同属于一个集合,除此之外,别无其他关系。
比如在我们吃烤肉的时候,在一个烤盘上,各种各样的食物,它们都属于烤盘这个集合。但是各个元素之间并没有其他的逻辑关系。
那这是集合这种逻辑结构,再来看下种逻辑结构叫线性结构。其实看这个图就很好理解所谓的线性结构,是指各个数据元素之间,它们存在一对一的关系。
然后除了第一个元素之外。其他所有的元素都有唯一的前驱,比如假设左边这个是第一个元素,那么这个元素它是没有前驱的,也就是在它的前面没有别的元素。
而对于后面的任何一个。元素来说,它都会找到一个直接的前驱,那和前驱相对应的概念叫后继。除了最后这个元素之外。
每一个元素它都可以找到一个后继,比如在我们吃烤串的时候,在这个肉签上呃,我们把。各种食物。
各种肉给穿上去,那么这些肉它们之间的逻辑关系就是线性结构,这样的关系。另外,像刚才我们提到的海底捞吃火锅的例子。
这个队列当中的各个元素,它们之间其实从逻辑上看也存在这种一前一后的关系。所以这些数据元素之间也存在线性结构,这样的关系再来看下种树形结构数据元素之间存在着一对多的关系啊,这个看图很好理解树形结构其实就和我们的树枝一样。
由某一个节点开始,长出一个一个的分支。其实,这种树形结构的数据元素啊,是很常见的。
比如说,像我们开篇给的这个思维导图。这些一个一个的节点,它们之间不就是这种树形结构的关系吗?另外。
我们的电脑当中,各级目录还有各个目录下边的呃一些奇怪的文件,它们之间的关系其实也。也是这种树形结构的关系,所以其实树形结构也是很常用的好。
再来看最后一个呃逻辑结构叫图状结构或者叫网状结构。指的是数据元素之间存在多对多的关系,比如我们的微信好友关系。从逻辑上看,其实就是一种图状的结构。
网状的结构。每一个用户被抽象为一个数据元素,而用户之间如果加了好友,那相当于在这两个数据元素之间建立了一条边,建立了某种联系。
那比如你要和你的前女友断绝关系的话,那从数据结构的角度来看,是不是就相当于把这两个数据元素之间的联系给它干掉了?也就这条边消失了。好。
再来汇个总数据的逻辑结构,分为这样的四种。其中,我们在数据结构这门课里边啊,要着重讨论的是后面的这三种。
也就是集合这种结构。呃,基本不讨论线性结构,会在第二和第三章当中进行讨论。树形结构会在第四章当中图结构。
会在第五章中进行讨论。好,那这是数据结构的三要素当中的第一个数据的逻辑结构,接下来要看的是数据的物理结构,或者很多地方更愿意把它称为存储结构。
数据的存储结构所要探讨的问题是如何用计算机来表示出数据元素的那种逻辑关系,也就是刚才我们探讨的这些逻辑关系怎么用计算机来表示这样的一个问题。那数据的存储结构同样分为四种,分别是顺序存储,链式存储。
索引存储和散列存储。那为了让大家理解起来容易一些,我们在绪论这个部分先探讨。线性结构这种最简单的逻辑关系,在计算机当中应该怎么表示?
如果采用顺序存储,这样的存储结构的话,那么需要把逻辑上相邻的元素在物理上,物理内存里。也把它相邻的存放就像这个样子。
也就是说在计算机的物理内存里边,用数据元素的存储位置,相邻来表示。各个数据元素逻辑上的这种相邻的关系好,这是顺序存储。
如果采用这种存储方式的话,那要求给各个数据元素分配的是。一片连续的存储空间,再来看另一种存储方式。链式存储如果采用链式存储的话。
那么逻辑上相邻的各个元素在物理位置上可以不相邻。而是借助这个元素,存储地址的指针来表示,它的下一个元素到底是在什么位置存储呢?所以如果采用的是链式存储。
这种方式的话,那么各个元素之间的先后关系是用这种指针来表示的。那这儿需要提醒大家,如果对C语言的指针不太熟悉的同学,在学这个数据结构这门课之前一定要自己先花点功夫把C语言当中和指针相关的内容好好自学一下。
好,这是链式存储,并不要求各个数据元素,它的存放位置在物理上,相邻再来看下一种呃索引存储。
如果采用这种存储结构的话,那么会建立一张索引表。在这个索引表当中记录呃,各个数据元素的这种先后次序,同时也要记录每一个元素。
它实际的呃存放地址。所以如果采用索引存储的话,那么需要在内存当中再消耗一些存储空间来专门的存放一个这样的索引表诶,可能有的跨考的同学不知道关键字是什么意思?所谓的关键字。
就是可以区分不同的数据元素的呃数据项,比如之前我们举的海底捞的例子,每一波顾客,他取的那个排队的号。都是唯一的。
所以在海底捞的排队系统当中,可以把顾客取到的那个号数作为数据元素的关键字。总之,可以用关键字这样的属性来区分各个数据元素,好再来看最后一种存储结构。
散列存储。采用这种方式的话,会根据数据元素的关键字直接计算出该元素的存储地址,又称哈希存储,要解释清楚什么是散列存储。
并不是短短的几分钟能够解决的。所以这个地方我们先不展开,在我们第六章散列表相关的那些部分的学习会更进一步的介绍,什么叫散列存储这个地方能有个模糊的印象就可以了。好。
那刚才我们介绍了数据的四种存储结构,我们可以把后面的这几种存储结构统称为非顺序存储。在之后章节的学习中,还会对这些存储结构有越来越深的认识,那在绪论这个章节当中。
我们只需要理解两点,第一,如果采用顺序存储的话,那么各个数据元素在物理上必须是连续的。就像我们传统的排队。
每个排队的人在物理空间上必须都是连续的,而如果采用的是非顺序存储的话,那么各个数据元素在物理上可以是离散的。比如现在去银行办业务,那我们取了一个号之后是不是哪儿有座位。
我们就可以坐哪儿,这就是非顺序存储。第二点,大家要知道的是,数据的存储结构会影响存储空间分配的方便程度。
啊,什么意思呢?比如如果采用顺序存储,然后在这种情况下有人想在这个地方插个队,那么在这个人插队之前是不是他后面的这些人都分别需要往后挪一位啊?
也就是说,如果采用顺序存储的话,那么给这个人分配他所需要的存储空间是比较不方便的。但是如果采用的是非顺序存储的话,那有人想插队。
比如说来了一个银行的VIP。那么,是不是只需要给这个人一个更小的,更早的号就可以了?但是可以把这个人分配到任何一个此时空闲的位置。
所以,非顺序存储对于存储空间的分配会更方便一些,同学们还需要理解的是,这个数据的存储结构,它还会影响对数据的运算速度。
比如,在这两个例子当中,我们想要找到这个队列里排在第三个的人,那顺序存储是不是一眼就可以找到第三个人就是这儿嘛?而如果采用非顺序存储的话。
那想要找到此时排在第三位的人是不是就没有这么容易啊?所以数据的存储结构不同,那么对数据的查找,运算,查找操作的速度就会受到影响。
那除了查找之外,其他的一些运算速度也会受到存储结构的影响,这一点我们会用后续的章节再慢慢加强大家的理解。好,那以上就是数据的存储结构。
相关的一些知识点,那接下来要看的是数据结构三要素的最后一个要素,对数据的运算。我们一般会针对数据的逻辑结构来定义,需要对这些数据进行哪些操作。
或者说哪些运算。另外,针对不同的存储结构。相应的数据运算实现方式也不一样。比如。
海底捞的队列,它是一种线性的结构。那根据队列,这种逻辑结构的特性,我们可以定义一些在这个场景当中。
我们需要实现的。呃,运算,这是从现实需求出发呃提出的一些所需要的运算,比如第一个运算对头元素出对。
这个运算肯定是需要的,对吧?服务员在叫号的时候,其实本质上不就是把对头的这个数据元素让他出对嘛?第二个需要定义的运算是新元素入队。
比如有一桌新的顾客。他取了一个新的号,那是不是就需要把这桌顾客所对应的数据元素把它啊插入到这个队列的队尾?那就不再举例,总之我们需要根据啊。
数据的逻辑结构来确定,对这种逻辑结构的数据需要进行哪些运算?那根据之前的讲解,我们知道像队列这样的结构,其实在计算机当中会有各种各样的存储结构。
存储的实现方式。像左边这种就是顺序存储,右边这种就是链式存储,那来看一下什么叫运算的实现,是针对存储结构的。
我们现在假设呃,对这个数据结构要做的。操作是要插入一个新的数据元素,也就是九九九号,那如果存储结构采用的是左边这种顺序存储的话。
我们是不是需要把九九九号对应的数据元素把它放到这个位置,对吧?而如果采用的是链式存储的话,那可以把九九九号对应的数据元素放到任意一个位置,只需要把九九八和九九九用指针连在一起就可以了。
所以虽然我们要实现的运算同样都是在对尾插入一个元素,但是不同的存储结构,它的这个运算的实现方式是不一样的。好,那到此为止。
我们就介绍完了数据结构的三要素,我们在之后的章节当中讨论到任何一种数据结构的时候,都会关注到数据结构的这三个方面。好,最后我们再来看这个小节中。
我们需要了解的最后的两个概念,数据类型和抽象数据类型,什么是数据类型呢?数据类型是一个值的集合和定义,在这个集合上的一组操作的总称。
这个不好理解。我们一会儿再解释那数据类型可以进行进一步的分类,第一种叫原子类型,就是指它的值不可以再分的数据类型,比如我们很多编程语言当中提供了布尔类型。
int类型,那回头看数据类型的这个定义,什么叫做它是一个值的集合和定义?在这个集合上的一组操作呢?对于布尔这种数据类型来说。
这种数据类型可以取得的值就是两种true和FALSE,然后可以对布尔这种数据类型进行的操作啊,就是与或非这样的操作。那像int也就是整数这种啊,数据类型来说。
它可以取值的范围就应该是这样一个范围,当然不同的编程语言当中int类型的这个取值范围是不一样的。啊,这儿我们只是随便举了一个例子,然后可以对int类型进行的操作。
就是加减乘除模运算等等,这一系列大家很熟悉的操作。所以讲到这儿,大家应该就能够理解什么叫做呃值的集合和一组操作了好,除了原子类型之外。
还有结构类型,就是指它的值可以再分解成若干个分量的数据类型,比如在C语言。当中我们很熟悉的struct,也就是结构体。
我们可以在这个结构体当中定义更多的分量,然后不同的分量可以是不同的数据类型。比如这个结构体,我们是用来表示排队顾客的信息,那对这种结构类型来说。
它可以取哪些值,可以对它进行哪些操作,这个我们是需要根据具体的业务需求来确定的。比如如果我们一个店里排队的顾客人数不可能超过九九九,这么多顾客的话。
那么我们就可以规定顾客取得这个号数,它的范围是一到九九九。然后如果每一桌的人数啊,最多不能超过12个的话,那么我们可以把people这个变量。
它的取值把它规定为一到12,总之这是根据我们的业务需求来确定的。那我们当然也可以定义对这个结构类型的操作,比如如果要让两拨顾客拼桌的话,那这种运算在背后。
我们需要把这两桌顾客把他们的人数就是people。给相加合并当然有可能还需要其他的一些操作,总之对于结构这种数据类型来说,它可以取什么值,可以进行什么样的操作。
这是我们根据自己的业务需求,具体的需求来确定的。好,那在这儿我们了解了一些具体的数据类型,了解了具体的数据类型之后。
对抽象的数据类型其实就更好理解了。抽象数据类型,英文缩写adt。它是抽象数据组织和与之相关的操作。如果用我们之前学过的知识来理解的话。
当我们在定义一个抽象数据类型的时候,其实我们就是用数学化的语言定义了某一种数据的逻辑结构和。对这种数据的运算,而只有当我们要实际的用计算机去实现这种数据结构的时候,才需要涉及。
才需要考虑到呃,我们到底要采用哪种存储结构?所以,抽象数据类型其实并不关心,并不讨论啊。
具体要采用哪种存储结构,只关心另外两个方面。好,这个小节我们涉及的概念知识点还是挺多的,我们来快速的把它回顾一下。
刚开始我们认识了什么是数据,这个不用过多解释。然后数据对象其实是数据的一个子集,数据对象由呃一系列具有相同性质的数据元素组成,而每个数据元素当中又包含一个一个的数据项。
那当我们在讨论数据结构的时候,我们更关注的是各个元素,它们之间存在的某一种逻辑上的关系。同时,我们还需要定义对这些数据元素应该要实现哪些运算。
或者说哪些操作。在这个小节的后半部分,我们介绍数据结构的三要素和。抽象数据类型,那当我们定义了一个抽象数据类型的时候。
就确定了一个数据结构的逻辑结构和数据的运算,这样的两个方面,也就是定义了一个具体的数据结构。而当我们要用计算机实现这种数据结构和对数据结构的运算的时候,我们就需要考虑需要涉及到这个存储结构的问题。
存储结构的不同会导致运算的具体实现不同,只有确定了存储结构之后才能实现一个数据结构,再次强调大家不需要过度的纠结绪论,这个章节当中的某一些。很细节的概念。
如果理解不了,或者感觉理解的不够透彻,没关系,先继续往后学,后续内容的学习会不断的巩固。
大家对呃以上提到的这些概念的认识。好,那以上就是这个小节的全部内容。