当前位置: 首页 > news >正文

【15】数据结构之基于树的查找算法篇章

目录标题

    • 二叉排序树 Binary Sort Tree
      • 二叉排序树的插入
      • 二叉树排序树的删除
      • 二叉排序树的查找
      • 二叉排序树的调试与代码集合
    • 平衡二叉树-AV树
      • 平衡二叉树的平衡化旋转
      • 平衡二叉树的代码调试与代码集合
    • B树
      • B树的查找
      • B树的插入
      • B+树和B*树

二叉排序树 Binary Sort Tree

  • 二叉查找树,也称二叉搜索树
  • 性质
    • 或是一棵空树
    • 如果左子树不为空,则左子树上所有结点的值均小于它根结点的值
    • 如果右子树不为空,则右子树上所有结点的值均大于它根结点的值
    • 左右子树也都为二叉排序树
    • 树中没有值相同的结点
  • 二叉排序树的示意图
    在这里插入图片描述

二叉排序树的插入

  • 基本思想:已知一关键字为key的结点node

      1. 若二叉树为空树,则结点node成为二叉排序树的根
      1. 若二叉树非空树,则将node.key与二叉排序树根结点的关键字进行比较
      • 如果key的值等于根结点的值,则停止插入
      • 如果key的值小于根结点的值,则将结点node插入左子树
      • 如果key的值大于根结点的值,则将结点node插入右子树
  • 二叉排序树的插入操作
    在这里插入图片描述

  • 二叉排序树的插入代码

    def insert(self, key):"""插入新结点:param key: 待插入元素:return:"""node = Node(key)# 如果二叉排序树为空树if self.root == None:self.root = node# 如果二叉树不为空树else:# 创建一个指针指向根结点cur = self.root# cur不为空while cur != None:# 判断key与cur.val的大小if key > cur.val:# 在右子树中插入新结点if cur.right == None:cur.right = nodebreakcur = cur.rightelse:# 在左子树插入新结点if cur.left == None:cur.left = nodebreakcur = cur.left

二叉树排序树的删除

核心操作:

  • 删除结点不在二叉排序树中,则不做任何操作
  • 否则,假设需要删除的结点为key,key的双亲结点为keyParent,假设key为keyParent的左孩子结点
    • 1.若key为叶子结点,则直接删除
    • 2.若key只有左子树,可将key的左子树直接改为其双亲结点keyParent的左子树
    • 若key有左右子树
      • 找到key在中序序列中的前驱结点pre
      • 将key的左子树改为结点keyParent的左子树
      • 将key的右子树改为中序序列中的前驱结点pre的右子树
  • 二叉排序树的删除操作
    在这里插入图片描述
  • 二叉排序树的删除代码
    def delete(self, key):"""二叉排序树的删除:param key: 删除的元素值:return:"""if self.root is None:return# target指向根结点target = self.root# targetParent指向target的双亲结点targetParent = None# 从树根开始逐层向下查找待删除的数值为key的结点while target and target.val != key:targetParent = target# 找到对应结点则退出循环# 在左子树中继续查找if key < target.val:target = target.leftelse:# 在右子树中继续查找target = target.rightif target is None:  # 未找到节点return# 情况1:目标节点是叶子节点if target.left is None and target.right is None:if targetParent is None:  # 根节点self.root = Noneelif targetParent.left == target:targetParent.left = Noneelse:targetParent.right = None# 情况2:目标节点是单分支节点elif target.left is None or target.right is None:child = target.left if target.left else target.rightif targetParent is None:  # 根节点self.root = childelif targetParent.left == target:targetParent.left = childelse:targetParent.right = child# 情况3:目标节点是双分支节点else:# 找到左子树的最大节点(中序前驱)predecessor_parent = targetpredecessor = target.leftwhile predecessor.right:predecessor_parent = predecessorpredecessor = predecessor.right# 用前驱节点的值替换目标节点值target.val = predecessor.val# 删除前驱节点(前驱节点无右子树)if predecessor_parent.left == predecessor:predecessor_parent.left = predecessor.leftelse:predecessor_parent.right = predecessor.left

二叉排序树的查找

  • 基本思想:将待查关键字key与根结点关键字val进行比较

    • key == val,则返回根结点地址
    • key < val,则进一步查找左子树
    • key > val,则进一步查找右子树
  • 二叉排序树的平均查找长度ASL在最好的情况下为 O ( l o g 2 n ) O(log_2 n) O(log2n)

  • 二叉排序树的查找操作
    在这里插入图片描述

  • 二叉排序树的代码

    def contains(self, key):"""查找:param key::return:"""if self.root == None:return Falsecur = self.rootwhile cur != None:#如果key等于cur指针指向的结点数值if key == cur.val:return True# 如果大于其数值elif key > cur.val:# 将cur指针指向的结点的右孩子结点cur = cur.rightelse:# 否则指向左孩子结点cur = cur.left# 查找失败的情况return False

二叉排序树的调试与代码集合

class Node(object):def __init__(self, val):self.val = valself.left = Noneself.right = Noneclass BinarySortTree(object):def __init__(self):self.root = Nonedef insert(self, key):"""插入新结点:param key: 待插入元素:return:"""node = Node(key)# 如果二叉排序树为空树if self.root == None:self.root = node# 如果二叉树不为空树else:# 创建一个指针指向根结点cur = self.root# cur不为空while cur != None:# 判断key与cur.val的大小if key > cur.val:# 在右子树中插入新结点if cur.right == None:cur.right = nodebreakcur = cur.rightelse:# 在左子树插入新结点if cur.left == None:cur.left = nodebreakcur = cur.leftdef getMinNode(self, node):"""获取二叉排序树中的数值最小结点:param node: 根结点:return:"""# 如果根结点的左子树为空,因此根结点数值最小if node.left == None:return node.val# 如果根结点的左子树不为空,数值最小的结点一定在根结点的左子树# 用指针cur指向根结点的左孩子结点cur = node.leftwhile cur.left != None:cur = cur.left# 如果当前结点的左子树为空,则当前结点数值为最小值return cur.valdef getMaxNode(self, node):"""获取二叉排序树中数值最大的结点:param node: 根结点:return:"""# 如果根结点的右子树为空树,则根结点数值最大if node.right == None:return node.val# 如果根结点的右子树不为空树,数值最大的结点一定在根结点的右子树# 用指针cur指向根结点的右孩子结点cur = node.rightwhile cur.right != None:cur = cur.right# 如果当前结点的右子树为空树,则当前结点数值为最大值return cur.valdef preorder_iterator(self,node):"""先序遍历:param node: 二叉顺序树的根结点:return:"""if node != None:print(node.val, end=" ")self.preorder_iterator(node.left)self.preorder_iterator(node.right)def inorder_iterator(self, node):"""中序遍历:param node: 二叉树的根结点:return:"""if node != None:self.inorder_iterator(node.left)print(node.val, end=" ")self.inorder_iterator(node.right)def postorder_iterator(self, node):"""后序遍历:param node: 二叉树的根结点:return:"""if node != None:self.postorder_iterator(node.left)self.postorder_iterator(node.right)print(node.val, end=" ")def delete(self, key):"""二叉排序树的删除:param key: 删除的元素值:return:"""if self.root is None:return# target指向根结点target = self.root# targetParent指向target的双亲结点targetParent = None# 从树根开始逐层向下查找待删除的数值为key的结点while target and target.val != key:targetParent = target# 找到对应结点则退出循环# 在左子树中继续查找if key < target.val:target = target.leftelse:# 在右子树中继续查找target = target.rightif target is None:  # 未找到节点return# 情况1:目标节点是叶子节点if target.left is None and target.right is None:if targetParent is None:  # 根节点self.root = Noneelif targetParent.left == target:targetParent.left = Noneelse:targetParent.right = None# 情况2:目标节点是单分支节点elif target.left is None or target.right is None:child = target.left if target.left else target.rightif targetParent is None:  # 根节点self.root = childelif targetParent.left == target:targetParent.left = childelse:targetParent.right = child# 情况3:目标节点是双分支节点else:# 找到左子树的最大节点(中序前驱)predecessor_parent = targetpredecessor = target.leftwhile predecessor.right:predecessor_parent = predecessorpredecessor = predecessor.right# 用前驱节点的值替换目标节点值target.val = predecessor.val# 删除前驱节点(前驱节点无右子树)if predecessor_parent.left == predecessor:predecessor_parent.left = predecessor.leftelse:predecessor_parent.right = predecessor.leftdef contains(self, key):"""查找:param key::return:"""if self.root == None:return Falsecur = self.rootwhile cur != None:#如果key等于cur指针指向的结点数值if key == cur.val:return True# 如果大于其数值elif key > cur.val:# 将cur指针指向的结点的右孩子结点cur = cur.rightelse:# 否则指向左孩子结点cur = cur.left# 查找失败的情况return Falseif __name__ == "__main__":print('PyCharm')bstree = BinarySortTree()temp = [53, 78, 65, 17, 87, 9, 81, 15]# 插入结点for i in temp:bstree.insert(i)# 删除操作bstree.delete(17)# 查找操作num = 77print(f"查找的元素:{num}在二叉树中的查找情况为{bstree.contains(num)}")print("先序遍历:", end="")bstree.preorder_iterator(bstree.root)print()print("中序遍历:", end="")bstree.inorder_iterator(bstree.root)print()print("后序遍历:", end="")bstree.postorder_iterator(bstree.root)print()min_num = bstree.getMinNode(bstree.root)print('二叉排序树的最小结点值为:', min_num)max_num = bstree.getMaxNode(bstree.root)print("二叉排序树的最大结点值为:", max_num)

平衡二叉树-AV树

  • 满足任何一个结点的左子树和右子树的高度差的绝对值不超过1的二叉排序树.
  • 性质
    • 或是一棵空树
    • 左子树与右子树的高度差的绝对值小于或等于1;
    • 左子树和右子树也都是平衡树
    • 1.有n个结点的平衡二叉树的高度为 l o g 2 n log_2 n log2n
    • 2.在有n个结点的平衡二叉树中搜索一个结点的时间复杂度为 O ( l o g 2 n ) O(log_2 n) O(log2n)
    • 3.将一个新结点插入一棵有n个结点的平衡二叉树中,可得到一棵有n+1个结点的平衡二叉树,且插入的时间复杂度 O ( l o g 2 n ) O(log_2 n) O(log2n)
    • 4.从一棵有n个结点的平衡二叉树删除一个结点,可得到一棵有n-1个结点的平衡二叉树,且删除的时间复杂度为 O ( l o g 2 n ) O(log_2 n) O(log2n)
    • 5.结点的平衡因子BF:定义为结点左子树与右子树高度之差;在平衡二叉树中任一结点的BF值只能是-1,0,和1.

平衡二叉树的平衡化旋转

在这里插入图片描述

  • 平衡二叉树的创建

在这里插入图片描述

  • 若在平衡二叉树中插入一个新结点,则会造成不平衡,需要进行平衡化旋转.
  • 平衡化旋转
    • 单旋转(LL旋转和RR旋转)
    • 双旋转(LR旋转和RL旋转)
      • LL:用于处理左子树的左子树过高
      • RR:用于处理左子树的左子树过高
      • LR:用于处理左子树的右子树过高
      • RL:用于处理右子树的左子树过高

平衡二叉树的代码调试与代码集合

class Node(object):def __init__(self, data):self.data = dataself.left = Noneself.right = Noneself.height = 1  # 初始高度为1(叶子节点)class AVLTree(object):def __init__(self):self.root = Nonedef height(self, node):if node is None:return 0return node.heightdef update_height(self, node):"""更新节点高度"""node.height = max(self.height(node.left), self.height(node.right)) + 1def balance_factor(self, node):"""计算平衡因子"""if node is None:return 0return self.height(node.left) - self.height(node.right)def is_balance(self, node):"""验证AVL树是否平衡"""if node is None:return Trueleft_height = self.height(node.left)right_height = self.height(node.right)if abs(left_height - right_height) > 1:return Falsereturn self.is_balance(node.left) and self.is_balance(node.right)# ---------------------- 遍历方法 ----------------------def preorder_iterator(self, node):if node is not None:print(node.data, end=" ")self.preorder_iterator(node.left)self.preorder_iterator(node.right)def inorder_iterator(self, node):if node is not None:self.inorder_iterator(node.left)print(node.data, end=" ")self.inorder_iterator(node.right)def postorder_iterator(self, node):if node is not None:self.postorder_iterator(node.left)self.postorder_iterator(node.right)print(node.data, end=" ")def LL(self, node):"""左左旋转(右旋)"""new_root = node.leftnode.left = new_root.rightnew_root.right = nodeself.update_height(node)self.update_height(new_root)return new_rootdef RR(self, node):"""右右旋转(左旋)"""new_root = node.rightnode.right = new_root.leftnew_root.left = nodeself.update_height(node)self.update_height(new_root)return new_rootdef LR(self, node):"""左右旋转(先左旋后右旋)"""node.left = self.RR(node.left)return self.LL(node)def RL(self, node):"""右左旋转(先右旋后左旋)"""node.right = self.LL(node.right)return self.RR(node)def find_min(self, node):"""查找最小节点"""if node is None or node.left is None:return nodereturn self.find_min(node.left)def insert(self, data, node):"""插入节点并平衡"""if node is None:return Node(data)if data < node.data:node.left = self.insert(data, node.left)elif data > node.data:node.right = self.insert(data, node.right)else:return node  # 重复值不插入# 更新高度self.update_height(node)# 检查平衡因子balance = self.balance_factor(node)# 左子树不平衡if balance > 1:if self.balance_factor(node.left) >= 0:  # 左左型return self.LL(node)else:  # 左右型return self.LR(node)# 右子树不平衡if balance < -1:if self.balance_factor(node.right) <= 0:  # 右右型return self.RR(node)else:  # 右左型return self.RL(node)return nodedef remove(self, data, node):"""删除节点并平衡"""if node is None:return Noneif data < node.data:node.left = self.remove(data, node.left)elif data > node.data:node.right = self.remove(data, node.right)else:# 找到目标节点if node.left is None or node.right is None:# 单分支或叶子节点child = node.left if node.left else node.rightif child is None:node = Noneelse:node = childelse:# 双分支节点:用右子树最小值替换并删除min_node = self.find_min(node.right)node.data = min_node.datanode.right = self.remove(min_node.data, node.right)if node is None:return None# 更新高度self.update_height(node)# 检查平衡因子balance = self.balance_factor(node)# 左子树不平衡if balance > 1:if self.balance_factor(node.left) >= 0:  # 左左型return self.LL(node)else:  # 左右型return self.LR(node)# 右子树不平衡if balance < -1:if self.balance_factor(node.right) <= 0:  # 右右型return self.RR(node)else:  # 右左型return self.RL(node)return node# ---------------------- 测试用例 ----------------------
if __name__ == "__main__":avltree = AVLTree()data = [16, 3, 7, 11, 9, 26, 18, 14, 15]# 插入节点for num in data:avltree.root = avltree.insert(num, avltree.root)assert avltree.is_balance(avltree.root), f"插入{num}后树不平衡!"print("初始树结构:")print("前序遍历:", end="")avltree.preorder_iterator(avltree.root)print("\n中序遍历:", end="")avltree.inorder_iterator(avltree.root)print("\n后序遍历:", end="")avltree.postorder_iterator(avltree.root)print("\n")# 删除节点avltree.root = avltree.remove(7, avltree.root)  # 删除中间节点avltree.root = avltree.remove(16, avltree.root)  # 删除根节点print("删除后树结构:")print("前序遍历:", end="")avltree.preorder_iterator(avltree.root)print("\n中序遍历:", end="")avltree.inorder_iterator(avltree.root)print("\n后序遍历:", end="")avltree.postorder_iterator(avltree.root)

B树

在这里插入图片描述

  • 多路平衡查找树
  • 需要满足一下要求,定义出一棵m阶的B树
    • 或一棵空树
    • 1.树中每个结点最多有m棵子树(m>=2)
    • 2.根结点至少有两个子结点
    • 3.除根结点外,结点中关键字的个数取值范围为(m/2)-1到m-1(m/2向上取整)
    • 4.所有叶子结点都在同一层
    • 5.除根结点和叶子结点外,如果结点有k-1个关键字,这个结点就有k个子结点,关键字按递增顺序排序

B树的查找

  • 把根结点读出,在根结点所包含的关键字中进行查找给定元素关键字,找到则查找成功
  • 否则,确定要查找关键字大小的范围,根据指针指向子结点,在子结点中继续查找,如果查找到叶子结点仍未找到,表示查找失败.
  • 查找示意图
    在这里插入图片描述

B树的插入

  • 先确定插入元素在B树是否已经存在,若不存在则进行插入操作
  • 若找到插入的位置结点空间足够,则顺利完成插入;否则无法插入.
    在这里插入图片描述

B+树和B*树

  • B+树和B数的差异
    • 1.有k个子结点的B+树中含有k个关键字,非叶子结点中的每个关键字不保存数据,只用来索引,所有数据都保存在叶子结点中.
    • 2.所有的叶子结点包含全部关键字信息,以及指向含有这些关键字的指针,且叶子结点本身是依关键字值递增的链表
    • 3.所有的非终端结点可以视为索引,结点中仅含其子树根结点中最大或最小的关键字.
  • B*与B+树
    • B是B+树的一种变形,在B+树的基础上,B树为非根结点和非叶子结点增加了指向兄弟结点的指针
    • B*树定义了非叶子结点的关键字数量至少为(2/3)×m,即块的最低使用率为2/3(B+树的使用率为1/2).

相关文章:

【15】数据结构之基于树的查找算法篇章

目录标题 二叉排序树 Binary Sort Tree二叉排序树的插入二叉树排序树的删除二叉排序树的查找二叉排序树的调试与代码集合 平衡二叉树-AV树平衡二叉树的平衡化旋转平衡二叉树的代码调试与代码集合 B树&#xff22;树的查找B树的插入B树和B*树 二叉排序树 Binary Sort Tree 二叉…...

自定义类型之结构体

1.结构体类型概述 结构体类型是一种用户自定义的数据类型&#xff0c;用于将不同类型的数据组合成一个整体。在C语言中&#xff0c;结构体使用struct关键字定义&#xff0c;由一系列具有相同类型或不同类型的数据构成的数据集合&#xff0c;也称为结构。结构体中的数据在逻辑上…...

SGFormer:卫星-地面融合 3D 语义场景补全

论文介绍 题目&#xff1a;SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议&#xff1a;IEEE / CVF Computer Vision and Pattern Recognition Conference 论文&#xff1a;https://www.arxiv.org/abs/2503.16825 代码&#xff1a;https://githu…...

应急响应篇钓鱼攻击邮件与文件EML还原蠕虫分析线索定性处置封锁

钓鱼邮件的eml中会有 邮件服务器地址域名&#xff08;发信人&#xff09;发送的本地IP和主机名发送的内容以及附件 邮件钓鱼&#xff1a; 攻击者目的&#xff1a;通过发信人&#xff0c;附件&#xff0c;取得突破 定性钓鱼邮件 威胁情报&#xff0c;人工分析来源&#xff0c…...

利用纯JS开发浏览器小窗口移动广告小功能

效果展示 直接上代码 如果要用到vue项目里面&#xff0c;直接按照vue的写法改动就行&#xff0c;一般没有多大的问题&#xff0c;顶部的占位是我项目需求&#xff0c;你可以按照要求改动。 <!DOCTYPE html> <html> <head><meta charset"utf-8"…...

java Stream流

Stream流 双列集合无法直接使用stream流&#xff0c;可以通过keyset&#xff08;&#xff09;或enteyset转换为单列集合&#xff0c;再进行操作 1.单列集合 package mystream;import java.util.ArrayList; import java.util.Collections;public class StreamDemo1 {public sta…...

【实战中提升自己】 防火墙篇之VPX部署–L2TP over IPSEC

1 VPx部署【L2TP Over ipsec】 说明&#xff1a;在VPX上面&#xff0c;我们希望与分部建立VPX&#xff0c;保证与分部的财务部正常通信&#xff0c;另外还提供L2TP Over ISPEC功能&#xff0c;方便远程接入访问内部服务器等。当然我们也可以做详细的控制&#xff…...

贪心算法(20)(java)整数替换

给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果 n 是偶数&#xff0c;则用 n / 2替换 n 。如果 n 是奇数&#xff0c;则可以用 n 1或n - 1替换 n 。 返回 n 变为 1 所需的 最小替换次数 。 示例 1&#xff1a; 输入&#xff1a;n 8 输出&#xff1a;3 解…...

实验二.单按键控制LED

1.实验任务 如图4.1所示:在P0.0端口上接一个发光二极管L1,按键按一下灯亮,在按一下灯灭。 2.电路原理图 3.系统板上硬件连线 把“单片机系统”区域中的P0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。 4.程序设计内容...

Ubuntu 常用命令行指令

1. 文件与目录操作 命令作用示例ls列出目录内容ls -l&#xff08;详细列表&#xff09;cd切换目录cd ~/Documentspwd显示当前目录路径pwdmkdir创建目录mkdir new_folderrm删除文件rm file.txtrm -r递归删除目录rm -r old_dircp复制文件cp file.txt backup/mv移动/重命名文件mv…...

Cribl 数据脱敏 -02 (附 测试数据)

先把实验的测试方向如下: Match Regex Replace Expression Example result <...

【项目管理】第16章 项目采购管理-- 知识点整理

项目管理-相关文档&#xff0c;希望互相学习&#xff0c;共同进步 风123456789&#xff5e;-CSDN博客 &#xff08;一&#xff09;知识总览 项目管理知识域 知识点&#xff1a; &#xff08;项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域&#xff09; 对应&…...

根据关键字搜索日志内容,常用的Linux命令

在 Linux 中&#xff0c;根据关键字搜索日志内容是运维和开发的常见需求。以下是常用的命令及场景示例&#xff1a; 1. grep 基础搜索 (1) 简单关键字匹配 # 在文件中搜索包含 "error" 的行 grep "error" /var/log/nginx/error.log# 忽略大小写&#xff…...

数据结构(六)——红黑树及模拟实现

目录 前言 红黑树的概念及性质 红黑树的效率 红黑树的结构 红黑树的插入 变色不旋转 单旋变色 双旋变色 插入代码如下所示&#xff1a; 红黑树的查找 红黑树的验证 红黑树代码如下所示&#xff1a; 小结 前言 在前面的文章我们介绍了AVL这一棵完全二叉搜索树&…...

【Linux】基础 IO(文件描述符、重定向、缓冲区)

Linux 1.理解文件2.C文件接口1.打开 写文件2.读文件 简单实现cat命令3.输出信息到显示器的方式4.stdin、stdout、stderr5.打开文件的方式 3.系统接口 IO1.传递标志位2.open、close3.write、read 4.文件描述符1.是什么&#xff1f;2.分配规则3.重定向原理4.通过dup2系统调用重…...

记录一下远程调试 备忘

‌在进行远程调试时&#xff0c;目标主机不需要安装完整的编程环境‌(舍去重复安装)。可以使用Visual Studio的远程调试功能&#xff0c;或者使用gdb和gdbserver进行远程调试。 Visual Studio远程调试 ‌复制远程调试器文件夹‌&#xff1a;将Visual Studio安装目录下的remot…...

libevent服务器附带qt界面开发(附带源码)

本章是入门章节&#xff0c;讲解如何实现一个附带界面的服务器&#xff0c;后续会完善与优化 使用qt编译libevent源码演示视频qt的一些知识 1.主要功能有登录界面 2.基于libevent实现的服务器的业务功能 使用qt编译libevent 下载这个&#xff0c;其他版本也可以 主要是github上…...

MyISAM索引方案

在InnoDB中索引即数据&#xff0c;也就是聚簇索引的B树叶子节点已经包含了所有完整的用户记录&#xff0c;MyISAM的索引方案虽然也是树形结构&#xff0c;但是将索引和数据分开存储 将表中的记录按记录的插入顺序单独存储在一个文件中【数据文件】&#xff0c;这个文件不划分数…...

Windows 图形显示驱动开发-WDDM 1.2功能—WDDM 1.2 中的 Direct3D 功能和要求

一、架构演进与驱动模型 1.1 WDDM驱动模型的革命性升级 Windows 8引入的WDDM 1.2驱动模型在以下方面实现突破&#xff1a; 内存管理&#xff1a;采用统一虚拟地址空间&#xff08;UVA&#xff09;架构&#xff0c;使CPU和GPU可共享相同的指针地址空间。具体实现通过DXGK_DRI…...

深度解析 Vue 项目 Webpack 分包与合包 一文读懂

深度解析 Vue 项目 Webpack 分包与合包 一文读懂 文章目录 深度解析 Vue 项目 Webpack 分包与合包 一文读懂一、Webpack 打包机制深度解析1.1 模块化系统的本质1.2 Webpack 构建流程解析1.3 默认打包的问题分析 二、分包策略深度配置2.1 SplitChunksPlugin 核心配置2.2 精细化分…...

【ROS】map_server 地图的保存和加载

【ROS】map_server 地图的保存和加载 前言地图的保存地图的加载 前言 在 ROS 中&#xff0c;想要实现导航功能&#xff0c;首先需要一张已建好的地图。导航系统依赖这张地图进行路径规划、定位和障碍物避让等操作。本文将讲解在使用 gmapping 或 hector_mapping 建图后&#x…...

【计网】SSL/TLS核心原理

序言 在HTTP协议中&#xff0c;信息是明文传输的&#xff0c;因此为了通信安全就有了HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer)协议。HTTPS也是一种超文本传送协议&#xff0c;在HTTP的基础上加入了SSL/TLS协议&#xff0c;SSL/TLS依靠证书来验证服务端的…...

sqli-labs靶场 less 11

文章目录 sqli-labs靶场less 11 POS联合注入 sqli-labs靶场 每道题都从以下模板讲解&#xff0c;并且每个步骤都有图片&#xff0c;清晰明了&#xff0c;便于复盘。 sql注入的基本步骤 注入点注入类型 字符型&#xff1a;判断闭合方式 &#xff08;‘、"、’、“”&…...

陕化之光(原创)

当城市在和周公化合 陕化的工装已与朝霞发生反应 工人先锋号已然吹响 陕化工人游走在工作的床层 钢铁森林间穿梭的身影 是沉默的催化剂 让冰冷的方程式 绽放出最活跃的分子温度 扳手与阀门对话时 塔林正在记录 关于电流与压力的学习笔记 每一次精确的调控 都是舞台上…...

【刷题2025】高级数据结构(并查集+优先队列+图论)

1.并查集 (1)基础理论 并查集是一种树形的数据结构,用于处理一些不相交集合的 合并 及 查询 问题。比如,可以用并查集判断一个森林中有几棵树、某个节点是否属于某棵树。 并查集由一个整形数组 pre[] 和两个函数 find() 、 join() 构成。 数组 pre[] 记录了每个点的前驱…...

数据库性能优化(sql优化)_分布式优化思路01_yxy

数据库性能优化_分布式优化思路01 1 分布式数据库的独特挑战2 分布式新增操作符介绍2.1 数据交换操作符(ESEND/ERECV):2.2 数据迭代操作符GI:3 核心优化策略(一)_分区裁剪优化3.1 普通分区裁剪3.2 动态分区裁剪1 分布式数据库的独特挑战 在分布式数据库系统中,核心为数据被…...

云服务器和物理服务器有什么区别

云服务器与物理服务器的核心区别在于资源分配方式、性能稳定性、成本结构、运维管理及 适用场景。以下是具体分析: 一、资源分配与架构差异 云服务器:基于虚拟化技术,将物理服务器集群分割为多个虚拟实例&#xff0c;资源由多个用户 共享&#xff0c;可根据需求弹性调整配置…...

FPGA-DDS技术的波形发生器

1.实验目的 1.1掌握直接数字频率合成&#xff08;DDS&#xff09;的基本原理及其实现方法。 1.2在DE2-115 FPGA开发板上设计一个可调频率的正弦波和方波发生器&#xff0c;频率范围10Hz~5MHz&#xff0c;最小分辨率小于1kHz。 1.3使用Quartus II进行仿真&#xff0c;并通过S…...

晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法

晶晨线刷工具下载及易错点说明&#xff1a;Key文件配置错误&#xff0f;mac剩余数为0解决方法 各种版本晶晨线刷工具下载&#xff1a; 晶晨线刷工具易出错点故障解决方法&#xff1a; 1、晶晨线刷工具加载固件的时候提示mac红字且剩余数为0的解决办法 很多同学可能会与遇到加…...

idea如何使用git

在 IntelliJ IDEA 中使用 Git 的详细步骤如下&#xff0c;分为配置、基础操作和高级功能&#xff0c;适合新手快速上手&#xff1a; ​一、配置 Git​ ​安装 Git​ 下载并安装 Git&#xff0c;安装时勾选“Add to PATH”。验证安装&#xff1a;终端输入 git --version 显示版本…...

python——学生管理系统

学生管理系统主要分为以下三个大类&#xff1a; 一、用户类&#xff08;User&#xff09;&#xff1a; 属性&#xff1a;用户名&#xff08;username&#xff09;、密码&#xff08;password&#xff09; 功能&#xff1a;注册&#xff08;register&#xff09;、登录&#…...

快速幂+公共父节点

# 快速幂 求&#xff1a;23的10000次幂&#xff0c;那么就是求23的5000次幂&#xff0c;因为2350*235023^100;所以可以遍历log(n)次 int res1; int tmp23; for(int i1;i<logn;i) {tmp*tmp; }显然&#xff0c;我们无法通过logn计算次数&#xff1b; 比如是非偶数的怎么计算呢…...

【差分隐私相关概念】瑞丽差分隐私(RDP)命题4

命题4的证明详解&#xff08;分情况讨论&#xff09; 背景与设定 机制&#xff1a; f : D → R f: \mathcal{D} \to \mathcal{R} f:D→R 是由 n n n 个 ϵ \epsilon ϵ-差分隐私机制自适应组合而成。相邻输入&#xff1a; D D D 和 D ′ D D′ 是相邻数据集。目标&#xf…...

Vue 人看 React useRef:它不只是替代 ref

如果你是从 Vue 转到 React 的开发者&#xff0c;初见 useRef 可能会想&#xff1a;这不就是 React 版的 ref 吗&#xff1f;但真相是 —— 它能做的&#xff0c;比你想象得多得多。 &#x1f440; Vue 人初见 useRef 在 Vue 中&#xff0c;ref 是我们访问 DOM 或响应式数据的…...

C++第三方库【JSON】nlohman/json

文章目录 优势使用API从文件中读取json从json文本创建json对象直接创建并操作json对象字符串 <> json对象文件流 <> json对象从迭代器读取像使用STL一样的访问STL容器转化为 json数组STL容器 转 json对象自定义类型转化为 json对象 限制 优势 直观的语法&#xff…...

从源码到实战:深度解析`rsync`增量同步机制与高级应用

从源码到实战&#xff1a;深度解析rsync增量同步机制与高级应用 #mermaid-svg-C1ZMwvhtq4iP4E8m {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-C1ZMwvhtq4iP4E8m .error-icon{fill:#552222;}#mermaid-svg-C1ZMwvht…...

数据库表设计五层分类系统表设计

文章目录 数据库表设计五层分类系统表设计代码思路详解类概述核心方法详解1. processString(String input) 方法2. createNo(String input, boolean peerNode) 方法3. isParent(String parentNo, String sonNo) 方法 编号系统设计使用场景推测代码特点可能的使用示例 NoProcess…...

Centos/RedHat 7.x服务器挂载ISCSI存储示例(无多路径非LVM)

客户让帮忙挂载个ISCSI存储&#xff0c;大概结构如下图所示&#xff1a; ISCSI存储为一台安装了truenas的X86服务器&#xff0c;提供存储服务的IP地址为10.16.0.1 服务器的ETH1网卡配置与10.16.0.1同段网络。 为了给客户做个简单培训&#xff0c;整理了一下操作步骤。下面是配…...

【android bluetooth 协议分析 21】【ble 介绍 2】【什么是IRK,是如何生成和传递的】

1. 什么是 IRK&#xff1f; IRK&#xff0c;全称 Identity Resolving Key&#xff08;身份解析密钥&#xff09;&#xff0c;是 BLE 设备用于生成和解析 Resolvable Private Address&#xff08;RPA&#xff09; 的密钥。 2. IRK 的生成和传递过程 IRK 是在 BLE 配对&#xf…...

4.14-4.15学习总结 IO流:缓冲流+转换流+序列化流+打印流+压缩流+Commons—io工具包+Hutool工具包

图片加密操作&#xff1a; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class test {public static void main(String[] args) throws IOException {FileInputStream fisnull;FileOutputStream fosnull;try{fisnew…...

Linux入门学习笔记

一、文件路径相关 相对路径与绝对路径 相对路径&#xff1a;是从当前工作目录开始表示文件或目录位置的路径。例如&#xff0c;当前在 /home/user 目录下&#xff0c;若要访问 user 目录下 test 文件夹中的 file.txt 文件&#xff0c;相对路径就是 test/file.txt 。它依赖于当…...

Redis适用场景

Redis适用场景 一、加速缓存二、会话管理三、排行榜和计数器四、消息队列五、实时分析六、分布式锁七、地理位置数据八、限流九、数据共享十、签到 一、加速缓存 Redis最常见的应用之一是作为缓存层&#xff0c;用于存储频繁访问的数据&#xff0c;从而减轻数据库的负载。 通过…...

# WPS打开新文档,“工具”菜单下是空白

WPS打开新文档&#xff0c;“工具”菜单下是空白 在 WPS 中打开新文档后 “工具” 菜单下空白&#xff0c;可能由多种原因导致&#xff0c;如下图&#xff1a; 下面分析并给出对应的解决办法&#xff1a; 一、 功能区显示设置问题 1、原因&#xff1a; WPS 的功能区显示可能…...

【软考-架构】13.3、架构复用-DSSA-ABSD

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 1、软件架构复用2、特定领域软件架构DSSADSSA的三个基本活动参与DSSA的四种角色人员建立DSSA的过程三层次模型 考试真题第一题第二题 3、基于架构的软件开发ABSD的软件开发…...

K8S_ResourceQuota与LimitRange的作用

ResourceQuota 作用详解 资源总量控制&#xff1a;ResourceQuota能对命名空间内的资源使用总量进行限制。在一个Kubernetes集群中&#xff0c;存在多个命名空间&#xff0c;每个命名空间可看作一个独立的工作单元。通过设置ResourceQuota&#xff0c;可以防止某个命名空间过度…...

T101D加固平板电脑:无人机地面站的高效智能控制核心

随着无人机技术在应急救援、农业监测、军事侦察等领域的广泛应用&#xff0c;对地面控制设备的要求也日益提高。鲁成伟业推出的T101D加固平板电脑凭借其高性能、强防护和专业化设计&#xff0c;成为无人机地面站的核心控制终端&#xff0c;为复杂环境下的作业提供了可靠支持。 …...

LLM中的N-Gram、TF-IDF和Word embedding

文章目录 1. N-Gram和TF-IDF&#xff1a;通俗易懂的解析1.1 N-Gram&#xff1a;让AI学会"猜词"的技术1.1.1 基本概念1.1.2 工作原理1.1.3 常见类型1.1.4 应用场景1.1.5 优缺点 1.2 TF-IDF&#xff1a;衡量词语重要性的尺子1.2.1 基本概念1.2.2 计算公式1.2.3 为什么需…...

【基于Servlet技术处理表单】

文章目录 一、实验背景与目的二、实验设计与实现思路1. 功能架构2. 核心代码实现3. 测试用例 总结 一、实验背景与目的 本次实验旨在深入理解Servlet工作原理&#xff0c;掌握JSP与Servlet的协同开发&#xff0c;实现前端表单与后端数据处理的交互。具体目标包括&#xff1a;设…...

【差分隐私相关概念】瑞丽差分隐私(RDP)-瑞丽散度约束了贝叶斯因子后验变化

分步解释和答案&#xff1a; 在Rnyi差分隐私&#xff08;RDP&#xff09;框架中&#xff0c;通过贝叶斯因子和Rnyi散度的关系可以推导出关于后验变化的概率保证。以下是关键步骤的详细解释&#xff1a; 1. 贝叶斯因子的定义与分解 设相邻数据集 D D D 和 D ′ D D′&#x…...

Oracle查询大表的全部数据

2000w的大表 表结构如下&#xff0c;其中id是索引 查询处理慢的写法 List<String> queryLoidForPage(Integer startNum,Integer endNum){try {Connection oracleConnection initBean.oracleConnection;Statement stmt oracleConnection.createStatement();// 4.执行查…...