随笔分类 - 数据结构
摘要:稀疏矩阵的加法 传统矩阵的加法 矩阵相加的前提是两个矩阵的行数和列数相等,将矩阵的每个元素对应相加即可。 void NormalAddMatrix(int A[][N], int B[][N], int C[][N]){ for(int i = 0; i < m; i ++ ) for(int j
阅读全文
摘要:稀疏矩阵 稀疏矩阵的定义 在矩阵中,若数值为 0 的元素数目远远多于非 0 元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵。 假设在 m * n 的矩阵中,有 t 个非 0 元素,令 δ = t / (m * n) ,则 δ 为矩阵的稀疏因子。 稀疏矩阵的压缩存储 三元组表示法 稀疏矩
阅读全文
摘要:AVL树的基本概念 AVL树的定义 AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis。 AVL树本质上是一颗二叉搜索树,并且本身带有平衡的条件,即每个结点的左右子树的高度之差的绝对值(平衡因子)最多为1。 AVL树可以始终将其高度控制在 ,从而保证AVL树的
阅读全文
摘要:二叉树的层次遍历 层次遍历的思路 二叉树的层次遍历本质上用的是广度优先搜索算法,我们通常使用队列来实现这一过程。 层次遍历的基本步骤 (1)先将二叉树的根节点放入队列中; (2)取队首节点值,队首节点出队,将节点的左右子树根节点入队; (3)重复步骤(2),直到队列为空。 层次遍历图解 自建队列层次
阅读全文
摘要:二叉搜索树 二叉搜索树的基本概念 二叉搜索树( Binary Search Tree )也称二叉排序树,是一种各节点值之间存在一定次序关系的二叉树。 二叉搜索树的特点 一般情况下,二叉搜索树中所有节点值是不重复的。 对于二叉搜索树中的每个节点: (1)如果其左子树不为空,那么其左边的节点值都比当前节
阅读全文
摘要:二分查找 二分查找 二分查找(Binary Search)也叫作折半查找,前提是查找的顺序结构是有序的,我们一般在数组上进行二分查找。 二分查找就好像猜数字大小游戏一样。假设要数字目标值属于 [1, 1000] 范围内,当我们猜的数字小于这个目标值时("Too low"),我们需要往大去猜;反之大于
阅读全文
摘要:哈希表 哈希表的基本概念 哈希表 Hash table 是一种提供快速查找和插入元素的数据结构,也称散列表。哈希表是基于数组的扩展,一般利用数组的下标作为哈希表的键值。 哈希表存储的是由键(key)和值(value)组成的数据。键值 key 是由哈希函数得到的。 哈希函数 除留余数法 除留余数法是一
阅读全文
摘要:树的遍历 树的遍历方式有先根遍历和后根遍历。在下面树的遍历中,采用的都是孩子兄弟表示法构建的树。 树的先根遍历 树的先根遍历步骤 先根遍历就是先访问树的根节点,然后再依次访问树的孩子们。在这里我们需要用递归函数来实现树的先根遍历,先打印当前节点的数据,然后再递归访问其第一个孩子,再递归访问当前节点的
阅读全文
摘要:树 树的表示方法 双亲表示法 用一组地址连续的存储单元来存放树中的各个节点,每一个节点中有一个数据域和一个指针域,数据域用来存储树中该节点本身的值;另一个指针域用来存储该节点的双亲节点在存储结构中的位置信息。 采用双亲链表存储方式实现查找一个指定节点的双亲节点比较方便,但难以实现查找一个指定节点的孩
阅读全文
摘要:哈夫曼树 哈夫曼树简介 给定 N 个权值作为 N 个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树( Huffman Tree )。 哈夫曼树涉及的基本概念 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子结点之间的通路,称为路径。通路中分
阅读全文
摘要:前中后序遍历 前中后序遍历的特点 前序遍历 前序遍历顺序:根节点 -> 左子树 -> 右子树 前序遍历结果:[根节点,[左子树前序遍历结果],[右子树前序遍历结果]] 假如把前序遍历结果存到数组中,数组中的第一个元素就是二叉树根节点的数据,而且还可以知道第二个元素是根节点左孩子的数据,即左子树根节点
阅读全文
摘要:二叉树的遍历 主要的三种遍历方式 二叉树主要的遍历方式有前序遍历、中序遍历和后序遍历。 (1)前序遍历:根节点-->左子树-->右子树 (2)中序遍历:左子树-->根节点-->右子树 (3)后序遍历:左子树-->右子树-->根节点 其实还有一种比较基础的遍历方式是层次遍历,但是在本篇文章中不会涉及层
阅读全文
摘要:字符串匹配问题 给定一个字符串 s 和一个要匹配的模式串 p。模式串 p 有可能在 s 中多次出现,请求出模式串 p 在 s 中所有出现的起始位置。 暴力匹配算法 BF 算法思路 在面对字符串匹配问题时,很容易想到暴力求解。字符串匹配的暴力算法思路很简单,即在 s 中枚举起点 i,对于每个起点匹配字
阅读全文
摘要:队列 队列基本概念 队列( queue )是一种特殊的线性表结构,只从队尾插入新的元素,并且只从队首弹出元素。一般将队尾称为 rear,队首称为 front 。 队列基本操作 (1)入队:从队尾 rear 插入新元素; (2)出队:从队首 front 弹出元素。 队列的特性 队列遵循 先进先出 的原
阅读全文
摘要:栈 栈的概念 栈(stack)是一种特殊的线性表存储结构,其一端可以进行插入和弹出的操作,而另一端是封死的。 可以把栈想象成是一个柱状的容器。就比如一个乒乓球筒,我们只能在筒的一段进行乒乓球的放入和取出。 栈顶和栈的两种操作 栈顶就是栈的开口端,每次都是在栈顶处插入元素和删除元素。 (1)入栈:将新
阅读全文
摘要:插入排序 插入排序回顾 我们先回顾一下对数组的插入排序,其步骤大致为: 先将第一个数据元素看作是一个有序序列,后面的 n-1 个数据元素看作是未排序序列。对后面未排序序列中的第一个数据元素在这个有序序列中进行从后往前扫描,找到合适的插入位置并插入到其中,每次有序序列的长度 +1。 重复这样的操作,将
阅读全文
摘要:双向链表 双向链表概念 双向链表也叫双链表,其每个数据结点中都有两个指针,分别指向直接后继和直接前驱。在单向链表中若要找到某个节点的前驱节点,需要先遍历到这个节点,然后再遍历一次找到其前驱节点,这无疑是十分低效的。而双向链表可以做到正向反向遍历,由此相比单向链表可以更高效地找到某个节点的前驱节点。
阅读全文
摘要:单向链表的去重 问题描述及分析 给定一个有序的链表,去除重复出现的元素,使每个元素只出现一次。例如一个单向链表为 1->1->2->2->3->4->4->∅ , 那么去重后得到的单向链表为 1->2->3->4->∅ 。 这里的链表保证是有序的,所以出现的重复元素都是相邻的,所以对整个链表进行一次
阅读全文
摘要:单向链表的翻转 单向链表翻转 思路 假设链表是: 1->3->5->∅,所要求得的链表是 5->3->1->∅。只需要将每个节点的 next 指向其之前的一个节点即可。 对于第一个节点,如果是头节点不带数据的链表,那么只需要将其 next 指向 head;如果头节点带数据,第一个节点的 next 指
阅读全文
摘要:单向链表 什么是单向链表 链表是一种物理储存单元上非连续、非顺序的储存结构。它由一系列结点(链表中每一个元素称为结点)组成,结点可动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 其实可以形象的认为,单向链表就好像一列火车。🤔 链表的节点就好像火车的
阅读全文