【数据结构】二叉树总结篇
遍历
递归
递归三部曲
:
1.参数和返回值
2.终止条件
3.单层逻辑(遍历顺序
)
var preorderTraversal = function(root) {
// 第一种let res=[];const dfs=function(root){if(root===null)return ;//先序遍历所以从父节点开始res.push(root.val);//递归左子树dfs(root.left);//递归右子树dfs(root.right);}//只使用一个参数 使用闭包进行存储结果dfs(root);return res;
迭代
借助栈
或队列
前序和后序
前序遍历:
// 入栈 右 -> 左
// 出栈 中 -> 左 -> 右
var preorderTraversal = function(root, res = []) {if(!root) return res;const stack = [root];let cur = null;while(stack.length) {cur = stack.pop();res.push(cur.val);cur.right && stack.push(cur.right);cur.left && stack.push(cur.left);}return res;
};// 入栈 左 -> 右
// 出栈 中 -> 右 -> 左 结果翻转var postorderTraversal = function(root, res = []) {if (!root) return res;const stack = [root];let cur = null;do {cur = stack.pop();res.push(cur.val);cur.left && stack.push(cur.left);cur.right && stack.push(cur.right);} while(stack.length);return res.reverse();
};
中序
中序遍历:// 入栈 左 -> 右
// 出栈 左 -> 中 -> 右var inorderTraversal = function(root, res = []) {const stack = [];let cur = root;while(stack.length || cur) {if(cur) {stack.push(cur);// 左cur = cur.left;} else {// --> 弹出 中cur = stack.pop();res.push(cur.val); // 右cur = cur.right;}};return res;
};
层序
队列
当前层元素个数
var levelOrder = function(root) {//二叉树的层序遍历let res = [], queue = [];queue.push(root);if(root === null) {return res;}while(queue.length !== 0) {// 记录当前层级节点数!!!let length = queue.length;//存放每一层的节点!!!let curLevel = [];for(let i = 0;i < length; i++) {let node = queue.shift();curLevel.push(node.val);// 存放当前层下一层的节点node.left && queue.push(node.left);node.right && queue.push(node.right);}//把每一层的结果放到结果数组res.push(curLevel);}return res;
};
应用
反转二叉树
前序
,若中序
注意调整
var invertTree = function(root) {//1.前序//递归if(root==null)return null;//中,交换左右节点swap(root)//左invertTree(root.left);//右invertTree(root.right);return root ;//中序遍历的话:左中右(右传的也是左指针,因为先翻完左树,再交换左右树,交换完的左数成右树了,所以还得传左!!!)//迭代法if(!root)return null;let stack=[root];while(stack.length>0){let cur=stack.pop();swap(cur)if(cur.left)stack.push(cur.left);if(cur.right)stack.push(cur.right);}return root;// //层次遍历(广度优先)->队列if(!root)return null;let queue=[root];while(queue.length>0){let levelSize=queue.length;for(let i=0;i<levelSize;i++){let cur=queue.shift();swap(cur);if(cur.left)queue.push(cur.left);if(cur.right)queue.push(cur.right)}}return root;};function swap(node){left=node.left;node.left=node.right;node.right=left;}
对称二叉树
比较逻辑
,后序
遍历
var isSymmetric = function(root) {//比较节点const compare=function(root1,root2){//终止条件!!!,默认遇到底就返回true,所以只考虑那些为false的条件if(!root1 && !root2)return true;else if(root1===null&&root2!==null||root2===null&&root1!==null)return false;else if(root1.val!==root2.val) return false//单层递归逻辑let outside=compare(root1.left,root2.right);let inside=compare(root1.right,root2.left);return outside&&inside;}if(root === null) {return true;}return compare(root.left,root.right)
};
最大深度
后序
+1
细节
var maxDepth = function(root) {//递归方法if(root===null){return 0}else{let left=maxDepth(root.left);let right=maxDepth(root.right);return Math.max(left,right)+1;}
};
最小深度
考虑左侧或右侧为空
的情况,最小深度不是1
而是另外计算算法
var minDepth = function(root) {//递归//重点:递归终止条件if(root===null)return 0;//叶子节点// if(!root.left&&!root.right) return 1;if(root.left===null){return minDepth(root.right)+1;}if(root.right===null){return minDepth(root.left)+1;}let left=minDepth(root.left);let right=minDepth(root.right);let result=Math.min(left,right)+1; return result;
}
完全二叉树的节点个数
普通二叉树解决
var countNodes = function(root) {//递归方法const getNumbers=function(root){//终止条件if(!root)return 0;let left=getNumbers(root.left);let right=getNumbers(root.right);return left+right+1;}return getNumbers(root)
}
利用完全二叉树性质+递归方法
//**终止条件// if(!root)return 0;// //定义左右节点// let left=root.left;// let right=root.right;// let leftDepth=0,rightDepth=0;// while(left){// left=left.left;// leftDepth++;// }// while(right){// right=right.right;// rightDepth++;// }// if(leftDepth===rightDepth){// return Math.pow(2,leftDepth+1)-1;// }// return countNodes(root.left)+countNodes(root.right)+1;
平衡二叉树⭐
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1
-1
表示已经不是平衡二叉树了,否则返回值是以该节点为根节点树的高度
var isBalanced = function(root) {// //还是用递归三部曲 + 后序遍历 左右中 // //!!!当前左子树右子树高度相差大于1就返回-1,标识相差大于1的!!!!const getDepth=function(node){if(!node)return 0;//不为-1的所有数,用于标识//确定单层遍历逻辑let leftDepth=getDepth(node.left);//左子树高度// 当判定左子树不为平衡二叉树时,即可直接返回-1if(leftDepth===-1)return -1;let rightDepth=getDepth(node.right);if(rightDepth===-1)return -1;//判断左右子树高差if(Math.abs(leftDepth-rightDepth>1)){return -1;}else{return 1 + Math.max(leftDepth,rightDepth);}}return !(getDepth(root)===-1) };
二叉树的所有路径
回溯+递归
算法
Javascript回溯算法大全——组合、分割、子集、排列和棋盘问题
回溯算法,就是将问题其抽象一棵树,而本次二叉树所有路径本身就是一棵树
var binaryTreePaths = function(root) {let res=[];const backtracking=(root,value)=>{//到叶子节点就返回if(!root.left&&!root.right){value+=root.val;res.push(value);return;}//前序,简单的回溯value+=root.val+"->";root.left&&backtracking(root.left,value);root.right&&backtracking(root.right,value)}backtracking(root,'');return res;
};
左叶子之和⭐
判断当前节点是不是左叶子是无法判断的,
必须
要通过节点的父节点来判断其左孩子是不是左叶子
: if(node.left !== null && node.left.left === null && node.left.right === null)
平时我们解二叉树的题目时,已经习惯了通过节点的左右孩子判断本节点的属性,而本题我们要通过节点的父节点判断本节点的属性。
后序
遍历
var sumOfLeftLeaves = function(root) {//迭代let sum=0;let stack=[root];if(!root)return 0;while(stack.length){let cur=stack.pop();if(cur.left&&!cur.left.left&&!cur.left.right){sum+=cur.left.val;}cur.left&&stack.push(cur.left);cur.right&&stack.push(cur.right);}return sum;
}var sumOfLeftLeaves = function(root) {//采用后序遍历 递归遍历// 1. 确定递归函数参数const nodesSum = function(node) {// 2. 确定终止条件if(!node) {return 0;}let leftValue = nodesSum(node.left);let rightValue = nodesSum(node.right);// 3. 单层递归逻辑let midValue = 0;if(node.left && !node.left.left && !node.left.right) {midValue = node.left.val;}let sum = midValue + leftValue + rightValue;return sum;}return nodesSum(root);
}
找树左下角的值
var findBottomLeftValue = function(root) {//Todo:最大深度,最左侧的值// 层次遍历let queue=[root];if(!root)return null;let res;while(queue.length){let length=queue.length;for(let i=0;i<length;i++){let curNode=queue.shift();if(i===0){res=curNode.val;}curNode.left&&queue.push(curNode.left);curNode.right&&queue.push(curNode.right);}}return res;
}
路径总和⭐⭐
回溯
算法
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @param {number} targetSum* @return {boolean}*/
var hasPathSum = function(root, targetSum) {//targetSum依次往下减,直至减到0且找到叶子节点,就找到路径if(!root)return false;let backtracking=(root,targetSum)=>{//到根节点且刚好和为targetSumif(targetSum===0&&!root.left&&!root.right) return true;// 遇到叶子节点而没有找到合适的边(计数不为0),直接返回if (!root.left&&!root.right) return false;if(root.left){targetSum-=root.left.valif(backtracking(root.left,targetSum)) return true;targetSum+=root.left.val}if(root.right){targetSum-=root.right.valif(backtracking(root.right,targetSum)) return true;targetSum+=root.right.val}return false;}return backtracking(root,targetSum-root.val);
};
路径总和II⭐⭐
处理根节点逻辑
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @param {number} targetSum* @return {number[][]}*/
var pathSum = function(root, targetSum) {let res=[]if(!root)return res;let path=[root.val];let backtracking=(root,sum)=>{if(!root.left&&!root.right&&sum===targetSum){res.push(path.slice());return;}if(!root.left&&!root.right)return;//左if(root.left){path.push(root.left.val);sum+=root.left.val;backtracking(root.left,sum);sum-=root.left.val;path.pop();}//右if(root.right){path.push(root.right.val);sum+=root.right.val;backtracking(root.right,sum);sum-=root.right.val;path.pop();}return;}backtracking(root,root.val)return res;
}
从中序与后序遍历序列构造二叉树
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*/
/*** @param {number[]} inorder* @param {number[]} postorder* @return {TreeNode}*/
var buildTree = function(inorder, postorder) {//中序:左中右//后序:左右中//返回条件if(!postorder.length)return null;//1.从后序找到中间节点let midVal=postorder.pop();let root=new TreeNode(midVal);//左中序,右后序let index=inorder.indexOf(midVal);//找到中序的mid对应的索引root.left=buildTree(inorder.slice(0,index),postorder.slice(0,index));root.right=buildTree(inorder.slice(index+1),postorder.slice(index));return root;
};
从前序与中序遍历序列构造二叉树
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*/
/*** @param {number[]} preorder* @param {number[]} inorder* @return {TreeNode}*/
var buildTree = function(preorder, inorder) {//前序:中左右//中序:左中右if(!preorder.length)return null;let midVal=preorder.shift();let index=inorder.indexOf(midVal);let root=new TreeNode(midVal);root.left=buildTree(preorder.slice(0,index),inorder.slice(0,index));root.right=buildTree(preorder.slice(index),inorder.slice(index+1));return root;
};
最大二叉树
/*** Definition for a binary tree node.* function TreeNode(val, left, right) {* this.val = (val===undefined ? 0 : val)* this.left = (left===undefined ? null : left)* this.right = (right===undefined ? null : right)* }*/
/*** @param {number[]} nums* @return {TreeNode}*/
var constructMaximumBinaryTree = function(nums) {//构建二叉树类型题目——前序遍历if(!nums.length)return null;//1.找最大let max=-1,maxIndex=-1;for(let i=0;i<nums.length;i++){if(nums[i]>max){max=nums[i];maxIndex=i;}}//2.构建根节点let root =new TreeNode(max);//构建左边root.left=constructMaximumBinaryTree(nums.slice(0,maxIndex));//构建右边root.right=constructMaximumBinaryTree(nums.slice(maxIndex+1));return root;
};
相关文章:
【数据结构】二叉树总结篇
遍历 递归 递归三部曲: 1.参数和返回值 2.终止条件 3.单层逻辑(遍历顺序) var preorderTraversal function(root) { // 第一种let res[];const dfsfunction(root){if(rootnull)return ;//先序遍历所以从父节点开始res.push(root.val);//递归…...
Zookeeper 及 基于ZooKeeper实现的分布式锁
1 ZooKeeper 1.1 ZooKeeper 介绍 ZooKeeper是一个开源的分布式协调服务,它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。 原语:操作系统或…...
内嵌踢脚线怎么做能省钱?
家里装修内嵌踢脚线应该怎么做?哪种做法更经济? 先回答内嵌踢脚线应该怎么做? 做内嵌踢脚线有两种办法,简单点来说就是前凸和后挖。 前凸是踢脚线安到原来墙面上,踢脚线是从墙面上凸出来的,想要实现内嵌的效…...
DeepSeek集成到VScode工具,让编程更高效
DeepSeek与VScode的强强联合,为编程效率树立了新标杆。 DeepSeek,一款卓越的代码搜索引擎,以其精准的索引和高速的检索能力,助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后,开发者无需离开熟悉的编辑…...
大模型应用:多轮对话(prompt工程)
概述 在与大型语言模型(如ChatGPT)交互的过程中,我们常常体验到与智能助手进行连贯多轮对话的便利性。那么,当我们开启一个新的聊天时,系统是如何管理聊天上下文的呢? 一、初始上下文的建立 1. 创建新会…...
洛谷 P1601 A+B Problem(高精)详解c++
我们之前做题碰到的数据范围一般是10^9,多点会达到10^18级别,处理10^9用int就可以存下,10^18次方要用到long long,接着解决加减乘除的问题,但是当数据范围达到了10^10^6的时候,当数据的值特别⼤,…...
【云原生】Spring Cloud是什么?Spring Cloud版本介绍
什么是SpringCloud 上一章节介绍了总体的SpringCloud的总体学习章节,因为最近项目刚好需要用到SpringCloud来搭建微服务项目、所以就跟着大家一起来再学习巩固下SpringCloud的相关知识 SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注…...
最节省成本的架构方案:无服务器架构
无服务器架构(Serverless Architecture)是一种颠覆性的云计算执行模型,它允许开发者专注于编写和部署代码,而无需担心底层服务器基础设施的管理。这种架构以其按需付费、自动伸缩和简化部署等优势,在成本优化方面表现出…...
C++入门续集:
1. 缺省参数: 我们看我们的上图,我们可以看我们的函数Func,我们可以看到我们的函数里面的参数写的是int a 0;这个写法是我们没有见过的,我们之前在C语言里面只见到过说是函数里面会设置参数,但是参数是没有…...
线代[9]|线性代数主要内容及其发展简史(任广千《线性代数的几何意义》的附录1)
文章目录 向量行列式矩阵线性方程组二次型 向量 向量又称为矢量,最初应用与物理学。很多物理量如力、速度、位移以及电场强度、磁感应强度等等都是向量。大约公元前350年前,古希腊著名学者亚里士多德就知道了力可以表示成向量,两个力的组合作…...
C++ Primer 动态内存与智能指针
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
AI在原型设计中的革命性应用:效率与创新的双重突破
引言 在数字化转型加速的今天,产品开发周期被压缩至前所未有的程度。原型设计作为产品开发的核心环节,其效率和质量直接影响最终产品的市场竞争力。传统原型设计流程依赖人工绘制、反复修改和用户测试,耗时且成本高昂。而人工智能࿰…...
网络学习(四)HTTPS中,SSL的单向认证与双向认证
目录 一、什么是SSL?1.1 SSL 的主要功能1.2 SSL 的工作原理1.3 SSL 的核心组件1.4 SSL 的应用场景1.5 SSL 与 TLS 的区别 二、SSL 单向认证、双向认证2.1 SSL 单向认证2.2 SSL 双向认证2.3 总结:SSL 单向认证和双向认证的区别 一、什么是SSL?…...
分类任务和回归任务的区别
分类任务和回归任务是机器学习中两种常见的监督学习任务,尽管它们都属于预测性的分析,但它们的目标和应用场景存在显著的差异。 分类任务 定义:分类任务是指将输入样本映射到一个有限且离散的类别集合中的过程。目标是对数据进行分类&#…...
android接入rocketmq
一 前言 RocketMQ 作为一个功能强大的消息队列系统,不仅支持基本的消息发布与订阅,还提供了顺序消息、延时消息、事务消息等高级功能,适应了复杂的分布式系统需求。其高可用性架构、多副本机制、完善的运维管理工具,以及安全控制…...
V4L2框架基础
一、V4L2视频设备驱动基础 1.V4L2是专门为Linux设备设计的整合视频框架(其主要核心在Linux内核,相当于Linux操作系统上层的视频源捕获驱动框架)。为上层访问系统底层的视频设备提供一个统一的标准接口。V4L2驱动框架能够支持多种类型&#x…...
【微知】如何通过mlxlink查看Mellanox网卡和光模块相关的信息?( mlxlink -d 01:00.0 -m)
背景 通过mlxlink可以查看Mellanox网卡的一些链路信息和硬件信息,也可以查看所插入的光模块的一些信息。 兄弟篇通过ethtool查看的方法:如何查看Mellanox网卡上的光模块的信息? 命令 mlxlink -d 01:00.0 -mman手册介绍: 如果…...
使用pytorch和opencv根据颜色相似性提取图像
需求:将下图中的花朵提取出来。 代码: import cv2 import torch import numpy as np import timedef get_similar_colors(image, color_list, threshold):# 将图像和颜色列表转换为torch张量device torch.device(cuda if torch.cuda.is_available() el…...
HTML label 标签使用
点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签,可以使表单更加友好和易于使用,同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…...
SQL注入的分类靶场实践
前言 SQL 注入(SQL Injection)是一种常见且危险的 Web 安全漏洞,攻击者通过在输入字段中插入恶意 SQL 代码,能够绕过应用程序的验证机制,直接操纵数据库。本文将介绍 SQL 注入的分类,并通过 Pikachu 靶场进…...
用matplotlib构建BI看板:Superset插件开发实战
目录 前言:当经典可视化库遇见BI航母 一、Superset插件架构精要 1.1 核心模块解析 1.2 插件通信机制 二、开发环境准备 2.1 依赖矩阵 三、开发自定义可视化插件 3.1 插件脚手架 3.2 渲染引擎适配 四、Superset深度集成 4.1 控制面板配置 4.2 动态参数传递…...
【Linux】之【Bug】VMware 虚拟机开机 一直卡在黑屏左上角下划线闪烁界面
解决 参考: 解决Ubuntu20.04 开机黑屏光标闪烁进不去系统 Centos根目录100%解决思路 当前界面 ctrlaltf3-f6 暂时进入终端界面 df -h 查看发现根目录 磁盘空间已满 执行命令 查看当前目录占用内存明细 sudo du -h -x --max-depth1清理无用的大内存文件 或者安装…...
【练习】【链表】力扣热题100 19. 删除链表的倒数第 N 个结点
题目 删除链表的倒数第 N 个结点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出&…...
SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...
【Linux】进程信号——信号保存和信号捕捉
文章目录 信号保存信号相关的概念信号是如何保存的呢?有关信号保存的系统调用sigprocmask信号的增删查改查看pending表验证接口 信号捕捉用户态与内核态信号捕捉流程 总结 信号保存 信号相关的概念 信号递达:指 操作系统 将一个信号(Signal…...
任务9:交换机基础及配置
CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、交换机基础 交换机的概念:交换机是一种网络设备,用于连接多台计算机或网络设备,实现数据包在局域网内的快速交换。交换机基于MAC地址来转发数据包&#x…...
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
目录: 1.题目描述: 输入格式 输出格式 2.题解: 3.详细c代码 1.题目描述: 小明冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。…...
深度学习R8周:RNN实现阿尔兹海默症(pytorch)
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 数据集包含2149名患者的广泛健康信息,每名患者的ID范围从4751到6900不等。该数据集包括人口统计详细信息、生活方式因素、病史、临床测量、认知和功…...
字节跳动发布 Trae AI IDE!支持 DeepSeek R1 V3,AI 编程新时代来了!
3 月 3 日,字节跳动重磅发布国内首款 AI 原生集成开发环境(AI IDE)——Trae 国内版! Trae 不只是一个传统的 IDE,它深度融合 AI,搭载 doubao-1.5-pro 大模型,同时支持DeepSeek R1 & V3&…...
智能合约安全指南 [特殊字符]️
智能合约安全指南 🛡️ 1. 安全基础 1.1 常见漏洞类型 重入攻击整数溢出权限控制缺陷随机数漏洞前后运行攻击签名重放 1.2 安全开发原则 最小权限原则检查-生效-交互模式状态机安全失败保护机制 2. 重入攻击防护 2.1 基本防护模式 contract ReentrancyGuarde…...
DeepSeek 全套资料pdf合集免费下载(持续更新)
有很多朋友都关注DeepSeek相关使用的教程资料,本站也一直持续分享DeepSeek 学习相关的pdf资料,由于比较零散,这篇文章主要就是做一个汇总,并且持续更新,让大家可以及时获取下载最新的相关DeepSeek的资料。 持续更新地…...
IDEA 接入 Deepseek
在本篇文章中,我们将详细介绍如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek,让你的 AI 编程助手更智能,提高开发效率。 一、前置准备 在开始之前,请确保你已经具备以下条件: 安装了 JetBrains IDEA&…...
将md格式转jupyter并运行
将md格式转jupyter并运行 有时候我们需要将这种文档以学习的形式记笔记到jupyter中(任务) 但是内容太多了,一个一个粘贴又不方便,怎么办呢? 发现直接粘贴到md中是带格式的!!! 那…...
SOUI基于Zint生成EAN码
EAN码广泛应用与欧洲的零售业。包括EAN-2、EAN-5、EAN-8和EAN-12码。分别编码 2、5、7 或 12 位数字。此外,可以使用 字符将 EAN-2 和 EAN-5 附加符号添加到 EAN-8 和 EAN-13 符号中,就像 UPC 符号一样。 EAN-8校验码计算: 从左往右奇数位的…...
StarRocks-fe工程在Cursor中不能识别为Java项目
SR简介 StarRocks 是一款高性能分析型数据库,支持实时、多维度、高并发的数据分析。本指南旨在解决在使用 VSCode 或 Cursor 开发 StarRocks 后端项目时遇到的模块识别问题。 问题描述 使用 Cursor 或 VSCode 打开 StarRocks 的后端工程 fe 时,spark-…...
AI是否能真正理解人类情感?从语音助手到情感机器人
引言:AI与情感的交集 在过去的几十年里,人工智能(AI)的发展速度令人惊叹,从简单的语音识别到如今的深度学习和情感计算,AI已经深入到我们生活的方方面面。尤其是在语音助手和情感机器人领域,AI不…...
【Linux】【网络】UDP打洞-->不同子网下的客户端和服务器通信(成功版)
【Linux】【网络】UDP打洞–>不同子网下的客户端和服务器通信(成功版) 根据上个文章的分析 问题可能出现在代码逻辑上面 我这里重新查找资料怀疑: 1 NAT映射可能需要多次数据包的发送才能建立。 2 NAT映射保存时间太短ÿ…...
【微知】如何查看Mellanox网卡上的光模块的信息?(ethtool -m enp1s0f0 看型号、厂商、生产日期等)
背景 服务器上插入的光模块经常被忽略,往往这里是定位问题最根本的地方。如何通过命令查看? 命令 ethtool提供了-m参数,m是module-info的意思,他是从光模块的eeprom中读取数据。(应该是用i2c协议读取的)…...
图论基础算法: 二分图的判定(C++)
二分图的基本概念 什么是二分图? 二分图(Bipartite Graph)是指一个图的顶点集可以被分割为两个互不相交的子集 U U U 和 V V V, 并且图中的每一条边都连接 U U U 中的一个顶点和 V V V 中的一个顶点. 换句话说, 二分图中的顶点可以被分成两组, 组内的顶点之间没有边相连…...
AI赋能校园安全:科技助力预防与应对校园霸凌
校园本应是学生快乐学习、健康成长的地方,然而,校园霸凌却成为威胁学生身心健康的隐形“毒瘤”。近年来,随着人工智能(AI)技术的快速发展,AI在校园安全领域的应用逐渐成为解决校园霸凌问题的新突破口。通过…...
PyTorch系列教程:评估和推理模式下模型预测
使用PyTorch时,将模型从训练阶段过渡到推理阶段是至关重要的一步。在推理过程中,该模型用于对以前从未见过的新数据进行预测。这种转换的一个重要方面是使用推理模式,它通过禁用仅在训练期间需要的操作来帮助优化模型的性能。 理解推理模式 …...
Linux注册进程终止处理函数
atexit() 是一个标准库函数,用于注册在进程正常终止时要调用的函数。通过 atexit(),你可以确保在程序结束时自动执行一些清理工作,比如释放资源、保存状态等。 函数原型如下: #include <stdlib.h> int atexit(void (*func…...
Lumerical INTERCONNECT 中的自相位调制 (SPM)
一、自相位调制的数学介绍 A.非线性薛定谔方程(NLSE): NLSE 是光学中的一个关键方程。它告诉我们光脉冲在具有非线性和色散特性的介质中的行为方式。该方程如下所示: i ∂A/∂z β2/2 ∂A/∂t γ|A|A 0 其中: - …...
DICOM服务中的C-STORE、 C-FIND、C-MOVE、C-GET、Worklist
DICOM服务说明 DICOM(Digital Imaging and Communications in Medicine)是一种用于处理、存储、打印和传输医学影像的标准。DICOM定义了多种服务类,其中C-STORE、C-FIND、C-MOVE和C-GET是与影像数据查询和检索相关的四个主要服务类ÿ…...
Python的pdf2image库将PDF文件转换为PNG图片
您可以使用Python的pdf2image库将PDF文件转换为PNG图片。以下是一个完整的示例,包含安装步骤、代码示例和注意事项。 安装依赖库 首先,您需要安装pdf2image库: pip install pdf2imagepdf2image依赖于poppler库来解析PDF文件。 Windows系统…...
在Blender中给SP分纹理组
在Blender中怎么分SP的纹理组/纹理集 其实纹理组就是材质 把同一组的材质分给同一组的模型 导入到sp里面自然就是同一个纹理组 把模型导入SP之后 就自动分好了...
import模块到另一个文件夹报错:ModuleNotFoundError: No module named xxx
1. 问题 打开项目文件夹my_code,将bb.py的函数或者类import到aa.py中,然后运行aa.py文件,可能会报错ModuleNotFoundError: No module named xxx。 E:\Desktop\my_code ├── a │ ├── train.sh │ └── aa.py └── b└── b…...
[SystemVerilog]例化
SystemVerilog 的例化方式和Verilog 类似 如果信号输入输出name一致 abc abc_inst( .a(a), .b(b), c(c) ); 使用SystemVerilog abc abc_inst( .a, .b, .c ); 或者 abc abc_inst( .* ); 在SystemVerilog中,可以简化例化方式。 可以使用…...
Java方法详解
Java方法详解 方法1.方法的概念(1).什么是方法(2).方法的定义(3).实参与形参的关系 2.方法重载(1).方法重载的概念 3.递归(C语言详细讲过) 方法 1.方法的概念 (1).什么是方法 方法类似于C语言中的函数,我们重在体会与理解,不必…...
springboot自动插入创建时间和更新时间到数据库
springboot自动插入创建时间和更新时间到数据库 1.添加TableField注解2.添加TimeMetaObjectHandler配置3.测试 1.添加TableField注解 /*** 创建时间*/TableField(fill FieldFill.INSERT) // 插入时生效private LocalDateTime createTime;/*** 修改时间*/TableField(fill Fiel…...