数据结构入门(一级)

数据结构和算法的入门:

在这里我们先回答大家三个问题

1. 为什么要学习数据结构

2. 有哪些数据结构

3. 学习数据结构的四种境界

知道了这三个问题之后呢,再来进行具体内容的一个学习,先看第一个,

为什么要学些数据结构?

1.语文是从识字开始的,识字,组词,造句,我们是从这个开始的,那么我们学习语文的最终目的是什么呢?

比如我们学习语文的目的是写小说,比如我们要写文章了,比较大的文章,我们识字的最终的目的是写小说,

当我们识字,组词,造句会了之后,能不能直接跳到写小说去,肯定是不行的,这个中间隔着一块内容,这块内容

就是写作文,为什么要经过写作文呢,写作文有两个目的,第一个每个小作文实际上就是一个小小说,就是你在

写作文的过程中你小小说的水平无形之中就已经提高了,写作文其实也是在写小说,是小小说,写小说不仅是

老师告诉你该怎么写,这个列子大家应该都是可以理解的,这跟我们的数据结构有什么关系吗,有,识字相当于

我们学了一门语言,比如我们学了一个JAVASE,或者你学了一个C语言,或者你学了一个C++,光学一门语言就

相当于我们识字阶段,最终的目的就是开发项目,开发软件,这是我们的最终目的,学了这个软件之后,

学了这个语言之后,能不能直接开发项目,中间最好再做一件事,就是写作文,而这个写作文是什么,比如说,

他就好比是,学习数据结构,这个就知道了学习数据结构承前启后的作用,学数据结构有什么作用呢,

他首先就像我们写作文一样,首先是高级计算机程序设计的理论指导,因为我们要写项目,我们写项目

遇到复杂的各种情况之后应该采用哪种数据结构来存储数据,这是我们学习数据结构的时候需要知道的,

它是我们学习高级计算机程序设计的理论指导,

2. 学习数据结构不仅仅是理论,他其实也是在提升你的编码能力

3. 经常会被问到数据结构,为什么都喜欢问这个问题,因为从数据结构就可以看出你的基础是否扎实,

看你的套路,可以看出一个人的发展的后劲,并且数据 结构本身是有难度的

这就是我们讲的为什么要学习数据结构,给到大家一个理解的角度吧,通过这一点大家也知道,写作文

学数据结构的作用
再往下我们看第二个问题,有哪些数据 结构啊,我们在这里先给大家列举一下:

有线性表,有栈,有队列,有串,有数组,有广义表,实际上告诉大家,这些都是一种结构,都是线性表,我们先讲一个

最普通的线性表,而后面的一直到广义表这儿,实际上都是线性表,只不过是有些是操作受限的,有些是类型受限制

的一些线性表,还有就是树,树里面我们研究最多的还是二叉树,我们还有图,有这么多的数据结构,重点有两个,

一个是线性表,一个是二叉树,一共有哪些数据结构我们已经知道了,对于数据结构来说,我们要讲什么啊,

对于数据结构来说,我们要讲什么啊,我们要讲三个内容,第一个内容我们要讲以线性表为例,我们要讲线性表的

逻辑结构是什么,第二个我们要讲存储结构,他在计算机里面,内存里面,怎么来表示的,第三个呢是不仅是在内存里面,

不仅是怎么表示,我们还要把各种操作实现了,什么操作呢,比如说,添加,更新,删除,查询,排序,对于线性表来说

他的各种存储结构,我们的这些操作应该怎么来实现,掌握了这些算法之后呢,在实际的项目中我们就可以直接的

来使用,那对于添加,更新,删除,查询,排序操作中呢,我们对两种操作,查询,排序操作呢,单独的拿出来,

这个查询排序,不是在每一种数据结构中都讲的,每一种数据结构我们讲添加,更新和删除,主要是讲这三个操作,

而对于查询和排序呢,我们放到最后作为两个专题来讲,这么一来我们准备的数据结构我们要讲哪些内容呢

大家就都知道了,

1. 第一个是数据结构的算法和入门,一些基础的知识大家都知道

2. 第二呢要一次讲解各种数据结构,线性表,栈和队列,树和二叉树,图,就是逐个讲解线性结构的,当然这其中对于

	我们的串就不做说明了,就是我们JAVA里面学得字符串,数组我们在JAVA里面也学过,在这里就不讲了,广义表

	是一种比较特殊的表,用的也不多,感兴趣的可以自己去学习,这里面一共分了这么四章,最主要的几种数据结构,
	
	对每种结构讲他的逻辑结构,存储结构,还有添加,更新,删除操作,但是是不讲查询和排序的,查询和排序怎么办,
	
	查询和排序放到最后,查询和排序来讲,这个大家就明白了,中间还夹了一章叫递归,为什么把递归放到这里呢,
	
	告诉大家在第四章讲了递归之后,第五章,第六章,第七章,第八章每一种都会用到递归,你会发现使用递归来编码
	
	的话,代码上非常的简单,思路上也是非常的简单,当然他也有他的一个劣势,递归大家要作为一个重点来掌握,
	
	有哪些数据结构大家知道了,我们整个数据结构讲那些内容,他们什么关系,大家也应该知道了
学习数据结构的四种境界


境界1: 听懂理论,听懂算法思路,我只管听,这也算一种境界,理论家,眼高手低,反正总比不知道强多了,思想也是很重要

	   但是光是达到这个境界肯定是不行的
	  
境界2: 我们要完成主要数据结构基本算法的实现,大家仔细看看这里面有两个词语,主要数据结构,是不是所有的,不是,

	   主要像线性表啊,什么二叉树啊,查询排序啊,完成主要数据结构的基本算法,基本算法的实现,这算是境界2,有理论
	   
	   也有了实践了,我们数据结构到这个层次算是入门了
	   
境界3: 我对这个数据结构非常感兴趣,我立志要在这方面做更多的研究,下一步可以完成更多的数据结构和更多算法的实现

	   进一步提高数据结构的功底,我们现在开发的JAVAEE的项目,一般是用不到数据结构,因为它相当于是二次开发,
	   
	   人家在JAVAEE的基础上,并且MVC的模式我们都采用,这个情况下我们就实现他的业务就可以了,我们开发JAVAEE的项目
	   
	   也开发了这么多,也没有用到数据结构,这和我们开发JAVAEE的项目有关系,但是如果开发一些更底层的项目的话,
	   
	   哪怕你开发一个游戏的话,你会发现对于数据结构的要求就一下子提高了,我们可以完成更多数据结构更多算法的实现,
	   
	   学习数据结构的话你的编程水平是会快速提高的,你写一个项目两个项目也许只是业务不一样,到最后你会发现你的
	   
	   编码水平也没有多大的提高,事实上你开发4,5个项目之后你都可以照样开发,我们学些数据结构是可以学到很多,
	   
	   更多更复杂的一些算法,就可以直接提高我们的编码水平的
	   
境界4: 境界4什么意思,你只要把数据结构学好,光拿着这一本数抠,你是绝对抠不好的,还得和实践结合,还得融会贯通,举一反三

	   在实际的开发中来应用他,跟实际相结合,这样一来才会把数据结构用好,用的更活,这就是我们学习数据结构的4中境界,
	   
	   
对于大家来说,我们对于初学者来说,我们要求大家达到境界2吧,听懂理论,完成主要数据结构的基本实现,数据结构入门了

如果大家对数据结构感兴趣,或者你以后的工作中遇到相关的问题,我们可以做更多的深入的研究,回答了这么三个问题,

那么我们下面就从第一章开始了,基本概念,
	 
1. 数据

2. 数据项

3. 数据元素

4. 数据对象	  
	   
感觉这些概念好难啊,这个概念我们记录,红色的是一个学生的一个信息,这个姓名音乐分数,这个单位还能够再小吗,

这就不能再小了,音乐68分你再怎么分,然后红色叫做数据项,具有原子性,不能再分了,最小数据单位,很容易理解,

那一条学生的信息,小明的,这一行叫什么,数据结构里面叫做数据的元素,称之为数据元素,它是数据的基本单位,

他不是最小单位,通常是由若干个数据项组成的,在计算机程序中一般作为一个整体来进行处理,这是一个学生的对象,

很多学生的信息我们称之为数据对象,数据元素就是一个学生性质相同的,多个学生在一起的集合就叫做数据对象,

它是数据子集,它是数据的一部分,什么叫数据项,什么叫数据元素,什么叫数据对象,但是这三个都是数据,概念放在这里

大家可以自己去读,不管是数值,字符,字符串,还是什么声音,图像,视频,都可以称之为数据,这几个基本的概念建立我们

共同的语言


下面我们来看数据结构

什么叫数据结构呢?

从字面上理解,如果我们要从这4个字里面找两个主语的话,应该是结构,是数据的结构,不是建筑的结构,也不是人体的结构,

是数据的结构,那不仅仅有数据,关键是数据以什么样的形式组织在一起,各种数据之间的关系是什么,这叫数据结构,那这都是人

这些人都是有结构的,这是人和人都是一个一个的数据,他们是以一种什么样的结构来组织的,他们是以队列,以线的形式来组织的,

比如中间的一个人,前面只有一个紧挨着他,后面也只有一个,这人和人之间就是一条线,他们是有结构的,但同样是人,比如公司的

人,有董事长,有总经理,有部门经理,还有各个人员,他们之间又是什么结构啊,如果你从上下结构来说,他们就是上下级的关系,

这也是一种结构,就像一颗倒挂的树,在队列里面,线性里面,一对一的关系,一条线就可以把它们串在一起,董事会部门来说就是

一个树状的,一对多的结构,这个大家明确了,什么叫数据结构,同样是人,我们可以按照不同的方式来排列,组成不同的数据结构,

关于数据结构我们要讲两种结构,一种叫逻辑结构,一种叫存储结构,什么叫逻辑结构,逻辑结构就是存在我们逻辑思维中的,

我们抽象出来的一种结构,跟实现无关,一种是数据结构的逻辑层面,这种逻辑结构我们要在计算机里来表示的话,来落地的话,

他应该怎么来表示,那就是数据的存储结构


所以数据结构 = 逻辑结构 + 存储结构


当然只有这个结构还是不够的,还要有各种存储结构下,各种操作啊,各种运算啊,应该怎么来实现,那这样就构成了数据结构的全部,

数据结构就是讲这些的

这张图你就知道数据结构要讲什么了,逻辑结构有哪些,存储结构有哪些,运算有哪些,查询,排序,删除,修改

对于每一种数据结构,我随便拿一个,我们讲他的逻辑结构,将他的存储结构,讲他的各种运算,再拿一个数,

我们讲他的逻辑结构,存储结构,还有运算,这张图和上面一张图是类似的,逻辑结构,存储结构,还有数据的各种

运算,包括这么三大块,关于基本概念我们就讲到这里了,有哪些数据结构呢,讲了什么叫逻辑结构,什么叫存储结构,

下面我们重点研究两个概念,什么叫逻辑结构,什么叫存储结构,先看逻辑结构呗,逻辑结构和实现无关,不要考虑

在计算机里面怎么实现,抽象他们的逻辑关系就可以了


我们比出两种分类方法,第一种叫线性结构,第二种叫非线性结构

这是第一种分类的,什么叫线性结构呢,我们在这里举了两个例子,这是一个冰糖葫芦,他就是一个线性结构,而站的

一条队伍,也是一个线性结构,那什么不是线性结构呢,你家的族谱不是线性结构,这就不是线性的,再来一个,北京的

地铁图也不是线性的,给出这四张图之后大家对于线性和非线性有了一个初步的认识,那么我们怎么给出一个更加精确

的定义呢,请问什么叫线性结构,线性结构可能是冰糖葫芦,可能是人排队,但是我们要把它抽象出来,他们有一个共同的

特点是什么啊,就是这样的一个特点,从生活中一个一个的结构抽象成这样一个逻辑表现形式,一个一个的黑点代表一个

一个的节点,每个节点代表一个冰糖葫芦,也可能代表一个人,都是有可能的,抽象的结构就是这么一条线,这叫线性结构

1. 必须有唯一的一个"第一个元素",这里面必须有第一个,假如我们01表示第一个,第一个只有一个

2. 有唯一的一个,谁是最后一个,04它是最后一个元素

3. 然后除了最后一个元素之外,其他的元素均有唯一的"后继",比如1后面是3,3后面是5,5后面是2,2后面是4,4后面就没有了

   除了最后一个元素以外,其他的元素都有唯一的后继
  
4. 除了第一个元素之外, 其他的元素都有唯一的前驱,4的前一个是2,2的前一个是5,5的前一个是3,3的前一个是1,1的

   前面就没有了,如果满足这四个要求的话,他就是一个线性结构,这样我们就是一条线,还用说吗,难道还有多个前驱
   
   和多个后继吗,那当然有了,1有02和03,这就不是1对1了,所以线性结构他表示的是什么关系,是一对一的关系,什么叫
   
   线性结构我们知道了,有这种抽象的认识


相对于线性结构,非线性结构的逻辑特征是一个节点元素可能对应多个直接前驱和多个直接后驱,

比如说对于这种结构来说,这是一颗树,这是一个图,这个逻辑结构是从哪里来的,他就从我们实际

生活中来的,这是一个族谱,从八代祖宗开始,一直到当前这个,这是一个由上而下倒挂的树,生活中

还有没有这样的例子,一个部门的组织架构,从上级到下级,还有一个计算机的文件系统,它画的是

linux的文件系统,window里每个盘都有自己的根目录,这都是一种结构,我们可以从抽象出共同的

特点,特点就是一个树状的结构,他是一种一对多的关系,1可以有多个孩子,1可以有多个后继,多个

下级节点,2也可以有多个下级节点,但是任何的节点想找他的前驱的话,或者找他的上一级的话,

只有一个,这就叫树,还有没有别的,中国的铁路图,各个城市的地方可能会交汇,交通枢纽的地方

北京的地铁图换乘站,很明白多个地铁线交叉的地方,那么他们又有什么共同的特点,最终抽象出

一张图出来,网状的结构,或者叫图,或者叫网,就是这种关系,比如这个2,他的后继可能是4,可能是3,

他的前驱可能有1,也可能有3,按照这个箭头来,多个先驱多个后继,但在这里它会有什么关系,多对多

的关系,关于逻辑结构我已经讲了

再次说一下线性结构,非线性结构有树状结构和图状结构,或者网状结构,这三种结构我们都说了,

还是来自于实践的,从实践中总结出来的,这是一张北京的线路图


分类2: 同样是逻辑结构,我们可以分成集合结构,线性结构,树状结构,网状结构/或者叫网络结构

与刚才的分类有什么区别,这个就更细了,线性结构还是有的,他把非线性结构给你分出两个来,

一个叫树状结构,一个叫网状结构,然后又给你加了一个集合结构,一共有4个,那其中最常用的是线性结构

和树状结构,高德地图肯定离不了图,可能在某些特定问题里面会专门用到这个图,很多问题里面可能用不到

图


1. 什么叫线性结构: 一对一的关系

2. 什么叫树状结构: 就是一对多的关系

3. 什么叫网状结构: 多对多的关系

4. 什么叫集合结构: 节点之间没有一对一,也没有一对多,也没有多对多,他们只是属于这一种集合,各个节点

   之间没有其它任何的关系,这种情况我们就称之为集合,集合就是我们数学里面讲的集合,但是元素之间是
   
   没有关系的,那我们在数据结构里面不对集合进行研究,因为集合中的元素关系比较弱,也没有多大可以研究的,
   
   那么我们记录一点就可以了,集合的元素有三个特征,唯一的,无序的,确定的,我一听到这三个名字好熟悉,
   
   我们学过HashSet,他就是无序的,唯一的,肯定也是确定的,他们就没有前驱和后继,一对一的关系了,也没有上下级
   
   的关系了,这是第二种分类方式,我们再往下看
   
   
1个班的学生它是什么逻辑结构呢?

像我们班的学生是一个集合的,还是线性的,还是树状的,还是网状的,我觉得要看在什么场合下来说,比如说我们班的学生

刚刚来到我们学校的时候,那可能就是一个集合的,一直到我们毕业一直都是一个集合的,肯定是作为一个集合来存在的,

但是如果再往下再来走,换一个角度来说,当我们对每个学生排了学号之后,是不是有先后顺序了,或者我们下课了我们打饭去了

或者我们要排着队列做其他事情去了,那我们就变成了一种线性结构,我们交作业的时候就变成了树状结构了,组员对组长,

组长对班长,这个就是上下级的关系了,那这个时候就体现了树状的这种,那什么叫网状结构啊,我们按照座位来做好的话,

你前后左右可能都有人,这就是一种网状的结构,或者我们同学这种关系,你和他熟,他和她熟,那这也就变成了一种关系网了,

他也是一种网状结构

扫描二维码关注公众号,回复: 6048444 查看本文章

什么叫存储结构

同样是一个线性结构,同样是这么一条线,表示方式是不一样的,怎么来表示呢,存储结构一共有4种,

顺序结构,链式结构,索引结构,和散列结构,一共有这么4中存储方式,当然对索引和散列呢,我们在这里

简单的提一下,后面会做专门的说明,而顺序和链式结构呢,就贯穿于我们每种数据结构的讲解,


1. 顺序存储结构: 顺序存储结构大家太熟悉了,就像我们JAVA里面学的数组,一下在内存里面分配连续的空间,

   数据一个一个挨着一个就可以了,不需要专门的存储地址,他们是相邻的,他们的位置之间也隐藏了他们之间的
   
   先后关系,他这是一个顺序存储结构,这个大家明白的,但是顺序存储结构有没有缺点,有缺点,比如这是一个队列,
   
   来个人,大哥我又急事,你能不能让我插个队啊,我想插到3号的前面,可以不可以,3号很大方,你来到我前面就行了
   
   不是这么简单的,后面那个人不让的话他能插到前面吗,不可以,所以你想让这个人加到3号的前面,那就是3号包括后面所有
   
   的内容,都往后移动一个位置,然后空出一个位置,他才可以过来,所以对顺序存储结构来说呢,它是有缺点的,这种插入和
   
   删除的时候,效率是比较低下的,这个大家应该都是比较熟悉了
   
   
2. 链式存储结构: 顺序的是分佩连续的空间,链式的就不一样了,他就分配了单独的空间,每块空间有没有连在一起呢,没有,
 
   是不连续的,但是这么一来的话,当你这个值存放a1之后,我怎么找到a2,地址是没有规律的,必须在存放a1的这个位置,
   
   同时存放一个指针,指向a2在哪里存,所以这个节点要存两个数据,第一部分要存数据a1,第二部分要存地址值,地址是下一个节点
   
   的地址,根据这个地址可以找到下个节点,这就是链式型的结构,那你觉得链式结构是节省空间还是浪费空间,从这个角度来说
   
   他不仅存数据,是不是还要存地址,他要多占一些空间,从这个角度来说它是要浪费空间,但是也不见得,因为链式结构有几个
   
   数据就有几个节点,我有10个数据,有10个节点就够了,我需要20个节点吗,我不需要,10个就够了,但是这个数组就不确定了,
   
   数组你必须首先指定总的长度,你一下子指定100个,结果你里面只存了3条数据,那97个都是浪费的,都是空闲的,所以到底哪一个
   
   浪费空间我们要从不同的角度来说,这就是我们将的链式存储结构,我们为什么要用链式的存储结构,是不是内存里面没有一块
   
   这么长的连续的空间,所以我才采用链式的,不是的,采用链式并不是内存中没有连续的,只有单个的,所以才采用链式的,不是的,
   
   最主要采用链式的是有他的优点,有什么优点,你想插入,你想删除,只要给一下指针就可以了,并且链式的你有几个数据,就几个节点,
   
   不需要空闲的节点,它是有他的优点,这是他的一个链式存储结构,后面的每种都会给出两种实现,一个是顺序的实现,一个是链式的实现
   
   
3. 索引的存储结构: 生活中这样的例子也很多,比如我们看一本书的话,他前面是有目录的,目录的目的是什么,是为了我们快速的找到

   后面的内容,找到这个数据,那目录占不占空间,目录肯定是占空间的,他一方面占的空间非常的小,另一方面占这么小的空间可以带来
   
   性能极大的提升,所以占这点空间是值得的,再比如字典里的目录,部首检字法,拼音检字法,虽然也是占空间的,但是是值得的,我们看
   
   这幅图这个图分两块,右边的就放一条一条的数据,左边这一块呢,放的是索引,索引可以分好几级,是为了快速的找到,因为如果你只有
   
   一级索引的话,一级索引可能又变成了顺序查找了,他可以分成好几级,进行范围的跳跃,这是我们讲的索引的存储结构,索引存储结构
   
   是有他特殊的情景场合的,海量数据的话索引是比不可少的,数据库里面索引就是一个必不可少的内容
   
   
4. 散列存储结构: Hash表,它是一种神奇的结构,添加和查询的速度快,非常快的就可以找到,他的添加查询可以说是最快的,快到什么程度,

   就好比我们数组中按照索引查询元素一样,数组我们已经讲过了,数组中找第一个元素,第100个元素,第10000个元素,花的时间是一样的,
   
   一次到位,只要做一次计算这多快啊,散列的存储结构不是按照索引来找的,它是按照内容来找的,他也可以达到数组按照索引查找的效果,
   
   看他是怎么神奇的,他有各种各样的结构,主体结构采用数组,每个数组可以引出一个相关的链表,这是哈希表最常见的一种方式,存储结构
   
   我们也讲了4种结构,
   
   
   逻辑结构有线性结构和非线性结构,集合结构我们不对其进行研究,线性结构,网状结构,树状结构
   
   存储结构有4种,一个是顺序的,一个是链式的
   
   
   逻辑结构和存储结构之间有什么关系呢,比如说这是一个线性的逻辑结构,当一对一的这种连接关系我们在计算机里面表示的话我们该
   
   如何表示你可以用数组来表示吧,数组里面可以表示一个一个的节点,那不就是顺序表吗,还可以用链表来表示吗,同样表示这张图,
   
   我们有两种实现方式,他们各有优缺点
   
   
   数据结构有逻辑结构,逻辑结构有线性结构和非线性结构,非线性结构有树结构和图结构
   
   存储结构或物理结构有4个:我们讲的最多的是顺序结构和链式结构,每种数据结构我们会讲他的运算,插入,删除,修改,查找,排序,
   
   还有其他的,特别强调逻辑结构是唯一的,存储结构不唯一
   
   
   运算是针对谁的,运算永远是依赖于存储结构的,我们在数组里面怎么做增加,我们在链表里面怎么做增加,这个运算的实现肯定是依赖于
   
   存储结构

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/89518139