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

深入理解二叉搜索树:定义、操作及平衡二叉树

引言

二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树结构,每个节点的左子树节点值小于根节点值,而右子树节点值大于根节点值。二叉搜索树在计算机科学中有着广泛的应用,尤其在动态查找表和优先队列的实现中。本文将详细介绍二叉搜索树的定义、基本操作及平衡二叉树(AVL树和红黑树)。

二叉搜索树的定义和操作

定义

二叉搜索树是一种节点值满足特定排序的二叉树,定义如下:

  • 每个节点都有一个值。
  • 左子树中所有节点的值都小于根节点的值。
  • 右子树中所有节点的值都大于根节点的值。
  • 左右子树也分别是二叉搜索树。

基本操作

插入操作

插入操作是向二叉搜索树中添加一个新节点。根据新节点的值与当前节点的值比较,决定插入左子树或右子树。以下是插入操作的代码示例:

class TreeNode {int value;TreeNode left, right;// 构造函数TreeNode(int item) {value = item;left = right = null;}
}class BinarySearchTree {TreeNode root;BinarySearchTree() {root = null;}// 插入值到二叉搜索树void insert(int value) {root = insertRec(root, value);}// 递归方式插入值TreeNode insertRec(TreeNode root, int value) {// 如果树为空,则创建新节点if (root == null) {root = new TreeNode(value);return root;}// 如果值小于根节点,则插入左子树if (value < root.value)root.left = insertRec(root.left, value);// 如果值大于根节点,则插入右子树else if (value > root.value)root.right = insertRec(root.right, value);// 返回(未变更的)节点指针return root;}// 中序遍历打印树void inorder() {inorderRec(root);}// 递归方式中序遍历树void inorderRec(TreeNode root) {if (root != null) {inorderRec(root.left);System.out.print(root.value + " ");inorderRec(root.right);}}// 测试插入操作public static void main(String[] args) {BinarySearchTree tree = new BinarySearchTree();tree.insert(50);tree.insert(30);tree.insert(20);tree.insert(40);tree.insert(70);tree.insert(60);tree.insert(80);// 打印插入后的树System.out.print("中序遍历结果: ");tree.inorder();  // 输出:20 30 40 50 60 70 80 }
}
插入操作图解
  1. 初始化一个空树。
  2. 插入第一个值 50,成为根节点。
  3. 插入值 30,比 50 小,插入到 50 的左子树。
  4. 插入值 20,比 30 小,插入到 30 的左子树。
  5. 插入值 40,比 30 大,插入到 30 的右子树。
  6. 插入值 70,比 50 大,插入到 50 的右子树。
  7. 插入值 60,比 70 小,插入到 70 的左子树。
  8. 插入值 80,比 70 大,插入到 70 的右子树。
    50/  \30  70/ \  / \
20 40 60 80
20
30
40
50
60
70
80
删除操作

删除操作是从二叉搜索树中移除一个节点。根据要删除节点的位置及其子节点情况进行相应处理。以下是删除操作的代码示例:

class BinarySearchTree {TreeNode root;BinarySearchTree() {root = null;}// 删除指定值的节点void deleteKey(int value) {root = deleteRec(root, value);}// 递归方式删除值TreeNode deleteRec(TreeNode root, int value) {// 基本情况:树为空if (root == null) return root;// 递归查找要删除的节点if (value < root.value)root.left = deleteRec(root.left, value);else if (value > root.value)root.right = deleteRec(root.right, value);else {// 节点只有一个子节点或没有子节点if (root.left == null)return root.right;else if (root.right == null)return root.left;// 节点有两个子节点,获取右子树中最小值root.value = minValue(root.right);// 递归删除右子树中的最小值节点root.right = deleteRec(root.right, root.value);}return root;}// 查找最小值int minValue(TreeNode root) {int minValue = root.value;while (root.left != null) {minValue = root.left.value;root = root.left;}return minValue;}// 中序遍历打印树void inorder() {inorderRec(root);}// 递归方式中序遍历树void inorderRec(TreeNode root) {if (root != null) {inorderRec(root.left);System.out.print(root.value + " ");inorderRec(root.right);}}// 测试删除操作public static void main(String[] args) {BinarySearchTree tree = new BinarySearchTree();tree.insert(50);tree.insert(30);tree.insert(20);tree.insert(40);tree.insert(70);tree.insert(60);tree.insert(80);System.out.println("删除前的树:");tree.inorder();  // 输出:20 30 40 50 60 70 80 tree.deleteKey(20);System.out.println("\n删除20后的树:");tree.inorder();  // 输出:30 40 50 60 70 80 tree.deleteKey(30);System.out.println("\n删除30后的树:");tree.inorder();  // 输出:40 50 60 70 80 tree.deleteKey(50);System.out.println("\n删除50后的树:");tree.inorder();  // 输出:40 60 70 80 }
}
删除操作图解

假设我们要从上面的树中删除值 503020

  1. 删除 20:节点 20 没有子节点,直接删除。
  2. 删除 30:节点 30 有一个子节点 40,用 40 替换 30
  3. 删除 50:节点 50 有两个子节点,用其右子树的最小值 60 替换 50,然后删除 60
删除前:50/  \30  70/ \  / \
20 40 60 80删除 20 后:50/  \30  70\  / \40 60 80删除 30 后:50/  \40  70/ \60 80删除 50 后:60/  \40  70\80
删除前
50
30
70
20
40
60
80
删除20后
50
30
70
40
60
80
删除30后
50
40
70
60
80
删除50后
60
40
70
80
查找操作

查找操作是搜索二叉搜索树中是否存在某个特定值。根据目标值与当前节点值比较,决定在左子树或右子树中继续查找。以下是查找操作的代码示例:

class BinarySearchTree {TreeNode root;BinarySearchTree() {root = null;}// 查找指定值是否存在boolean search(int value) {return searchRec(root, value);}// 递归方式查找值boolean searchRec(TreeNode root, int value) {// 基本情况:树为空或值为根节点值if (root == null || root.value == value) return root != null;// 值小于根节点值,则在左子树中查找if (value < root.value)return searchRec(root.left, value);// 值大于根节点值,则在右子树中查找return searchRec(root.right, value);}// 插入值到二叉查找树void insert(int value) {root = insertRec(root, value);}// 递归方式插入值TreeNode insertRec(TreeNode root, int value) {// 如果树为空,则创建新节点if (root == null) {root = new TreeNode(value);return root;}// 如果值小于根节点,则插入左子树if (value < root.value)root.left = insertRec(root.left, value);// 如果值大于根节点,则插入右子树else if (value > root.value)root.right = insertRec(root.right, value);// 返回(未变更的)节点指针return root;}// 测试查找操作public static void main(String[] args) {BinarySearchTree tree = new BinarySearchTree();tree.insert(50);tree.insert(30);tree.insert(20);tree.insert(40);tree.insert(70);tree.insert(60);tree.insert(80);// 测试查找操作System.out.println(tree.search(50));  // 输出:trueSystem.out.println(tree.search(90));  // 输出:false}
}
查找操作图解

假设我们在上面的树中查找值 5090

  1. 查找 50:从根节点开始,50 正是根节点值,查找成功。
  2. 查找 90:从根节点 50 开始,90 大于 50,查找右子树。然后 90 大于 70,查找右子树。接着 90 大于 80,发现右子树为空,查找失败。
50
30
70
20
40
60
80
查找50
查找90
null

平衡二叉树

平衡二叉树是一类特殊的二叉搜索树,通过自动调整树的结构,使树的高度保持在较低水平,从而提高查找、插入和删除操作的效率。常见的平衡二叉树有 AVL 树和红黑树。

AVL 树

AVL 树是一种自平衡二叉搜索树,它的每个节点都需要满足以下平衡条件:任意节点的左右子树高度差不超过 1。AVL 树通过旋转操作来保持平衡。

AVL 树的旋转操作
  1. 右旋(Right Rotation)
  2. 左旋(Left Rotation)
  3. 左右旋(Left-Right Rotation)
  4. 右左旋(Right-Left Rotation)
右旋
左旋
左右旋
右左旋

红黑树

红黑树是一种自平衡二叉搜索树,每个节点都有颜色属性(红色或黑色),并且需要满足以下性质:

  1. 节点是红色或黑色。
  2. 根节点是黑色。
  3. 每个叶节点(NIL 节点)是黑色。
  4. 如果一个节点是红色,则它的两个子节点都是黑色。
  5. 从一个节点到该节点的所有后代叶节点的所有路径上,包含相同数目的黑色节点。
红黑树的旋转和颜色翻转
  1. 左旋(Left Rotation)
  2. 右旋(Right Rotation)
  3. 颜色翻转(Color Flip)
左旋
右旋
颜色翻转

红黑树的插入操作

红黑树的插入操作和普通二叉搜索树相同,但插入新节点后需要进行重新平衡操作。以下是红黑树的插入操作代码示例:

class RedBlackTreeNode {int value;RedBlackTreeNode left, right, parent;boolean color; // true for Red, false for Black// 构造函数RedBlackTreeNode(int item) {value = item;left = right = parent = null;color = true; // new nodes are red by default}
}class RedBlackTree {private RedBlackTreeNode root;private final RedBlackTreeNode TNULL;// 初始化public RedBlackTree() {TNULL = new RedBlackTreeNode(0);TNULL.color = false;TNULL.left = null;TNULL.right = null;root = TNULL;}// 前序遍历private void preOrderHelper(RedBlackTreeNode node) {if (node != TNULL) {System.out.print(node.value + " ");preOrderHelper(node.left);preOrderHelper(node.right);}}// 中序遍历private void inOrderHelper(RedBlackTreeNode node) {if (node != TNULL) {inOrderHelper(node.left);System.out.print(node.value + " ");inOrderHelper(node.right);}}// 后序遍历private void postOrderHelper(RedBlackTreeNode node) {if (node != TNULL) {postOrderHelper(node.left);postOrderHelper(node.right);System.out.print(node.value + " ");}}// 查找树中的节点private RedBlackTreeNode searchTreeHelper(RedBlackTreeNode node, int key) {if (node == TNULL || key == node.value) {return node;}if (key < node.value) {return searchTreeHelper(node.left, key);}return searchTreeHelper(node.right, key);}// 平衡插入操作private void fixInsert(RedBlackTreeNode k) {RedBlackTreeNode u;while (k.parent.color == true) {if (k.parent == k.parent.parent.right) {u = k.parent.parent.left;if (u.color == true) {u.color = false;k.parent.color = false;k.parent.parent.color = true;k = k.parent.parent;} else {if (k == k.parent.left) {k = k.parent;rightRotate(k);}k.parent.color = false;k.parent.parent.color = true;leftRotate(k.parent.parent);}} else {u = k.parent.parent.right;if (u.color == true) {u.color = false;k.parent.color = false;k.parent.parent.color = true;k = k.parent.parent;} else {if (k == k.parent.right) {k = k.parent;leftRotate(k);}k.parent.color = false;k.parent.parent.color = true;rightRotate(k.parent.parent);}}if (k == root) {break;}}root.color = false;}// 左旋private void leftRotate(RedBlackTreeNode x) {RedBlackTreeNode y = x.right;x.right = y.left;if (y.left != TNULL) {y.left.parent = x;}y.parent = x.parent;if (x.parent == null) {this.root = y;} else if (x == x.parent.left) {x.parent.left = y;} else {x.parent.right = y;}y.left = x;x.parent = y;}// 右旋private void rightRotate(RedBlackTreeNode x) {RedBlackTreeNode y = x.left;x.left = y.right;if (y.right != TNULL) {y.right.parent = x;}y.parent = x.parent;if (x.parent == null) {this.root = y;} else if (x == x.parent.right) {x.parent.right = y;} else {x.parent.left = y;}y.right = x;x.parent = y;}// 插入节点public void insert(int key) {RedBlackTreeNode node = new RedBlackTreeNode(key);node.parent = null;node.value = key;node.left = TNULL;node.right = TNULL;node.color = true;RedBlackTreeNode y = null;RedBlackTreeNode x = this.root;while (x != TNULL) {y = x;if (node.value < x.value) {x = x.left;} else {x = x.right;}}node.parent = y;if (y == null) {root = node;} else if (node.value < y.value) {y.left = node;} else {y.right = node;}if (node.parent == null) {node.color = false;return;}if (node.parent.parent == null) {return;}fixInsert(node);}// 查找树中的节点public RedBlackTreeNode searchTree(int k) {return searchTreeHelper(this.root, k);}// 前序遍历public void preorder() {preOrderHelper(this.root);}// 中序遍历public void inorder() {inOrderHelper(this.root);}// 后序遍历public void postorder() {postOrderHelper(this.root);}// 打印树private void printHelper(RedBlackTreeNode root, String indent, boolean last) {if (root != TNULL) {System.out.print(indent);if (last) {System.out.print("R----");indent += "   ";} else {System.out.print("L----");indent += "|  ";}String sColor = root.color ? "RED" : "BLACK";System.out.println(root.value + "(" + sColor + ")");printHelper(root.left, indent, false);printHelper(root.right, indent, true);}}public void printTree() {printHelper(this.root, "", true);}// 测试红黑树public static void main(String[] args) {RedBlackTree bst = new RedBlackTree();bst.insert(55);bst.insert(40);bst.insert(65);bst.insert(60);bst.insert(75);bst.insert(57);bst.printTree();System.out.println("\n前序遍历:");bst.preorder();System.out.println("\n\n中序遍历:");bst.inorder();System.out.println("\n\n后序遍历:");bst.postorder();}
}
红黑树插入操作图解

假设我们在一棵空的红黑树中插入以下节点:55、40、65、60、75、57,以下是每一步的插入和相应的颜色标注和旋转操作:

  1. 插入 55,成为根节点,颜色变为黑色。
  2. 插入 40,为 55 的左子节点,颜色为红色。
  3. 插入 65,为 55 的右子节点,颜色为红色。
  4. 插入 60,为 65 的左子节点,颜色为红色,需要左旋 65
  5. 插入 75,为 65 的右子节点,颜色为红色。
  6. 插入 57,为 60 的左子节点,颜色为红色,需要右旋 60,然后左旋 55
40 红
55 黑
57 红
60 红
65 红
75 红

结论

通过上述讲解和实例代码,我们详细展示了二叉搜索树的定义、基本操作及平衡二叉树(AVL 树和红黑树)。二叉搜索树在计算机科学中有着广泛的应用,平衡二叉树通过保持树的高度在较低水平,从而提高查找、插入和删除操作的效率。希望这篇博客对您有所帮助!记得关注、点赞和收藏哦,以便随时查阅更多优质内容!


如果您觉得这篇文章对您有帮助,请关注我的CSDN博客,点赞并收藏这篇文章,您的支持是我持续创作的动力!


关键内容总结

  • 二叉搜索树的定义和基本操作
  • 二叉搜索树的插入、删除和查找操作
  • 平衡二叉树:AVL 树和红黑树
  • AVL 树的旋转操作
  • 红黑树的性质和操作

推荐阅读:深入探索设计模式专栏,详细讲解各种设计模式的应用和优化。点击查看:深入探索设计模式。


特别推荐:设计模式实战专栏,深入解析设计模式的实际应用,提升您的编程技巧。点击查看:设计模式实战。

如有任何疑问或建议,欢迎在评论区留言讨论。谢谢阅读!

相关文章:

深入理解二叉搜索树:定义、操作及平衡二叉树

引言 二叉搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种特殊的二叉树结构&#xff0c;每个节点的左子树节点值小于根节点值&#xff0c;而右子树节点值大于根节点值。二叉搜索树在计算机科学中有着广泛的应用&#xff0c;尤其在动态查找表和优先队列…...

vue3组件通信(二)

组件通信 一.$attrs(祖>孙间接&#xff09;二、$refs()父>子&#xff0c; $parent()子>父三.provide&#xff0c;inject(祖>孙直接&#xff09;四.pinia五.slot1.默认插槽2.具名插槽3.作用域插槽 一.$attrs(祖>孙间接&#xff09; $attrs用于实现当前组件的父组…...

关键词查找【Boyer-Moore 算法】

1、【Boyer-Moore 算法】 【算法】哪种算法有分数复杂度&#xff1f;- BoyerMoore字符串匹配_哔哩哔哩_bilibili BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较&#xff0c;而…...

【前端手写代码】手写Object.create

思路&#xff1a;将传入的对象作为原型 // 思路&#xff1a;将传入的对象作为原型 function create(obj) {function F() { }F.prototype objreturn new F() }...

速通JS模块化规范

目录 1模块化概述 1.1什么是模块化&#xff1f; 1.2为什么需要模块化&#xff1f; 2有哪些模块化规范&#xff1f; 3导入与导出的概念 4CommonJS 规范 4.1初步体验 4.2导出数据 4.3导入数据 4.4扩展理解 4.5浏览器端运行 5ES6 模块化规范 5.1初步体验 5.2Node 中运…...

HamonyOS性能优化工具和方法

性能优化&#xff0c;如何做到更快的启动、更流畅的使用&#xff0c;概括图如下 ArkTS高性能编程&#xff1a; 1. ArkTS规则&#xff1a;有利于方舟编译运行时进行编译优化 2. 使用AOT(Ahead Of Time)模式对应用进行编译优化&#xff1a;方舟编译运行时通过采用PGO(Profile-Gui…...

前端实现边下载文件边上传

问题记录原因&#xff1a; 因为需要实现网络文件的上传&#xff0c;结果是由前端实现&#xff0c;方式是一边下载&#xff0c;一遍上传文件&#xff0c;小文件直接上传&#xff0c;大文件进行切片&#xff0c;切片大小和下载大小有关&#xff0c;特此记录。 1.实现方案 fetc…...

滑线变阻器的优缺点是什么?

滑线变阻器是常见的电子元件&#xff0c;主要用于调节电路中的电阻值&#xff0c;从而达到改变电流、电压的目的。它的主要优点是结构简单、操作方便、成本低&#xff0c;因此在各种电子设备中都有广泛的应用。然而&#xff0c;滑线变阻器也存在一些缺点&#xff0c;主要表现在…...

K8s大模型算力调度策略的深度解析

随着大数据和人工智能技术的飞速发展&#xff0c;Kubernetes&#xff08;简称K8s&#xff09;作为容器编排的领军者&#xff0c;在支撑大规模模型训练和推理方面扮演着越来越重要的角色。在大模型算力的调度过程中&#xff0c;如何高效、合理地分配和管理资源成为了一个亟待解决…...

Unity Transform组件实现动画:基础与进阶技巧

在Unity中&#xff0c;Transform组件是控制游戏对象&#xff08;GameObject&#xff09;位置、旋转和缩放的核心组件。通过编程控制Transform组件&#xff0c;开发者可以创建各种动画效果。本文将介绍如何使用Transform组件实现动画&#xff0c;从基础的运动到更高级的动画技巧…...

基于深度学习的图像与文本结合

基于深度学习的图像与文本结合的研究领域&#xff0c;是近年来多模态学习&#xff08;Multimodal Learning&#xff09;中非常活跃的方向。该领域涉及到如何将图像和文本两种不同类型的数据进行融合和处理&#xff0c;从而实现更智能的任务和应用。以下是对这一领域的详细介绍&…...

windows安全加固

一、补丁管理 及时安装补丁&#xff1a;定期检查和安装Windows系统及其应用程序的更新和补丁&#xff0c;以修复已知的安全漏洞。可以使用Windows Update功能或第三方补丁管理工具来实现。补丁管理策略&#xff1a;对于无法直接访问互联网的服务器&#xff0c;可以建立内部补丁…...

网络安全是什么?怎么入门网络安全?

一、网络安全的定义 网络安全&#xff0c;简单来说&#xff0c;就是保护网络系统中的硬件、软件以及其中的数据不因偶然或恶意的原因而遭到破坏、更改、泄露&#xff0c;保障系统连续可靠正常地运行&#xff0c;网络服务不中断。 随着信息技术的飞速发展&#xff0c;网络安全的…...

语义分割介绍

1. 定义 语义指具有人们可用语言探讨的意义&#xff0c;分割指图像分割。 语义分割(semantic segmentation)能够将整张图的每个部分分割开&#xff0c;使每个部分都有一定类别意义&#xff08;语义&#xff09;&#xff0c;让计算机可以理解图像。 语义分割是以描边的形式&…...

Unity Editor免登录启动 无需UnityHub

Unity Editor免登录启动项目无需UnityHub&#xff0c;命令行启动项目。需要开发Unity项目&#xff0c;就必须使用 Unity Hub来管理你的项目&#xff0c;还必须要申请一个免费许可&#xff0c;确实有点麻烦&#xff0c;官方已经提供了相关命令行&#xff0c;来直接使用Unity Edi…...

Redis实战篇(黑马点评)笔记总结

一、配置前后端项目的初始环境 前端&#xff1a; 对前端项目在cmd中进行start nginx.exe&#xff0c;端口号为8080 后端&#xff1a; 配置mysql数据库的url 和 redis 的url 和 导入数据库数据 二、登录校验 基于Session的实现登录&#xff08;不推荐&#xff09; &#xf…...

vulntarget-b

实际部署之后centos7 的ip有所变动分别是 :192.168.127.130以及10.0.20.30 Centos7 老规矩还是先用fscan扫一下服务和端口&#xff0c;找漏洞打 直接爆出来一个SSH弱口令…&#xff0c;上来就不用打了&#xff0c;什么意思&#xff1f;&#xff1f;&#xff1f; 直接xshell…...

Axure Web端元件库:构建高效互动网页的基石

在快速迭代的互联网时代&#xff0c;Web设计与开发不仅追求视觉上的美感&#xff0c;更注重用户体验的流畅与功能的强大。Axure RP&#xff0c;作为一款专业的原型设计工具&#xff0c;凭借其强大的交互设计能力和丰富的元件库&#xff0c;成为了众多UI/UX设计师、产品经理及前…...

mac OS matplotlib missing from font(s) DejaVu Sans

如果能搜索到这篇文章&#xff0c;我猜你遇到了和我一样的问题&#xff1a;matplotlib绘图中文乱码。如下&#xff1a; 出现这个问题的原因是&#xff1a;matplotlib使用的字体列表中默认没有中文字体。 这里说一种解决方案&#xff1a;我们可以在文件中手动指定matplotlib使用…...

在 .NET 中使用 Elasticsearch:从安装到实现搜索功能的完整指南

在 .NET 中使用 Elasticsearch Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;广泛应用于处理大规模数据和实时搜索需求。本文将介绍如何在 .NET 环境下使用 Elasticsearch&#xff0c;帮助开发者快速上手并实现基本的搜索功能。 1. 环境准备 首先&#xff0c;我们需…...

跨越平台壁垒:gibMacOS如何让非Mac设备直接获取官方macOS安装文件

跨越平台壁垒&#xff1a;gibMacOS如何让非Mac设备直接获取官方macOS安装文件 【免费下载链接】gibMacOS Py2/py3 script that can download macOS components direct from Apple 项目地址: https://gitcode.com/gh_mirrors/gi/gibMacOS 在当今多平台开发与测试的复杂环…...

负载开关电路设计:从分立PMOS到集成芯片的选型与应用

1. 负载开关电路&#xff1a;从分立搭建到集成方案的全景解析在电路设计&#xff0c;尤其是电源管理领域&#xff0c;一个常见的需求是控制多个负载的供电通断。想象一下&#xff0c;你的系统里有主控MCU、传感器、通信模块和显示屏&#xff0c;你希望系统休眠时只保留MCU的待机…...

UVa 275 Expanding Fractions

题目分析 本题要求计算两个正整数的除法的小数展开形式&#xff0c;其中分子小于分母&#xff0c;分母小于 100010001000。输入以 0 0 结束。 对于每个分数&#xff0c;需要输出其小数部分&#xff08;从小数点开始&#xff09;&#xff0c;并且&#xff1a; 如果小数是有限的&…...

【Midjourney企业版落地实战指南】:从0到1搭建合规、可控、可审计的AI设计中台

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;【Midjourney企业版落地实战指南】&#xff1a;从0到1搭建合规、可控、可审计的AI设计中台 企业引入Midjourney需突破个人账号局限&#xff0c;构建具备身份鉴权、用量管控、内容水印、操作留痕与策略审…...

2025睿抗机器人大赛智能侦查赛道省赛全流程——基础了解

2025睿抗机器人大赛智能侦查赛道省赛全流程——基础了解 智能侦查赛道概述 2025 睿抗机器人大赛智能侦察赛道是 CAIR 工程竞技赛道下的专业国防装备赛项&#xff0c;以无人侦察车为载体、模拟巷战环境开展军事侦察任务&#xff0c;核心培养学生国防意识与科技创新能力且核心硬件…...

魔兽争霸III终极优化工具:解决宽屏拉伸与高帧率限制的完整指南

魔兽争霸III终极优化工具&#xff1a;解决宽屏拉伸与高帧率限制的完整指南 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏《魔兽争霸I…...

智慧树刷课插件完整教程:3步实现自动学习,告别手动刷课烦恼

智慧树刷课插件完整教程&#xff1a;3步实现自动学习&#xff0c;告别手动刷课烦恼 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的手动刷课而烦…...

ARGUS:视觉中心化多模态推理框架,实现像素级可验证Chain-of-Thought

1. 项目概述&#xff1a;这不是又一个“多模态大模型”&#xff0c;而是一次视觉推理范式的重新校准ARGUS这个名字&#xff0c;乍看像某个军事侦察系统代号&#xff0c;其实它精准指向了当前多模态AI领域最棘手的痛点——视觉信息在推理链中长期处于“失语”状态。你肯定见过这…...

神经符号系统实践手记:可微逻辑层与梯度重定向实现

1. 这不是又一个“AI综述”&#xff0c;而是一份可拆解、可复现的神经符号系统实践手记“Neurosymbolic AI”这个词&#xff0c;过去三年在顶会论文标题里出现频率翻了四倍&#xff0c;但真正能说清“我在哪一步调用了符号规则”“我的反向传播怎么和逻辑推理共存”的人&#x…...

Triton+Istio+Prometheus构建高可用ML模型服务化架构

1. 项目概述&#xff1a;这不是一次“部署”&#xff0c;而是一场从实验室到产线的系统性迁移“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题里藏着太多被轻描淡写却重若千钧的词。“Notebook”不是指纸质本子&#xff0c;而是Jupyter里…...