《数据结构》笔记(上)

1.用语句的频度来分析算法的时间复杂度。
语句的频度是指语句在算法中被重复执行的次数。

2.空间复杂度是指该算法所耗费的存储空间。
算法原地工作是指算法所需的辅助空间为常量。

3.线性表是:具有相同数据类型的N个数据元素的有限序列。

线性表的顺序存储,又称为顺序表。

顺序表:用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素,在物理位置上也相邻。

顺序表最主要的特点是随机访问,即通过首地址和元素序号,就可以在O(1)时间内找到指定的元素。

顺序表的存储密度高,每个节点只存储数据元素。

顺序表的插入和删除操作,需要移动大量元素。

4.单链表可以解决顺序表需要大量连续存储单元的缺点。

在单链表第一个结点之前,附加一个结点成为头结点

头指针始终指向链表的第一个结点。

建立单链表可以使用头插法也可以使用尾插法。

单链表的结点中只有后继指针,使得单链表只能从头结点依次顺序的向后遍历。

5.为了克服单链表的缺点,引入了双链表。

双链表街点钟有两个指针,分别指前继结点和后继结点。

双链表,插入和删除操作的时间复杂度仅为O(1)

6.循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而是指向头结点。

循环单链表的判空条件是头结点的指针,是否等于头指针。

7.当循环双链表为空表时,头结点的prior 与和next 都等于L。

静态链表,是借助数组来描述线性表的链式存储结构。

通常较稳定的线性表选择顺序存储,而频繁进行插入、删除操作的线性表则选择链式存储。

8.栈是只允许在一端进行插入或删除操作的线性表。
栈允许在栈顶进行插入、删除,而栈底是固定的。

栈的操作特性,可以概括为后进先出。

顺序栈,利用一组地址连续的存储单元,存放自栈底至栈顶的数据元素,同时附设一个指针指向当前栈顶元素的位置。

顺序栈,使用空间不足时,可能发生栈上溢。

9.共享栈利用栈底位置相对不变的特性,可以让两个顺序栈共用一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。

采用链式存储的栈称为链栈。链栈的优点是便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。

链栈通常采用单链表实现,并规定所有操作,都是在单链表的表头进行。

10.队列也是一种操作受限的线性表,只允许在表的一端进行插入在表的另一端进行删除。

队列的操作特性是先进先出。

队列的顺序存储是指分配一组连续的存储单元存放队列中的元素,并设有两个指针,队头指针指向队头元素,队尾指针指向队尾元素的下一个位置。

循环队列:可以把存储队列元素的表,从逻辑上视为一个环

链式队列特别适合用于数据元素变动比较大的情形,且不存在队列满且产生溢出的问题。

双端队列是指允许两端都可以进行入队和出对操作的队列,元素的逻辑结构仍是线性结构。

11.栈的应用:在括号匹配中的应用、在表达式求值中的应用、在递归中的应用。

队列的应用:在层次遍历中的应用、打印机的应用

12.矩阵的压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间,其目的是为了节省存储空间。

稀疏矩阵是指矩阵中非零元素的个数,非常非常少。

稀疏矩阵压缩存储后便失去了随机存储的特性。

13.字符串的模式匹配算法:K M P算法

K M P算法的原理:

K M P算法的优化:

14.树是一种递归的数据结构,除跟节点外的所有节点有且只有一个前驱,所有节点可以有零个或多个后继。

树适合于表示具有层次结构的数据。

二叉树的特点是:每个节点至多有两棵子树,并且二叉树的子树有左右之分,次序不能随意颠倒。

二叉树中不存在度大于二的节点。

二叉树是有序树,即使树中节点只有一棵子树,也要区分他是左子树还是右子树。

二叉树与度为2的有序树是有区别的。

度为2的树至少有三个节点,但二叉树可以为空。

满二叉树的叶子节点都集中在二叉树的最下一层,并且除叶子节点之外的,每个节点度数均为二。

完全二叉树就是对应相同高度的满二叉树缺失最下层最右边的一些连续叶子节点。

二叉排序树的左子树上所有节点的关键字均小于根节点的关键字,右子树上的所有节点的关键字均大于根节点的关键字。左子树和右子树又各是一颗二叉排序树。

平衡二叉树,树上任意节点的左子树和右子树的深度之差不超过一。

二叉树的顺序存储是指用一组地址连续的存储单元,依次自上而下,自左至右存储完全二叉树上的节点元素。

完全二叉树和满二叉树采用顺序存储是比较合适的。树中节点的序号可以唯一的反映节点之间的逻辑关系,这样也能最大可能地节省存储空间,又能利用数组元素的下标值确定节点在二叉树中的位置以及节点之间的关系。

其他的二叉树一般采用链式存储结构。

在含有N个节点的二叉树链表中,含有N+1空链域。

二叉树的遍历是指按某条搜索路径访问树中每个节点,使得每个节点均被访问一次,而且仅被访问一次。

常见的遍历有:先序遍历,中序遍历和后序遍历三种

先序遍历:先访问根节点,访问左子树,访问右子树。

中序遍历:访问左子树,访问根节点,访问右子树。

后序遍历:

在递归遍历中,递归工作栈的栈深恰好为树的深度,遍历算法的空间度为O(n)

要进行层次遍历,需要借助一个队列。先将二叉树的根节点入队,然后出队,访问出队节点。若有左子树,则将左子树根节点入队,若有右子树,则将右子树根节点入队。然后出队,访问出队节点……如此反复,直到队列为空。

由二叉树的先序序列和中序序列,可以唯一的确定一颗二叉树。

有二叉树的后序序列和中序序列,也可以唯一的确定一颗二叉树。

引入线索二叉树,是为了加快查找节点前驱和节点后继的速度。

线索二叉树的规定是,若无左子数lchild 指向其前驱节点,若无右子树令rchild 指向后继节点。
另外还需要增加两个标识域标识指针域是指向左孩子还是指向前驱。

二叉树的线索化,是将二叉链表中的空指针改为指向前驱或者后继的线索,因此线索化的实质就是遍历一次二叉树。

树的存储结构通常有三种:双亲表示法、孩子表示法、孩子兄弟表示法。

双亲表示法,利用了每个节点(除根节点外)只有唯一双亲的性质,可以很快得到每个节点的双亲节点,但求节点的孩子时需要便利整个结构。

孩子表示法,是将每个节点的孩子节点都用单链表链接起来,形成一个线性结构。此时N个节点,就N个孩子链表。

孩子兄弟表示法:

树转为二叉树的规则是:每个节点左指针指向他的第一个孩子,右指针指向他在树中的相邻右兄弟,这个规则又称左孩子又兄弟。

二叉排序树,其左子树节点值 < 根节点值 < 右子树节点值,所以对二叉排序树进行中序遍历可以得到一个递增有序序列。

二叉排序树的查找:

二叉排序树作为一种动态数表,其特点是树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字值等于给给定的节点时,再进行插入的。
插入的节点一定是一个新添加的叶子结点,且是查找失败时的查找路径上访问的最后一个节点的左孩子或右孩子。

二叉排序树的查找效率,主要取决于树的高度。
如果是平衡二叉树,平均查找长度为log2n
最坏情况的平均查找长度为n

从查找过程看,二叉排序树与二分查找相似。

平衡二叉树,他的左子树和右子树都是平衡二叉树,且左子树和右子树的高度差绝对值不超过一。

在含有n个带权叶结点的二叉树中,其带权路径长度最小的二叉树称为哈夫曼树。也称最优二叉树。

哈夫曼编码是一种被广泛应用,而且非常有效的数据压缩编码。

图的顶点集一定是非空的,但边集可以为空。

完全图:任意两个顶点之间都存在边

有向完全图:任意两个顶点之间都存在方向相反的两条弧。

连通图:在无向图中任意两个顶点都是相通的。

强连通图:在有向图中,

顶点的度:

连通图的生成树:包含图中全部顶点的一个极小连通子图(图是连通的且边数最少的子图)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值