数据结构和算法

  1. 概述

对于这一章,我们首先了解一些概念

先是数组和矩阵,我们会了解基本概念,并且了解其在内存的计算方式

然后是线性表,其常见的队列和栈的概念,以及其相关的计算题

广义表,只是了解其基本定义即可

树和二叉树,了解基本概念和使用场景

图,一种特别的数据结构,只需要了解其定义

排序和查找算法,需要详细了解相关的算法和计算题

  1. 数组

对于数组,我们主要了解其计算方式,一般来说,分为一维数组和多维数组

对于一维数组的计算方式,可以简化为 a+i*len

对于多维数组,比如a[m][n],如果是按行存储,计算方式为 a + (i* n+j) * len

如果是按列存储,则计算方式为a + (j*m + i) * len

比如5行5列的二维数组,按行存储,每个元素占两个字节,那么a[2][3]的存储地址为

(2*5 + 3 ) * 2

  1. 矩阵

对于矩阵,经常考试的是稀疏矩阵,其可以分为上三角矩阵和下三角矩阵

计算公式也不一样,上三角的为(2n – i + 1)* i/2 + j

下三角的为(i + 1)* i/2 + j

这样背公式进行计算也可以,或者使用带入法,这里以例题举例

上面的图进行计算的话,首先带入A0,0

一般得到的是应该是 M1才是,因为数组从M1-Mm

带i=0 j=0,可以排除B C

然后再代入A1,1,应该得到M3,故得到D是正确的答案

  1. 基本的数据结构定义

可以分为线性结构

比如数组和列表

非线性结构,比如树或者图

  1. 线性表的定义

常见的数据结构有 顺序表和链表

对于顺序表,基本的表现形式如下

其次是链表,分为了单链表和循环链表和双向链表

单链表是依次查找

对于循环链表,则是在链表的结尾处有一个指向head的引用

对于双向链表,则是每个节点都保留前一个和后一个的引用

对于不同的链表,主要的考试形式是考验不同类型的链表的插入和删除形式

然后是链式存储和顺序存储的对比,基本可以如下

比如存储密度来说,数组更加占有,因为链表需要存储引用

而数组,需要提前分配内存,从这方面链表更加的灵活

对于时间性能,则是查找的一样的性能,都需要遍历

对于读取,如果知道下标,则数组更快,除此外。

但是对于插入,因为数组可能涉及到往后插入,所以性能并不强力

同理删除也是

对于队列和栈来说

存取的方式不一样,一个是先进先出,一个是先进后出

对于队列就是先进先出,对于栈来说,就是先进后出

然后是一个特别的数据结构,循环队列

这个队列判断队空和队满的方式很好玩,基本如上的计算,如果head=tail就是队空

如果是tail + 1 % size = head就是队满

这里我们看一个例题,一般是求出队顺序的题

上面这道题,我们可以直接排除e4

然后看剩下三个顺序

对于e3 e2 e1,只需要全部从左侧进队即可

对于e2 e1 e3,只需1和2从左侧,3从右侧进队即可

对于e3 e1 e2,只需要1 2从右侧进队,3从左侧进队即可

然后是广义表这个概念

一般是n个表元素组成的有限序列,是一种以递归形式定义的,

其中a是数据元素,可以是一个单一元素,也可以是一个子表

然后是一些概念

长度:是最外层包含的元素个数

深度:递归定义的重数

然后是head和tail的概念,head是表头,tail是除了表头之外的全部数据

就比如有一个广义表 LS1=(a,(b,c),(d,e))

Head就是 a, tail就是 (b,c),(d,e)

长度就是3,深度就是2

如果希望取出b字母,则需要进行 head(head(tail()))

查找二叉树

是二叉排序树的一种,这个树中,遵循左孩子小于根,右孩子大于根的定义

在这个树中,如果是插入,则首先根据二叉树进行查找,如果已经存在,则不再插入

这个查找的过程会不断地进行比较,然后选择左子节点或者右子节点,直到叶子节点

如果是删除,则需要判断,如果删除的节点是叶子结点,直接删除

不然就是查找左子树查找关键值最大的结点s,然后让其和删除节点替换后删除应该删除的节点

哈夫曼二叉树,用于无损压缩的二叉树

主要是了解一些概念,了解如何做题

对于概念,则是需要了解树的路径长度,权,带全路径长度

从15-2中需要走两个节点的距离,所以路径长度就是2

每个节点上的数字就是权

计算带权路径长度,假设2,节点,权重是2,长度是2,带权路径长度就是4

树的代价就是所有带权路径长度之和

需要注意的是霍夫曼二叉树,只有叶子节点是真的,中间节点是用方便计算的虚拟节点

然后考题除了计算总代价

还有构造哈夫曼树,只需要记住一点,约小的节点越靠下,比如

图示

描述已自动生成

线索二叉树

二叉链表的存储结构,只能找到该结点的左右孩子,不能得到该结点在遍历过程中的遍历前驱和直接后继结点。二叉链表存储二叉树时,有2n个指针域,其中n+1个都为空指针域。

利用空指针域存储结点遍历过程中的前驱和后继结点,使结点之间组成联系,在遍历的过程中可以不用通过栈或递归。

线索 二叉树的作用:

将树转换成线性链表,二叉树在首次遍历中线索化,在需要时可以直接获得结点的前驱和后继,不需要像栈一样频繁的压栈出栈。

可以分为

前序线索二叉树,中序线索二叉树,后序线索二叉树

按照前序和中序,后序进行划分,

最后是平衡二叉树

主要是为避免二叉树的倾斜,提出了平衡二叉树的定义

任意结点的左右子树的深度之差不超过1,

不同形状的钟表

描述已自动生成

发表评论

邮箱地址不会被公开。 必填项已用*标注