接上篇博文。
今天时间是2018年10月29日,本篇博文介绍的是这本书的第三篇内容,主要是一些数据结构方面的一些知识点的总结。那么下面我们就开始了。
对于需要输入大量数据,处理并且输出结果算法,在输入输出大量数据或者处理过程中需要高效的存储和处理各种各样大量的数据。那么就引来了数据结构。
首先有两个例子,一个是日本的邮编,一个是学校学生的学籍或者学生号的例子。主要为了说明一下数据结构的由来,两个例子为了方便理解。
所谓的数据结构就是为了高效的管理大量数据的构造。
数据结构和处理过程在算法中同样具有重要的程度。
数组
同类数据紧密排列就得到数组,可以分为一维数组 二维数组 三维数组以及多维数组
链表
管理按照顺序排列的数据的时候使用的数据结构。按照顺序或者逆序管理的前后关联的数据
堆栈
取数据的顺序和存数据的顺序相反(“先进后出”)
队列
按照排序的先后顺序处理数据,取数据和存数据的顺序是一致的(“先进先出”)
树
树木的结构
像树木结构一样管理数据的数据结构成为“树”
堆栈 stack 音译过来的 意思是“堆叠”。
把数据用堆叠的方式来管理的数据结构。
管理数据有两种操作:
(1)写入数据 push
(2)读取数据 pop
像堆栈这样,最后写入的数据最先读取的数据管理的方式被称为LIFO或者FILO
一种先输入的数据先输出的数据结构。
像队列这样最先输入的数据最先输出的特征的数据管理方式,被称为FIFO或者LILO
把离散的数据串起来
管理按照第一、第二这样顺序排列的数据,最常用的数据结构是一维数组。链表也是一样,可以用来管理顺序排列的数据。
区别:
数组:数据是没有间隙的紧密排列的
链表:数据就像用绳子一样串起来,位置不一定相互紧靠。
链表中各个元素的位置可以自由排列。无论数据的存储位置如何变更,链表也可以正确的管理各个数据的位置。
链表中一共有多少个有效数据这个信息的方法也和数组不同。数组用一个单独的变量保存有效数据的个数。而链表则是在最后一个数据中标记“已经没有下一个数据了”来表示这是链表的结尾了。
链表中,有一个方向将数据连接起来的链表称为单向链表。
两个重要信息:
数据:保存在各个元素之中、意图通过链表来管理的值
指向下一个元素的指针:充当元素和元素之间紧密连接的绳子,在这个场合被称为NEXT指针
NEXT指针:表示的信息是下一个元素保存在哪里。
链表中,最后一个元素的NEXT指针标识终止信息,表示的是没有下一个元素。
另外的一个重要信息是HEAD指针,指向第一个元素的指针,保存第一个元素的位置信息。
如果链表一个数据也没有的话,那么他的HEAD指针指示的就是没有第一个元素这个信息,通常会用无效的指针来表示。
如果指针的值都是从1开始的值,那么通常会用0来表示无效指针。
能检索上一个或者下一个数据
在链表里,用向前或者向后两个方向把数据连接起来的链表称为双向链表。
三个信息:
数据:保存在各个元素之中,意图通过链表来管理的值。
指向下一项的信息:NEXT指针,充当和下一个元素之间的紧密连接的绳子
指向上一项的信息:PREV指针,充当和上一个元素之间的紧密连接的绳子
末尾元素的next指针以及起始元素的prev指针都分别表示“没有下一个元素”这样的终止信息
还有两个信息:
指向起始元素的指针head指针和指向末尾元素的指针tail指针。
head指针保存的是起始元素的位置信息,tail指针保存的是末尾元素的位置信息。
当双向链表里一个元素都没有的时候,head元素和tail元素分别保存“没有起始元素”和“没有末尾元素”这样的信息。
要从顺序的一组数据中找到第n个元素,用数组的话可以在一瞬间完成。而用链表的话,要访问第N个元素只能从起始位置开始,一个个来进行访问。如下图所示:
这样来看,访问第N个元素,数组相比链表显然更加有效率。
1.数据插入:
数组插入数据必须把新数据插入位置往后的所有数据都向后移动。为了插入一条数据,往往需要进行大量的数据移动操作。
对于链表,插入一份数据只需要把插入位置原来的链接去掉,让前后两份数据连上新的数据就可以了。
2.数据删除:
在删除一份数据的时候,如果是数组,就必须把删除的数据后面所有的数据向前移动。对于链表而言,无论删除的数据后面有多少条数据,都只需要把这份数据和前后的链接去掉,把前后数据直接链接起来就可以了。
在数据的插入和删除上链表效率更高。
数组元素的个数存在上限。
通过让一个数组首尾相连,得到末尾元素后面还有元素这样的数据结构。
事实上,末尾元素后面没有元素了,不过通过指定末尾元素的下一个元素是起始元素这样的规则,利用原有的一维数组的结构,就可以永远的访问任意一个元素的下一个元素,这就是其特点。
树是一种管理有像树干,树枝,树叶一样关系的数据结构。
树由节点(顶点)和边(枝)组成,并且由一个节点作为起始点,这个节点成为根节点。
相应的其他概念:
父节点 :从根节点,延伸出来的这些节点又可以向下继续延伸出新的节点。旧的节点成为父节点。
子节点 :从根节点,延伸出来的这些节点又可以向下继续延伸出新的节点。新的节点成为子节点。
叶子节点:一个子节点都没有的节点。
深度:从根节点出发,到达某一个节点所要经过的边的个数成为深度。
在树形结构中,如果每个父节点只有两个子节点那么就被称为二叉树。
两个子节点分别被称为左子树和右子树。不过也不是所有的父节点都有两个子节点。
唯一的限制就是每一个节点的子节点都不能超过两个。
二叉树可以使用数组进行表示。可以定义某一个父节点的元素的索引是i,其左节点的元素索引为2*i+1,其右节点的元素的索引为2*i+2
二叉树通常可以用于表示父子节点存储的数据大小关系,也可以用于表示二项式,另外可以用于搜索算法。
关注的是两个以上的数据项目之间是如何关联在一起的,并且通过图形一样的方式把这种关联方式表现出来。
项目成为节点,节点的关系的连线成为边。
有时候,图的边也是有向的。由节点和有方向的边组成的图成为有向图。
如果一个图的每条边都拥有权重,那么这个图就是加权图。
为什么数组的起始下标有时是0,有时是1?
造成这个差异的由来是不同的计算机编程语言的设定。
最早流行的语言的数组的起始位置就是从1开始,后面的语言的起始位置基本都是0。
下篇将要介绍本书的第四章 算法基础。看了现在大概快一百页了。开始讲算法的基础了。希望有兴趣的朋友接下来持续关注。感谢您的欣赏。我是BurgessLee,一个编程小白,希望我们一起学习进步,期待您的加入。