数据结构--树和二叉树
树和二叉树的定义
树的定义
树是一种非线性的数据结构,它模拟了具有层次关系的数据的集合。在树结构中,存在以下基本概念:
- 节点(Node):树的每个元素被称为节点。
- 根节点(Root Node):树的最顶层的节点,它是树的起点。
- 子节点(Child Node):一个节点之下的节点被称为其子节点。
- 父节点(Parent Node):若一个节点有子节点,则它被称为其子节点的父节点。
- 兄弟节点(Sibling Nodes):具有相同父节点的节点互为兄弟节点。
- 叶子节点(Leaf Node):没有子节点的节点被称为叶子节点。
- 度(Degree):一个节点的子节点数量称为该节点的度。(树的度和节点的度)
- 树的度:树中节点的最大度称为树的度。
- 层次(Level):从根节点开始,根节点为第一层,其子节点为第二层,以此类推。
- 树的高度(或深度):树中节点的最大层次数。
- 有序树:树中节点的子节点从左到右是有次序的,不能互换。
- 无序树:树中节点的子节点没有固定的次序。
- 森林:零个或多个不相交的树组成的集合。
树的特点
-
它包含一个或多个结点。
-
每个结点可以有0个或多个子结点。
-
每个子结点只有一个父结点。
-
存在一个唯一的根结点,它没有前驱结点。
-
除了根结点外,每个子结点都可以看作是一个新的树的根,这个新的树(子树)与树的其他部分是不相关的。
-
路径唯一性:在树中,从根节点到任何节点的路径都是唯一的。这一特性确保了数据在树结构中的唯一性和确定性。
-
子树独立性:除了根节点外,每个节点都可以看作是一个新的树的根,即子树。这些子树与树的其他部分是不相关的,即它们之间没有直接的连接。这种独立性使得树结构在表示复杂数据时具有更高的灵活性和可扩展性。
-
有序性与无序性:虽然一般树中的子节点没有固定的顺序,但在某些特殊类型的树(如二叉搜索树)中,子节点是按照一定的顺序排列的。这种有序性有助于实现高效的查找和排序操作。然而,在一般树中,子节点的排列通常是无序的。
-
节点度数可变:在树中,节点的度数(即子节点的数量)是可变的。这意味着一个节点可以有任意数量的子节点(在一般树中)或最多两个子节点(在二叉树中)。这种灵活性使得树能够适应不同规模和数据复杂度的需求。
-
可遍历性:树结构支持多种遍历方式,如先序遍历、中序遍历、后序遍历和层次遍历等。这些遍历方式使得我们能够以不同的顺序访问树中的节点,从而满足不同的数据处理需求。
二叉树的定义
二叉树是树的一种特殊形式,它的每个节点最多有两个子节点,分别被称为左子节点和右子节点。
二叉树与数主要有以下区别:
- 二叉树每个结点至多只有两颗子树(即二叉树中不能存在度大于 2 的结点)
- 二叉树的子树有左右之分,其次序不能任意颠倒
- 即使树中某结点只有一棵子树,也要区分它是左子树还是右子树
二叉树具有以下特性:
- 二叉树的度:二叉树的度最大为2,即每个节点最多有两个子节点。
- 左子树和右子树:对于二叉树的每个节点,其左子树上的所有节点的值都小于该节点的值,而右子树上的所有节点的值都大于该节点的值(这一特性在二叉搜索树中尤为重要)。
- 满二叉树:除了叶子节点外,每个节点都有两个子节点的二叉树被称为满二叉树。
- 完全二叉树:若一个二叉树在层序遍历下,前面的节点都是满的,且后面的节点都是连续的叶子节点,则这个二叉树被称为完全二叉树。
二叉树的5种基本形态:
1.空二叉树
2.只有一个根节点
3.根节点只有左子树
4.根节点只有右子树
5.根节点既有左子树,又有右子树
树和二叉树的抽象数据类型定义
树的抽象数据类型定义(ADT for Trees)
数据对象:T
数据成员:
- 节点(Node):每个节点包含一个数据元素以及指向其子节点的指针(或引用)。
基本操作:
- CreateTree():创建一个空树,返回树的根节点指针(或引用)。
- DestroyTree(T):销毁树T,释放其占用的所有内存。
- InsertNode(T, data, parentNode):在树T中,向指定父节点parentNode下插入一个新节点,新节点的数据为data。
- DeleteNode(T, node):从树T中删除指定节点node。
- FindNode(T, data):在树T中查找数据为data的节点,返回找到的节点指针(或引用),若未找到则返回空。
- TraverseTree(T, visitorFunction):按照某种遍历方式(如深度优先或广度优先)遍历树T,并对每个节点执行visitorFunction函数。
- GetRootNode(T):返回树T的根节点指针(或引用)。
二叉树的抽象数据类型定义(ADT for Binary Trees)
数据对象:BT
数据成员:
- 节点(Node):每个节点包含一个数据元素,以及指向其左子节点和右子节点的指针(或引用)。
基本操作:
- CreateBinaryTree():创建一个空二叉树,返回二叉树的根节点指针(或引用)。
- DestroyBinaryTree(BT):销毁二叉树BT,释放其占用的所有内存。
- InsertLeft(BT, parentNode, data):在二叉树BT中,向指定父节点parentNode的左子树插入一个新节点,新节点的数据为data。
- InsertRight(BT, parentNode, data):在二叉树BT中,向指定父节点parentNode的右子树插入一个新节点,新节点的数据为data。
- DeleteNode(BT, node):从二叉树BT中删除指定节点node,保持二叉树的性质(如二叉搜索树的性质)。
- FindNode(BT, data):在二叉树BT中查找数据为data的节点,返回找到的节点指针(或引用),若未找到则返回空。
- InorderTraversal(BT, visitorFunction):对二叉树BT进行中序遍历,并对每个节点执行visitorFunction函数。
- PostorderTraversal(BT, visitorFunction):对二叉树BT进行后序遍历,并对每个节点执行visitorFunction函数。
- PreorderTraversal(BT, visitorFunction):对二叉树BT进行前序遍历,并对每个节点执行visitorFunction函数(注意:在某些定义中,前序遍历可能不被视为二叉树的基本操作,但它是常见的遍历方式)。
- LevelOrderTraversal(BT, visitorFunction):对二叉树BT进行层序遍历,并对每个节点执行visitorFunction函数。
- GetRootNode(BT):返回二叉树BT的根节点指针(或引用)。
二叉树的性质和存储结构
二叉树的性质
- 定义:
- 二叉树(Binary Tree)是树形数据结构的一种,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。
- 特殊的二叉树包括满二叉树、完全二叉树和平衡二叉树等。
- 基本性质:
- 递归定义:二叉树要么是空树,要么由一个根节点和左、右两棵互不相交的二叉树组成。
- 节点数目:
- 对于一个非空二叉树,若其深度为h,则最多有 2h−1 个节点(满二叉树的情况)。
- 在第i层(i从1开始计数)上最多有 2i−1 个节点。
- 边数目:
- 对于一个有n个节点的二叉树,边数为 n−1。
- 叶子节点数目:
- 对于一个非空二叉树,若其总结点数为n,则叶子节点数目在 [2n,n−1] 之间。
- 完全二叉树性质:
- 在完全二叉树中,除了最后一层外,每一层都是满的,且最后一层的节点都靠左对齐。
性质1:在二叉树的第i层上至多有2i-1个结点(i>=1)
性质2:深度为k的二叉树至多有2k-1个结点(k>=1)
性质3:对任何一棵二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则n0 = n2+1
- 遍历:
- 前序遍历(Preorder Traversal):根节点 -> 左子树 -> 右子树。
- 中序遍历(Inorder Traversal):左子树 -> 根节点 -> 右子树(适用于二叉搜索树)。
- 后序遍历(Postorder Traversal):左子树 -> 右子树 -> 根节点。
- 层次遍历(Level Order Traversal):按层次从上到下、从左到右遍历。
二叉树的存储结构
二叉树主要有以下几种存储方式:
链式存储结构:
- 每个节点包含三部分:数据域(存储节点的值)、左指针域(指向左子节点)、右指针域(指向右子节点)。
- 优点:节省空间,适合表示稀疏二叉树。
- 缺点:需要额外的指针空间,访问某个节点时需要通过指针操作,相对复杂。
顺序存储结构:
- 使用数组来存储二叉树的节点,通常适用于完全二叉树或接近完全二叉树的情况。
- 假设根节点在数组的第1个位置(索引为0的位置可以不用或用于表示空节点),则对于任意节点i:
- 左子节点的索引为 2i
- 右子节点的索引为 2i+1
- 父节点的索引为 ⌊2i⌋
- 优点:访问节点速度快,数组操作相对简单。
- 缺点:空间利用率低,对于非完全二叉树会有大量的空间浪费。
遍历二叉树和线索二叉树
二叉树的遍历(Java)
在Java中,二叉树的遍历可以通过递归或迭代的方式实现。以下是四种基本遍历方式的递归实现:
- 前序遍历(Pre-order Traversal):
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) {val = x;}
}public class BinaryTreeTraversal {public void preorder(TreeNode root) {if (root != null) {System.out.print(root.val + " "); // 访问当前节点preorder(root.left); // 遍历左子树preorder(root.right); // 遍历右子树}}
}
- 中序遍历(In-order Traversal):
public class BinaryTreeTraversal {public void inorder(TreeNode root) {if (root != null) {inorder(root.left); // 遍历左子树System.out.print(root.val + " "); // 访问当前节点inorder(root.right); // 遍历右子树}}
}
- 后序遍历(Post-order Traversal):
public class BinaryTreeTraversal {public void postorder(TreeNode root) {if (root != null) {postorder(root.left); // 遍历左子树postorder(root.right); // 遍历右子树System.out.print(root.val + " "); // 访问当前节点}}
}
- 层次遍历(Level-order Traversal)(通常使用队列实现):
import java.util.LinkedList;
import java.util.Queue;public class BinaryTreeTraversal {public void levelorder(TreeNode root) {if (root == null) return;Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {TreeNode node = queue.poll();System.out.print(node.val + " ");if (node.left != null) queue.add(node.left);if (node.right != null) queue.add(node.right);}}
}
线索二叉树(Threaded Binary Tree)
线索二叉树是一种特殊的二叉树,在这种树中,空的左孩子或右孩子指针被用来存储指向中序遍历前驱或后继节点的指针,这种指针被称为线索(thread)。
在Java中实现线索二叉树涉及更多细节,包括定义节点类以包含额外的线索信息和维护线索状态(左线索、右线索或正常指针)。此外,还需要实现构建线索二叉树和遍历线索二叉树的算法。
由于实现线索二叉树涉及较为复杂的指针操作和树结构的修改,这里只提供一个线索二叉树节点类的基本定义和构建线索的伪代码思路。
enum PointerTag { LINK, THREAD }class ThreadedNode {int val;ThreadedNode left, right;PointerTag leftTag, rightTag;ThreadedNode(int x) {val = x;left = right = null;leftTag = rightTag = PointerTag.LINK;}
}// 伪代码思路:
// 1. 中序遍历二叉树,同时设置线索。
// 2. 在遍历过程中,根据节点的左/右孩子是否为空来设置相应的线索和标签。
// 3. 需要注意维护一个前驱节点变量来设置后继线索。// 注意:这里的代码只是一个框架和思路,实际实现需要更详细的逻辑和错误处理。
树和森林
树(Tree)
- 定义:
- 树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素被称为树的结点,所定义的关系称为父子关系。
- 当集合为空时,称为空树;当集合非空时,有且仅有一个特定的结点被称为根结点。
- 基本术语:
- 结点:包含一个数据元素及若干指向其子树的分支。
- 结点的度:一个结点拥有的子树的数目。
- 叶子或终端结点:度为0的结点。
- 非终端结点或分支结点:度不为0的结点。
- 树的度:树内各结点的度的最大值。
- 孩子结点或子结点:结点的子树的根称为该结点的孩子结点或子结点。
- 双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的双亲结点或父结点。
- 兄弟结点:同一个双亲的孩子之间互称兄弟。
- 祖先结点:从根到该结点所经分支上的所有结点。
- 子孙结点:以某结点为根的子树中任一结点都称为该结点的子孙。
- 结点的层次:从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第i层,则其子树的根就在第i+1层。
- 树的深度或高度:树中结点的最大层次。
- 存储结构:
- 双亲表示法:用一个一维数组存储每个结点,数组的下标就是结点的指针位置,每个结点包括一个数据域和与指向父亲结点的数组下标的域。
- 孩子链表表示法:用一个线性表来存储树的所有结点信息,称为结点表。每个结点的孩子结点排列起来,看成一个线性表,用单链表存储。
- 孩子兄弟表示法:又称二叉树表示法,每个结点除了数据域外,还包含第一个孩子和右邻兄弟。
- 遍历:
- 先序遍历:访问树的根结点;从左到右,依次先序遍历根的每棵子树。
- 后序遍历:从左到右,依次后序遍历根的每棵子树;访问树的根结点。
森林(Forest)
- 定义:
- 森林是m棵互不相交的树的集合。
- 与树的关系:
- 对树中的每个结点而言,其子树的集合即为森林。
- 删去一棵树的根,就得到一个森林;反之,加上一个结点作为树根,森林就变为一棵树。
- 遍历:
- 先序遍历:访问森林第一棵树的根结点;先序遍历第一棵树中根结点的子树森林;先序遍历除去第一棵树后剩余的树构成的森林。
- 中序遍历:中序遍历第一棵树中根结点的子树森林;访问森林中第一棵树的根结点;中序遍历除去第一棵树后剩余的树构成的森林。
- 后序遍历:中序遍历第一棵树中根结点的子树森林;中序遍历除去第一棵树后剩余的树构成的森林;访问森林中第一棵树的根结点。
树与二叉树的转换
- 树转化二叉树:
- 顺序连接同一结点的兄弟结点。
- 保留每个结点到其第一个孩子结点的连接作为该结点的左孩子结点,删除这个结点到其他孩子结点的连接。
- 以树的根结点为中心,顺时针旋转一定角度,使得结构层次分明。
- 二叉树还原为树或森林:
- 按层次序列对二叉树的每个结点做操作。
- 如果是根结点或者是左孩子结点,则不做任何改动。
- 如果是右孩子,将其当前父亲的父亲设置为当前结点的父结点,若其当前父亲的父亲为空,则改动后其父亲为空。
树和森林的遍历
树的遍历
对于一棵树,主要有以下几种遍历方法:
- 先序遍历(Preorder Traversal):
- 访问根结点。
- 依次先序遍历每个子树。
- 对于每个子树,重复上述步骤。
- 中序遍历(Inorder Traversal,但通常不用于树,而更多用于二叉树):
- 在树结构中,中序遍历不是标准遍历方式,因为它在二叉树中有特定意义(先遍历左子树,然后访问根,最后遍历右子树)。
- 但在某些特殊类型的树(如二叉搜索树)或特定应用中,可能会定义类似中序的遍历方式。
- 后序遍历(Postorder Traversal):
- 依次后序遍历每个子树。
- 访问根结点。
- 层次遍历(Level Order Traversal):
- 按层次从上到下、从左到右遍历结点。
- 通常使用队列来实现。
森林的遍历
森林是由多棵树组成的集合。对于森林,可以将其视为由一棵虚拟的根结点连接的所有树的集合,然后应用树的遍历方法。但更常见的是,直接对森林中的每棵树分别进行遍历。
-
先序遍历森林:
- 对森林中的第一棵树进行先序遍历。
- 对森林中除去第一棵树后的剩余树构成的森林进行先序遍历。
-
中序遍历森林(不是标准方式,但可定义):
- 对森林中的第一棵树进行中序遍历(如果定义了树的中序遍历)。
- 访问虚拟的根结点(实际上在森林遍历中通常不显式访问)。
- 对森林中除去第一棵树后的剩余树构成的森林进行中序遍历。
注意:由于中序遍历在树结构中不是标准方式,因此这种中序遍历森林的定义也不是标准的。
-
后序遍历森林:
- 对森林中的第一棵树进行后序遍历。
- 对森林中除去第一棵树后的剩余树构成的森林进行后序遍历。
树与二叉树的转换及遍历
在将树转换为二叉树后,可以利用二叉树的遍历方法来间接实现树的遍历。转换规则如下:
- 树中的每个结点转换为二叉树中的一个结点。
- 树中结点的第一个孩子转换为二叉树中的左孩子。
- 树中结点的其他兄弟依次转换为二叉树中右孩子的右孩子(形成一条右链)。
转换后的二叉树可以使用二叉树的遍历方法(前序、中序、后序、层次)进行遍历。由于树转换为二叉树后,树的先序遍历与二叉树的前序遍历对应,树的后序遍历与二叉树的中序遍历(左-根-右,但这里的“根”实际上是原树中结点的最后一个孩子,而访问顺序是最后一个孩子-根-其他兄弟形成的右链)有某种对应关系(但需要注意,这种对应不是直接的,因为二叉树的中序遍历在访问根结点前会先访问左子树,而树的后序遍历则不会这样)。然而,通常不直接使用二叉树的中序遍历来表示树的后序遍历,而是使用递归或迭代的方法直接实现树的后序遍历。
哈弗曼树及其应用
哈夫曼树(Huffman Tree),又称最优二叉树,是一种重要的数据结构,在计算机科学中有着广泛的应用。以下是对哈夫曼树及其应用的详细介绍:
哈夫曼树的定义
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度(WPL)达到最小,则称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树的特点是权值较大的结点离根较近,从而保证了整体带权路径长度的最小化。
哈夫曼树的构造
哈夫曼树的构造过程是一个自底向上的过程,具体步骤如下:
- 将给定的N个权值视为N棵只有根结点的二叉树(森林)。
- 在森林中选出两个根结点权值最小的树进行合并,作为一棵新树的左、右子树,新树的根结点权值为其左、右子树根结点权值之和。
- 从森林中删除这两个已合并的树,并将新树加入森林。
- 重复上述步骤,直到森林中只剩下一棵树,这棵树即为所求得的哈夫曼树。
哈夫曼树的应用
哈夫曼树的主要应用之一是数据压缩,特别是在通信、文件压缩、图像压缩和音频编码等领域。以下是哈夫曼树在数据压缩中的具体应用:
-
哈夫曼编码:
- 哈夫曼编码是一种基于哈夫曼树的变长编码方法。在编码过程中,根据字符出现的频率构建哈夫曼树,并生成对应的编码表。高频字符使用较短的编码,低频字符使用较长的编码。
- 编码时,将字符替换为对应的二进制码。由于高频字符具有较短的编码,因此整体编码长度会显著减少,从而实现数据压缩。
-
数据压缩算法:
- 哈夫曼编码被广泛应用于各种数据压缩算法中,如JPEG图像压缩、MP3音频编码等。这些算法利用哈夫曼编码对图像、音频等数据进行压缩,以减少存储空间和传输时间。
-
通信中的信道编码:
- 在通信系统中,哈夫曼编码也被用于信道编码。通过将传输的字符替换为哈夫曼编码,可以减少传输所需的比特数,从而提高通信效率。
哈夫曼树的优点
- 高效性:哈夫曼树通过构建最优二叉树,实现了带权路径长度的最小化,从而提高了数据压缩的效率。
- 灵活性:哈夫曼树可以根据字符出现的频率动态调整编码长度,适用于不同类型的数据压缩需求。
- 广泛应用性:哈夫曼树在通信、文件压缩、图像压缩和音频编码等领域有着广泛的应用,为数据传输和存储提供了有效的解决方案。
相关文章:
数据结构--树和二叉树
树和二叉树的定义 树的定义 树是一种非线性的数据结构,它模拟了具有层次关系的数据的集合。在树结构中,存在以下基本概念: 节点(Node):树的每个元素被称为节点。根节点(Root Node)…...
R语言的数据结构-向量
【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 在R语言中,数据结构是非常关键的部分,它提…...
MetaGPT源码 (ContextMixin 类)
目录 理解 ContextMixin什么是 ContextMixin?主要组件实现细节 测试 ContextMixin示例:ModelX1. 配置优先级2. 多继承3. 多继承重写4. 配置优先级 在本文中,我们将探索 ContextMixin 类,它在多重继承场景中的集成及其在 Python 配…...
linux中top命令详解
top 命令是 Linux 系统中常用的实时系统监控工具,它可以显示系统的实时进程和资源占用情况。以下是 top 命令的一些基本用法和参数详解: 基本用法 • top:运行 top 命令,显示系统实时监控信息。 • top -h:显示帮助信…...
Scrapy与MongoDB
Scrapy可以在非常短的时间里获取大量的数据。这些数据无论是直接保存为纯文本文件还是CSV文件,都是不可取的。爬取一个小时就可以让这些文件大到无法打开。这个时候,就需要使用数据库来保存数据了。 MongoDB由于其出色的性能,已经成为爬虫的首…...
【Linux-ubuntu通过USB传输程序点亮LED灯】
Linux-ubuntu通过USB传输程序点亮LED灯 一,初始化GPIO配置1.使能时钟2.其他寄存器配置 二,程序编译三,USB传输程序 一,初始化GPIO配置 1.使能时钟 使能就是一个控制信号,用于决定时钟信号是否能够有效的传递或者被使用,就像一个…...
onlyoffice 容器配置修改后制作镜像导出以及上传到 dockerhub
1.将容器制作成新的镜像 docker commit -p -a "xxx" -m "zh-cn-20-100" onlyoffice ooffice:7.1.1.23docker commit: 这是 Docker 中用于创建新镜像的命令。 -p: 这个选项用于在提交之前暂停容器的运行。这可以确保数据的完整性,因为容器在提交…...
开发者如何使用GCC提升开发效率 Windows下Cmake + NDK 交叉编译 Libyuv
最近在导入其他项目的libyuv库,编译时发现如下问题,刚好想做一期libyuv编译与安装到AS中的文章,故记录集成的全过程 报错如下 error: no member named ABGRToNV21 in namespace libyuv; did you mean ARGBToNV21? error: no member named …...
前端H5移动端基础框架模板 :Vue3 + Vite5 + Pinia + Vant4 + Sass + 附源码
技术栈选用 Vue3 Vite5 Pinia Vant4 Sass 源码地址: git clone https://gitee.com/gaiya001/h5-APP.git1. 1.vite.config.js文件配置 ** import { defineConfig } from vite // 导入 Vite 的配置函数 import vue from vitejs/plugin-vue // 导入 Vue 插件 i…...
华为HCIP H12-821考试中心原题题库更新完成 展示如下
全题库506题,后期有更新会及时更新维护,确保答案正确率和原题覆盖率。 附上最新通过成绩单一张 今天新鲜出炉 ...
SQL Server:只有MDF文件,如何附加数据库
第一步:先新建一个同名数据库,然后停止sql服务,删除新建数据库.ldf文件。 第二步:将要附加的数据库的.mdf文件覆盖刚新建的.mdf文件,并重启sql服务。 第三步:这时数据库DATA目录下只有一个.mdf文件…...
nginx反向代理(负载均衡)和tomcat介绍
nginx的代理 负载均衡 负载均衡的算法 负载均衡的架构 基于ip的七层代理 upstream模块要写在http模块中 七层代理的调用要写在location模块中 轮询 加权轮询 最小连接数 ip_Hash URL_HASH 基于域名的七层代理 配置主机 给其余客户机配置域名 给所有机器做域名映射 四层代理…...
【前端】-【前端文件操作与文件上传】-【前端接受后端传输文件指南】
目录 前端文件操作与文件上传前端接受后端传输文件指南前端excel、word操作指南 excelword 前端文件操作与文件上传 一、前端文件上传有两种思路: 二进制blob传输:典型案例是formData传输,相当于用formData搭载二进制的blob传给后端base…...
Android IO 性能优化:全面解析与实践
文章目录 前言1、文件系统与 I/O 流程原理1.1 文件系统架构1.2 文件 I/O 流程 2、优化策略与场景适用2.1 异步 I/O2.2 合并文件操作2.3 页缓存优化2.4 内存映射文件 3. 性能监控与验证总结 前言 在现代 Android 应用中,I/O 性能直接影响用户体验。流畅的响应速度和…...
利用Docker分层构建优化镜像大小
合适docker镜像文件大小不仅影响容器启动效率,也影响资源占用效率。本文介绍如何利用分层方式构建docker镜像,采用多种方式避免镜像文件太大而影响性能。 Docker 镜像大小优化的重要性 资源利用效率 较小的镜像文件在存储和传输过程中占用更少的空间和带…...
【代码pycharm】动手学深度学习v2-09 Softmax 回归 + 损失函数 + 图片分类数据集
课程链接 1.读取图像分类数据集 import matplotlib.pyplot as plt import torch import torchvision from torch.utils import data from torchvision import transforms from d2l import torch as d2l d2l.use_svg_display() #读取数据集 transtransforms.ToTensor() mnist_…...
docker开启远程访问
1、编辑docker.server文件 vi /usr/lib/systemd/system/docker.service 找到 [Service] 节点,修改 ExecStart 属性,增加 -H tcp://0.0.0.0:2375 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:2…...
Maven插件打包发布远程Docker镜像
dockerfile-maven-plugin插件的介绍 dockerfile-maven-plugin目前这款插件非常成熟,它集成了Maven和Docker,该插件的官方文档地址如下: 地址:https://github.com/spotify/dockerfile-maven 其他说明: dockerfile是用…...
基于STM32的太阳跟踪系统设计
目录 引言系统设计 硬件设计软件设计系统功能模块 太阳位置检测模块伺服驱动控制模块反馈调整模块电源管理模块控制算法 太阳位置估算算法跟踪调整算法代码实现 太阳位置检测与估算伺服电机控制系统反馈与调整系统调试与优化结论与展望 1. 引言 太阳能是一种清洁、可再生的能…...
004-Redis 持久化
Redis 持久化 一、RDB 持久化1.优点:2.缺点:3.实现方式: 二、AOF 持久化1.优点:2.缺点:3.实现方式:4.重写机制5.重写流程: Redis 提供了两种主要的持久化方式:RDB 和 AOF 一、RDB 持…...
类OCSP靶场-Kioptrix系列-Kioptrix Level 1
一、前情提要 Kioptrix Level是免费靶场,可以自己百度下载。 开始前要先将靶机设置和kali同一个网络模式,我这里设置的是NAT。 接下来的靶机用kali进行演示。 二、打靶演示 这个靶机练习,相当于内网渗透。 1. 信息收集 1.1. 主机发现 …...
短视频矩阵系统功能介绍与独立部署流程
一、短视频矩阵系统功能介绍 短视频矩阵系统,作为当前短视频运营的重要工具,凭借其强大的功能,为内容创作者和企业提供了高效、便捷的短视频管理与运营方案。以下是对该系统核心功能的详细介绍: 多平台账号管理ÿ…...
【AI知识】人工智能、机器学习、深度学习的概念与联系
下图来自博客 机器学习和深度学习概念入门 ,图中可明显看到人工智能、机器学习、深度学习三个概念的包含关系,下面简单介绍一下这三个概念已经它们之间的联系。 1. 人工智能(Artificial Intelligence,AI) 概念&#x…...
今天你学C++了吗?——C++中的类与对象(日期类的实现)——实践与知识的碰撞❤
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
一个简单带颜色的Map
越简单 越实用。越少设计,越易懂。 需求背景: 创建方法,声明一个hashset, 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法,…...
前端工程化(三)
如何使用 Webpack 优化产出代码? 使用 Webpack 优化产出代码可以通过以下几种方式: 压缩代码:在生产环境中,使用 UglifyJSPlugin 或 TerserPlugin 等插件对代码进行压缩,可以减少代码体积,提高加载速度。…...
SQLAlchemy: Python中的强大数据库工具
SQLAlchemy: Python中的强大数据库工具 SQLAlchemy是一个功能强大的Python库,广泛应用于数据库操作。它提供了一个灵活的数据库抽象层,可以帮助开发者轻松与关系型数据库进行交互。本文将介绍SQLAlchemy的核心组件、常用功能以及它的优势。 1. SQLAlch…...
scala的泛型特质的应用场景
//泛型特质的应用场景 //作比较找出最大值 //定义一个函数,用来求List元素中的最大值参考代码:object Test4 {def getMax[T](list:List[T])(implicit ev:T > Ordered[T]): T {list.reduce((a:T,b:T)> if(a>b) a else b)}def main(args: Array…...
【C++】重载运算与类型转换(七):成员访问运算符
14.7 成员访问运算符 在迭代器类和智能指针类常常用到解引用运算符(*)和箭头运算符(->)。以如下形式向 StrBlobPtr 类添加这两种运算符: class StrBlobPtr {public:std::string& operator*() const{ auto p …...
论文结论:GPTs and Hallucination Why do large language models hallucinate
GPTs and Hallucination 当一个主题有普遍共识,并且有大量语言可用于训练模型时,大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】,或者主题有争议,或是对主题没有明确共识的情况下,就…...
修改通过 Docker 部署的 WordPress 上传文件的大小
要修改通过 Docker 部署的 WordPress 上传文件的大小,你可以按照以下步骤操作: 进入 Docker 容器:首先,你需要进入 WordPress 容器内部。可以使用如下命令: docker exec -it wordpress /bin/bash其中wordpress是你的 W…...
微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列
参考说明 微信小程序实现流程进度功能 - 知乎 上面的为一个节点进度条的例子,但并不完整,根据上述代码,进行修改完善,实现其效果 横向效果 代码 wxml <view classorder_process><view classprocess_wrap wx:for&quo…...
信而泰网络测试仪校准解决方案
一、影响仪表精度的因素 网络测试仪是用于对数据网络及其相关设备性能参数进行测试的仪表,可以模拟网络终端产生流量,进行网络性能测试,对网络状态进行实时监测,分析和统计。数字计量对于精准数据的网络测试仪来说是一剂强心针&a…...
聊聊在应用层面实现内网穿透功能是否可行
前言 最近接手了供方开发的网关项目,交接文档里面有个内网穿透的功能,一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网,这些公网的业务想访问内网的业务,但因为公网和内网没打通,导致…...
linux 20.04 安装sougou输入法 重启 可视化界面 无法点击
在Linux 20.04(Ubuntu 20.04)系统中安装搜狗输入法后,如果遇到重启后可视化界面无法点击的问题,这通常是由于搜狗输入法或其依赖的输入法框架(如fcitx)与系统的某些部分不兼容所导致的。以下是一些可能的解…...
springboot整合lua脚本在Redis实现商品库存扣减
1、目的 使用lua脚本,可以保证多条命令的操作原子性;同时可以减少操作IO(比如说判断redis对应数据是否小于0,小于0就重置为100,这个场景一般是取出来再判断,再存放进行,就至少存在2次IO,用lua脚…...
lspci简介
lspci命令用于列出系统中所有pci设备信息,其输出信息包括设备的bdf地址(总线号、设备号和功能号)、设备类型、厂商信息等。 lspci命令的基本用法: lspci:列出所有pci设备的详细信息 参数: -v:显示详细信息,包括驱动程序、总线和端口等信息 -t:以属性结构显…...
Java从入门到工作2 - IDEA
2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…...
Mave下载、安装以及idea(2024)进行配置
目录 Maven简介 Maven下载 配置环境变量 配置本地仓库 在idea环境配置Maven 使用Maven创建工程 创建一个普通的java工程 创建一个Web项目 Maven简介 Maven是一个跨平台的项目管理工具,也是Apache组织中的一个成功的开源项目。它主要服务于基于Java的项目构…...
Spark SQL 执行计划解析源码分析
本文用于记录Spark SQL执行计划解析的源码分析。文中仅对关键要点进行提及,无法面面具到,仅描述大体的框架。 Spark的Client有很多种,spark-sql,pyspark,spark- submit,R等各种提交方式,这里以…...
51c嵌入式~单片机~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…...
【electron】electron forge + vite + vue + electron-release-server 自动更新客户端
基本信息 electron forge vue页面(中文):https://forge.electron.js.cn/guides/framework-integration/vue-3 electron forge vue页面(英文,中文版下面的tab无法点击):https://www.electronfor…...
FastAPI vs Flask 选择最适合您的 Python Web 框架
文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域,FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能,但是在某些方面有所不同。本文将比较 FastAPI…...
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
我们在使用Ubuntu系统时经常性使用sudo apt install命令安装所需要的软件库,偶尔会出现如下问题: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其…...
Spring Boot整合 RabbitMQ
文章目录 一. 引入依赖二. 添加配置三. Work Queue(工作队列模式)声明队列生产者消费者 四. Publish/Subscribe(发布订阅模式)声明队列和交换机生产者消费者 五. Routing(路由模式)声明队列和交换机生产者消费者 六. Topics(通配符模式)声明队列和交换机生产者消费者 一. 引入依…...
Spring Boot 进阶指南:深入核心与实战技巧
当你掌握了 Spring Boot 的基础开发流程后,可以进一步学习其高级功能和优化技巧,以便在复杂场景中高效开发和维护应用。本篇博客将带你深入探讨 Spring Boot 的核心机制,覆盖配置管理、高级特性以及性能优化等内容。 1. 深入理解 Spring Boot…...
淘宝详情网页爬虫:技术解析与实战指南
引言 淘宝作为中国最大的电商平台之一,拥有海量的商品数据。对于开发者来说,获取淘宝商品详情接口是一个常见的需求。本文将介绍如何使用Python编写爬虫,获取淘宝商品详情信息,并探讨在实际应用中可能遇到的挑战与解决方案。 环…...
远程桌面防护的几种方式及优缺点分析
远程桌面登录是管理服务器最主要的方式,于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码,悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全,攻击者可以利…...
WordPress后门插件Query Console 未授权RCE漏洞复现(CVE-2024-50498)
0x01 产品描述: WP Query Console是一个为...
机器学习经典算法
机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...