堆和二叉树--数据结构初阶(3)(C/C++)
文章目录
- 前言
- 理论部分
- 堆的模拟实现:(这里举的大根堆)
- 堆的创建
- 二叉树的遍历
- 二叉树的一些其他功能实现
- 作业部分
前言
这期的话讲解的是堆和二叉树的理论部分和习题部分
理论部分
二叉树的几个性质:1.对于任意一个二叉树,度为0的节点比度为2的节点多一个
2.对于完全二叉树,度为1的节点要么是1,要么是03.表示二叉树的值在数组位置中父子下标关系:
parent = (child-1)/2 leftchild = parent
*
2+1 rightchild = parent*
2+2前提:二叉树的根节点是下标为0,是第1个
此外,数组存储二叉树只适合完全二叉树(较满的),不然浪费的空间太多了
二叉树的第n层有2n-1个节点
节点的个数=边数-1 边数 = 节点的度相加之和
陌生的名词:
树度:也就是树的度,是树中节点度的最大值
堆是完全二叉树
小根堆:树中所有的父亲的值都小于等于孩子(最小的在根节点)
大根堆:树中所有的父亲的值都大于等于孩子(最大的在根节点)
跟二叉搜索树要区分一样(那个对左右孩子放法也有要求)
堆的模拟实现:(这里举的大根堆)
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>// 大堆
typedef int HPDataType;
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;void HeapInit(HP* php);
void HeapPush(HP* php, HPDataType x);
void HeapPop(HP* php);
int HeapSize(HP* php);
void AdjustUp(HPDataType* a, int child);
void AdjustDown(HPDataType* a, int n, int parent);
void Swap(HPDataType* p1, HPDataType* p2);void HeapInit(HP* php)
{assert(php);php->a = (HPDataType*)malloc(sizeof(HPDataType)*4);if (php->a == NULL){perror("malloc fail");return;}php->size = 0;php->capacity = 4;
}void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType x = *p1;*p1 = *p2;*p2 = x;
}
// 除了child这个位置,前面数据构成堆
void AdjustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;//while (parent >= 0)while(child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * php->capacity*2);if (tmp == NULL){perror("realloc fail");return;}php->a = tmp;php->capacity *= 2;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size - 1);
}
注意:这种模拟实现操作的php->a[php->size]还没存数据
如果要是小堆的话,就把判断条件的的a[child]>a[parent]改成a[child]<a[parent]即可
// 左右子树都是大堆/小堆
void AdjustDown(HPDataType* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){// 选出左右孩子中大的那一个if (child + 1 < n && a[child+1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapPop(HP* php)
{assert(php);assert(!HeapEmpty(php));//这种一般表示为空就报错// 删除数据Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdjustDown(php->a, php->size, 0);
}int HeapSize(HP* php)
{assert(php);return php->size;
}
上面AdjustDown里面的n表示的是数组的长度
size表示当前已存长度 size-1时那个最后的下标 size是还没存数据的那个的下标
堆的创建
想给数组排升序的话,要建大堆去搞
代码实现:(这里的时间复杂度是N*logN)
void HeapSort(int*a,int n)
{
//向下调整建堆:
for(int i = (n-1-1)/2;i>=0;--i)
AdjustDown(php->a,php->size,i);int end = n-1;
while(end>0){Swap(&a[end],&a[0]);AdjustDown(a,end,0);
--end;}}
建堆方式有两种:(N为节点个数)
1.向上调整建堆 时间复杂度为N*logN
2.向下调整建堆 时间复杂度为N(一般用这个)
这里的数组是从0开始存数的
向上调整建堆代码实现:
for(int i = 1;i<n;i++)
Adjustup(a,i);向下调整建堆代码实现:
for(int i = (n-1-1)/2;i>=0;--i)
AdjustDown(php->a,php->size,i);
TOPK问题:即求数据结合中前K个最大的元素或者最小的元素(一般情况下数据量都比较大)
方法:
1.用数据集合中的前k个来建堆a.求前k个最大的元素,需要建小堆b.求前k个最小的元素,需要建大堆
2.用剩余的N-k个元素依次和堆顶元素来比较还要向下调整,满足则替换堆顶元素
这里的满足是指比小堆堆顶大,比大堆堆顶小
二叉树的遍历
二叉树的遍历:
1.前序遍历:根左右
2.中序遍历:左根右
3.后序遍历:左右根
(前中后是针对的根,左右的关系全是左在右的左边)
这里拿中序遍历来举例理解:对于每一棵树,都先去遍历他的左子树,然后再写他的根,然后再遍历其右子树
比如下面这个图:就是 1 2 4 5 6 7 8
(用代码写的话,没有的位置要写NULL来代替,比如1的两个子树是NULL)4.层序遍历:就是每层从左到右,然后一层遍历完了就去下一层
代码实现:
struct BTNode{TreeData data;struct BTNode *left;struct BTNode *right;};void PreOrder(BTNode* root) {if (root == NULL) {printf("NULL ");return;}printf("%d ", root->data);PreOrder(root->left);PreOrder(root->right);
}//先序遍历void InOrder(BTNode* root) {if (root == NULL) {printf("NULL ");return;}InOrder(root->left);printf("%d ", root->data);InOrder(root->right);
}//中序遍历void PostOrder(BTNode* root)
{if (root == NULL){printf("NULL ");return;}PostOrder(root->left);PostOrder(root->right);printf("%d ", root->data);
}//后序遍历void LevelOrder(BTNode* root)
{Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);printf("%d ", front->data);if(front->left)QueuePush(&q, front->left);if (front->right)QueuePush(&q, front->right);}QueueDestroy(&q);
}//堆的层序遍历:就是打印一个节点之后,把他的孩子节点加进队列中去注意:一般题目是不要那个printf("NULL");的
自己这个方法遍历是会出现NULL的,要注意
二叉树的一些其他功能实现
二叉树的销毁
void TreeDestory(BTNode* root)
{if (root == NULL)return;TreeDestory(root->left);TreeDestory(root->right);free(root);
}求二叉树节点的个数
int TreeSize(BTNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;//可以这样写,不用续行符
}求二叉树的深度
int TreeHeight(BTNode* root)
{if (root == NULL)return 0;int leftHeight = TreeHeight(root->left);int rightHeight = TreeHeight(root->right);return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}//递归如果不好想的话要画图去理解特别注意,不要写成这样:
//int TreeHeight(BTNode* root)
//{//if (root == NULL)// return 0;//return TreeHeight(root->left) > TreeHeight(root->right)// ? TreeHeight(root->left) + 1 : TreeHeight(root->right) + 1;
//}
这样写的话会求很多次eg:TreeHeight(root->left)求二叉树第k层有多少个节点
int TreeKLevel(BTNode* root, int k)//刚开始传进来的是根节点
{assert(k > 0);if (root == NULL)return 0;if (k == 1)return 1;return TreeKLevel(root->left, k - 1)+ TreeKLevel(root->right, k - 1);
}二叉树查找首个值为x的结点(先序遍历的话)
BTNode* TreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->data == x)return root;BTNode* lret = TreeFind(root->left, x);if (lret)return lret;//这个办法好,解决了递归深层的想return出去的东西出不去的问题BTNode* rret = TreeFind(root->right, x);if (rret)return rret;return NULL;
}判断二叉树是否是完全二叉树
bool TreeComplete(BTNode* root)
{
//把二叉树放入队列Queue q;QueueInit(&q);if (root)QueuePush(&q, root);while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);if (front == NULL){break;//这里不是continue,遇到第一个NULL就可以停了}else{QueuePush(&q, front->left);QueuePush(&q, front->right);}}//判断是不是完全二叉树while (!QueueEmpty(&q)){BTNode* front = QueueFront(&q);QueuePop(&q);// 后面有非空,说明非空节点不是完全连续if (front){QueueDestroy(&q);return false;}}QueueDestroy(&q);//free空指针也没事return true;
}
全局变量定义在函数声明后面,函数定义前面的话,可以直接在函数里面用
局部变量的话不行,必须传参过去(只用在函数调用之前生成就行了)
工程中很少用全局变量和静态变量(如果用了,要特别注意),一般用指针去代替
关于续行符:一般只有字符串需要使用续行符
作业部分
在用树表示的目录结构中,从根目录到任何数据文件,有(A)通道
A.唯一一条
B.二条
C.三条
D.不一定
下列关键字序列中,序列(D )是堆。
A.{16,72,31,23,94,53}
B.{94,23,31,72,16,53}
C.{16,53,23,94,31,72}
D.{16,23,53,31,94,72}
这种题的话是把这些数据从左到右来按堆从上到下去排
力扣 单值二叉树
力扣 单值二叉树
做法:遍历二叉树,然后让左右节点和自己的根节点比较(注意考虑节点为NULL的情况!)代码实现:
bool isUnivalTree(struct TreeNode* root) {if(root == NULL){return true;}if(root->left){if(root->val!=root->left->val)return false;}if(root->right){if(root->val!=root->right->val)return false;}return isUnivalTree(root->left)&&isUnivalTree(root->right);}
力扣 相同的树
力扣 相同的树(这个好)
注意:不能对NULL进行解引用和->
做法:要单独检验是否为空 然后递归return的是左子树相等&&右子树相等
代码实现:
bool isSameTree(struct TreeNode*p,struct TreeNode*q)
{
//两个都为空if(p == NULL&&q == NULL) return true;
//一个为空if(p == NULL ||q == NULL) return false;
//都不为空
if(p->val!=q->val) return false;return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);}
力扣 对称二叉树
做法;把除根外的二叉树分成两部分,然后把isSameTree的最后一句改成
return isSameTree(p->left,q->right)&&isSameTree(p->right,q->left);即可
力扣 前序遍历
力扣 前序遍历
注意:a[(*pi)++]的这个括号不能省略 那个pi要是指针才对
下面这个只是代码的一部分
要注意的是,题目要求的返回值要是int*类型的,那就要返回数组名了
延伸出的一些问题:1.指针在定义和初始化一起搞的时候,eg:int*pi,要给他赋值地址才行,并且指针要是不初始化的话是不行的,要么就malloc一下,要么就给他一个量(不能是字面常量)的地址
2.void类型的自定义函数的返回只能返回return ;不能return 0;
代码实现:
int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;//可以这样写,不用续行符
}
void preorder(struct TreeNode*root,int*a,int*pi)
{if(root == NULL) return ;a[(*pi)++] = root->val;preorder(root->left,a,pi);preorder(root->right,a,pi);return ;}int* preorderTraversal(struct TreeNode* root, int* returnSize) {* returnSize = TreeSize(root);int *a = malloc(*returnSize * sizeof(int));int*pi = malloc(sizeof(int*));*pi = 0;preorder(root,a,pi);
return a;
}
力扣 另一棵树的子树
力扣 另一棵树的子树
做法:把左边树的每一个结点对应的树跟目标树比较
(这里的isSameTree是自己实现的比较两个树相等的)
代码实现:
bool isSameTree(struct TreeNode*p,struct TreeNode*q)
{
//两个都为空if(p == NULL&&q == NULL) return true;
//一个为空if(p == NULL ||q == NULL) return false;
//都不为空
if(p->val!=q->val) return false;return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {if(root == NULL) return false;if(isSameTree(root,subRoot)) return true;
return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}
错误写法:
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {if(root == NULL) return false;isSubtree(root->left,subRoot);isSubtree(root->right,subRoot);//中间这两步让程序经过了正确的,但没有返回值产生反馈return isSameTree(root,subRoot);
}
牛客网 KY11二叉树遍历
牛客网 KY11二叉树遍历
注意:这题要求打印中序遍历,但是给的是前序遍历的数组,要注意
易忘把树连接起来:
root->left = PreOrder(); // 构建左子树
root->right = PreOrder(); // 构建右子树
//转换成二叉树的代码:
BTNode* PreOrder() {if (i >= s1.size()) return NULL;char ch = s1[i++];if (ch == '#') return NULL;//还是要转换成NULLBTNode* node = (BTNode*)malloc(sizeof(BTNode));node->data = ch;node->left = PreOrder(); // 构建左子树node->right = PreOrder(); // 构建右子树return node;
}
代码实现:
#include<bits/stdc++.h>
using namespace std;
string s1;
int i;
struct BTNode{char data;struct BTNode *left;struct BTNode *right;};
BTNode* PreOrder() {if (i >= s1.size()) return NULL;char ch = s1[i++];if (ch == '#') return NULL;BTNode* node = (BTNode*)malloc(sizeof(BTNode));node->data = ch;node->left = PreOrder(); // 构建左子树node->right = PreOrder(); // 构建右子树return node;
}void InOrder(BTNode* root) {if (root == NULL) {return;}InOrder(root->left);printf("%c ", root->data);InOrder(root->right);
}int main()
{cin>>s1;BTNode*root = PreOrder();InOrder(root);return 0;
}
引伸:开辟的空间不会因为函数的结束而自动销毁,只有程序结束才会自动销毁
如果一颗二叉树的前序遍历的结果是ABCD,则满足条件的不同的二叉树有( B)种
A.13
B.14
C.15
D.16
技巧:可以先判断出二叉树的层数
假设有n个节点(不包含NULL),可以算出层数范围
一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足( C)
A.所有的结点均无左孩子
B.所有的结点均无右孩子//是错的,因为在子树只有一个孩子时,取左和取右是都是成立的
C.只有一个叶子结点
D.至多只有一个结点
已知某二叉树的中序遍历序列为JGDHKBAELIMCF,后序遍历序列为JGKHDBLMIEFCA,
则其前序遍历序列为(B)
A.ABDGHJKCEFILM
B.ABDGJHKCEILMF
C.ABDHKGJCEILMF
D.ABDGJHKCEIMLF通用做法:像这种题的话,一般来说,都是中序遍历用来确定根的左右区间有啥先或者后序遍历用来确定每个"子树"的根是啥
eg:
A的左子树:JGDHKB A的右子树:ELIMCFA的左子树的根:B …………B的左子树:JGDHK B的右子树:空 (因为JGDHKB 在B右边的为空) ……………………
B的左子树的根为:D …………
相关文章:
堆和二叉树--数据结构初阶(3)(C/C++)
文章目录 前言理论部分堆的模拟实现:(这里举的大根堆)堆的创建二叉树的遍历二叉树的一些其他功能实现 作业部分 前言 这期的话讲解的是堆和二叉树的理论部分和习题部分 理论部分 二叉树的几个性质:1.对于任意一个二叉树,度为0的节点比度为2的节点多一个 2.对于完全…...
CLIP和SimCLR集成到图像-文本检索系统技术实现步骤和部署方案(代码版)
将 CLIP(多模态对比学习)和 SimCLR(单模态对比学习)集成到 图像-文本检索系统(如搜索引擎、电子商务平台)的技术实现步骤和部署方案,结合代码示例与工程化思路: ### 一、技术实现核心步骤 1. 环境搭建与依赖安装 # 安装 PyTorch(支持 GPU 加速) pip install torch…...
R/G-B/G色温坐标系下对横纵坐标取对数的优势
有些白平衡色温坐标系会分别对横纵坐标取对数运算。 这样做有什么优势呢? 我们知道对数函数对0-1之间的因变量值具有扩展作用。即自变量x变化比较小时,经过对数函数作用后可以把因变量扩展到较大范围内,即x变化较小时,y变化较大,增加了识别数据的识别性。 由于Raw数据中的…...
Java开发工具IntelliJ IDEA v2025.1——全面支持Java 24、整合AI
IntelliJ IDEA 是由 JetBrains 开发的智能 Java IDE,提供代码自动补全、重构工具、框架集成(Spring/JPA 等)、数据库工具和调试支持,通过深度代码分析与跨语言功能优化企业级开发流程,被广泛认可为专业 Java 开发者的高…...
IDEA启动报错Failed to create JVM. JVM path的解决办法
今天修改了 IntelliJ IDEA 2023.1 的配置文件 idea64.exe.vmoptions 后启动报错: if you already hava a JDK installed, define a JAVA_HOME variable in Computer > Systen Properties > System Settings > Environment Variables.Failed to create JV…...
R语言中的常用内置函数
常用的数值函数 常用的字符函数 与概率分布相关的函数 有用的统计函数 数据来源:《数据挖掘与数据分析:基于R语言》王阳 2024年1月出版...
docker容器监控自动恢复
关于实现对docker容器监控以及自动恢复,这里介绍两种实现方案。 方案1: 实现思路: 找到(根据正则表达式)所有待监控的docker容器,此处筛选逻辑根据docker运行状态找到已停止(Exit)类…...
【记录手贱bug日常】IDEA 配置vmoptions后打不开,重新安装,删注册表均无用
今天早上来公司,闲着没事优化优化自己的"锄头"idea,然后想着看看idea用的啥垃圾回收器,后来手动改成了-XX:UseG1GC,满心欢喜觉得没什么问题,直接删除缓存重启,结果不出意料的出问题了,…...
STM32F407使用ESP8266实现阿里云OTA(中)
文章目录 前言一、程序分析二、程序讲解1. main函数2. Get_Version()函数3. esp_Init()函数4. Check_Updata()函数结语前言 从上一章STM32F407使用ESP8266实现阿里云OTA(上)中我们已经对连接阿里云和从阿里云获取升级包的流程非常的熟悉了。所以本章我们进行STM32的程序开发…...
如何利用快照与备份快速恢复服务器的数据
在服务器上利用**快照(Snapshot)**和**备份(Backup)**快速恢复数据,可显著减少停机时间并确保业务连续性。以下是具体操作步骤和最佳实践: --- ### **1. 快照(Snapshot)恢复** **适…...
【Leetcode 每日一题】2799. 统计完全子数组的数目
问题背景 给你一个由 正 整数组成的数组 n u m s nums nums。 如果数组中的某个子数组满足下述条件,则称之为 完全子数组 : 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序…...
主流操作系统对比分析(macOS、Linux、Windows、Unix)
主流操作系统对比分析(macOS、Linux、Windows、Unix) 一、系统基本介绍 系统核心特点典型代表macOS苹果公司开发,基于 Unix(BSD),闭源,专为苹果硬件优化,强调用户体验和设计美学。m…...
Qt使用 SQLite 数据库的基本方法
在 Qt 中,使用 SQLite 数据库的基本方法与 MySQL 类似,但 SQLite 是一个轻量级的嵌入式数据库,通常不需要外部数据库服务器。你可以直接在本地磁盘上操作 SQLite 数据库文件。 1. 安装 SQLite 驱动 通常,Qt 默认包含了对 SQLite…...
【刷题系列】LeetCode消失的数字、轮转数组
文章目录 1、消失的数字1.1 题目描述1.2 题目分析 2、轮转数字2.1 题目描述2.2 题目分析 1、消失的数字 原题链接:消失的数字 1.1 题目描述 数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗…...
Unreal Niagara制作SubUV贴图翻页动画
SubUV翻页动画是游戏中的常见功能,通过对每一小块UV进行移动可以模拟动画效果,接下来对下图进行SubUV动画的制作。 (金币测试图下载地址:https://download.csdn.net/download/grayrail/90684422) 最终效果如下: 1.…...
【C++】模版初阶:函数模板、类模板
文章目录 一、为什么要使用模板二、什么是函数模板1、函数模板(1)概念(2)格式(3)原理(4)函数模板的实例化(5)模板参数的匹配原则 2、类模板(1&…...
Kotlin基础知识全面解析(下)
文章目录 第六章:集合与函数式编程6.1 集合概述6.2 集合操作6.3 序列 第七章:协程与异步编程7.1 协程基础7.2 挂起函数7.3 异步与等待7.4 协程上下文与调度器 第八章:Kotlin标准库8.1 作用域函数let函数run函数with函数apply函数also函数 8.2…...
NVIDIA高级辅助驾驶安全报告解析
近期参加了NVIDIA高级辅助驾驶开发者实验室,读了NVIDIA的高级辅助驾驶安全报告白皮书,里面涉及了不少有意思的内容,大致分享下英伟达在高级辅助驾驶领域的安全性上的工作。 最令人印象深刻的是NVIDIA提出的"四大支柱"架构&#x…...
HarmonyOS:一多能力介绍:一次开发,多端部署
概述 如果一个应用需要在多个设备上提供同样的内容,则需要适配不同的屏幕尺寸和硬件,开发成本较高。HarmonyOS 系统面向多终端提供了“一次开发,多端部署”(后文中简称为“一多”)的能力,可以基于一种设计…...
位运算题目:解码异或后的排列
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法思路和算法代码复杂度分析 题目 标题和出处 标题:解码异或后的排列 出处:1734. 解码异或后的排列 难度 6 级 题目描述 要求 有一个整数数组 perm \texttt{perm} perm,是前…...
elasticsearch查询中的特殊字符影响分析
大家先看一个执行的dsl 查询sql,大致的意思是排除某些分类下的商品 GET /productinfos/_search {"from": 0,"query": {"bool": {"must": [{"exists": {"field": "minprice"}},{"bool": {&qu…...
Django创建的应用目录详细解释以及如何操作数据库自动创建表
创建好Django项目后 如果要创建 python manage.py startapp 模块名模块 使用 我创建一个system模块后是 注意:urls是我自己建的文件 1.migrations目录 存放数据库的迁移文件,当models.py中模型定义发生变化时,通过迁移操作能同步数据库结构变化 __init__ 使该目录…...
Visual Studio Code 使用tab键往左和往右缩进内容
使用VSCode写东西,经常遇到多行内容同时缩进的情况,今天写文档的时候就碰到,记录下来: 往右缩进 选中多行内容,点tab键,会整体往右缩进: 往左缩进 选中多行内容,按shifttab&am…...
数据结构算法复杂度介绍
数据结构:互相之间存在一种或者多种特定元素的集合,在逻辑上分为线性结构,散列结构,、树形结构、图形结构等。 算法:求解具体问题的步骤描述,代码上表现出来是解决特定问题的一组有限的指令序列。简单来说…...
SiamMask中的分类分支、回归分支与Mask分支,有何本质差异?
SiamMask中的分类分支、回归分支与Mask分支,有何本质差异? 一、引言二、分支定位与任务目标三、网络结构与感受野设计3.1 分类分支(Classification Head)3.2 回归分支(Regression Head)3.3 Mask分支&#x…...
使用 Typora + PicGo + Gitee/GitHub 构建 Markdown 图床技术方案
使用 Typora PicGo Gitee/GitHub 构建 Markdown 图床技术方案 AuthorDateVersionNoteTao Wang2025-04-24V1.0Release the document. 文章目录 使用 Typora PicGo Gitee/GitHub 构建 Markdown 图床技术方案前言核心概念解析图床技术原理 环境搭建基础工具清单软件安装流程 …...
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
本文将对"问道数码兽"这一经典卡通风格回合制手游的服务端部署与客户端调整流程进行详细拆解,适用于具备基础 Windows 运维和手游源码调试经验的开发者参考使用。教程以实战为导向,基于原始说明内容重构优化,具备较高的内容查重避重…...
Electron Forge【实战】百度智能云千帆大模型 —— AI聊天
1. 获取 Access Key 与 Secret Key 登录百度智能云 https://login.bce.baidu.com/ 2. 安装node.js sdk npm install baiducloud/qianfan3. src/main.ts import { setupIPC } from "./ipc";在 const mainWindow 之后 setupIPC(mainWindow);4. src/ipc.ts import { ipc…...
机器人操作中的生成式 AI:综述(下)
25年3月来自香港大学、香港理工、香港科大、浙大和清华大学的论文“Generative Artificial Intelligence in Robotic Manipulation: A Survey”。 本综述全面回顾机器人操作领域生成学习模型的最新进展,并探讨该领域的关键挑战。机器人操作面临着关键瓶颈ÿ…...
把一个 PyTorch 的图像张量转换成 NumPy 格式,并按照正确的维度顺序显示出来
示例代码: plt.imshow(np.transpose(tensor_denorm.numpy(), (1, 2, 0)))它的作用是:把一个 PyTorch 的图像张量转换成 NumPy 格式,并按照正确的维度顺序显示出来。 🚀 一步步解释: ✅ tensor_denorm 这是一个形状为…...
windows上的RagFlow+ollama知识库本地部署
一、 docker的安装与部署 1. 下载Docker Desktop 访问Docker官网并下载适用于Windows的Docker Desktop安装程序。 RagFlow对docker的要求: Docker ≥ 24.0.0 & Docker Compose ≥ v2.26. docker 下载地址: https://www.docker.com/ Get Docker | D…...
【docker】 pull FROM build
镜像拉取失败 token问题 DeadlineExceeded: failed to fetch anonymous token Get "https://auth.docker.io/token?...": dial tcp 157.240.20.8:443: i/o timeout1. 检查网络连通性 如果 curl 命令卡住或超时,说明网络到 Docker Hub 存在问题。 ping regt-1.doc…...
【数据分析实战】使用 Matplotlib 绘制玫瑰图
🌹 1、简述 玫瑰图,又称极坐标柱状图(Polar Bar Chart),是一种特殊的条形图,适用于展示方向型数据,例如: 风向频率图(Wind Rose)每月、每日不同类别统计圆形时间序列展示(如12个月销售量分布)在本篇博客中,我们将使用 matplotlib 画出玫瑰图,包括基本玫瑰图、多…...
第十四届蓝桥杯省B.砍树
第十四届蓝桥杯省B.砍树 题目 题目解析及思路 考虑一对无序数对的点 x和 y,如果我们砍掉某条边可以让这两个点不连通,那么这条边一定是从 x到 y 路径上的一点,我们可以让从 x到 y 路径的边权值都加1。这个操作我们可以使用树上差分。 对于 …...
windows安装Mysql
一、删除已安装的MySQL服务 1、查找以前是否装有mysql sc query mysql 无结果,说明未安装过mysql或者已经卸载mysql服务,接下来直接安装mysql即可,否则需要删除之前安装的mysql 2、删除mysql 以管理员模式打开命令运行行,运行下…...
Axure大屏可视化模板:多领域数据决策的新引擎
在数据驱动决策的时代,Axure大屏可视化模板凭借交互性与可定制性,成为农业、园区管理、智慧城市、企业及医疗领域的创新工具,助力高效数据展示与智能决策。 核心应用场景 1. 农业精细化:实时监控土壤湿度、作物生长曲线&#x…...
【产品经理从0到1】原型及Axure介绍
原型分类 原型的三种分类: 草图原型:⼿绘稿,制作⽅便,修改不⽅便;低保真原型:简单交互,⽆设计图; 最好的原型是⿊⽩灰的;⾼保真原型:复杂交互,有…...
【激光雷达3D(7)】CenterPoint两阶段细化仅使用BEV特征;PV-RCNN两阶段细化使用体素特征;M3DETRTransformer统一多表征特征
文章目录 1. CenterPoint的两阶段细化模块仅使用鸟瞰视角(BEV)特征2 PV-RCNN 两阶段3 M3DETR(假设为类似DETR的3D检测器) 1. CenterPoint的两阶段细化模块仅使用鸟瞰视角(BEV)特征 CenterPoint的两阶段细化…...
C# 音频分离(MP3伴奏)
编程语言:C# 库:NAudio NAudio 是一个开源的 .NET 音频处理库,它为开发者提供了丰富的功能,能在 Windows 平台上方便地进行音频的录制、播放、处理等操作。以下是关于 NAudio 库的详细介绍: 主要特性 多格式支持&am…...
JavaScript性能优化实战(4):异步编程与主线程优化
JavaScript单线程模型与事件循环深入理解 JavaScript作为一种单线程语言,其执行模型与传统多线程编程语言有着根本性的差异。这种单线程特性既是JavaScript的局限,也是其简洁性的来源。深入理解JavaScript的单线程模型和事件循环机制,对于编写高性能的异步代码至关重要。 …...
Control Center安卓版:自定义控制中心,提升手机操作体验
在使用智能手机的过程中,许多用户希望能够更加便捷地访问常用功能和工具,提升操作效率。今天,我们要介绍的 Control Center安卓版,就是这样一款功能强大的手机控制软件。它不仅提供了简便的操作方法,还允许用户自定义操…...
Web3.0的认知补充(去中心化)
涉及开发技术: Vue Web3.js Solidity 基本认知 Web3.0含义: 新一代互联网思想:去中心化及用户为中心的互联网 数据:可读可写可授权 核心技术:区块链、NFT 应用:互联网上应用 NFT &…...
在Vue3中,如何在父组件中使用v-model与子组件进行双向绑定?
在 Vue 3 里,借助 v-model 可以轻松实现父组件与子组件的双向绑定。以下为你详细介绍实现步骤与示例代码。 实现原理 v-model 在 Vue 3 里是一种语法糖,它本质上是 :modelValue 和 update:modelValue 的组合。父组件借助 :modelValue 向子组件传递数据…...
沁恒MounRiver Studio无法printf浮点数
最近在使用沁恒MounRiver Studio进行CH32V307进行开发,但是遇到了已经成功获得浮点数,但是无法printf输出浮点数 如下图所示: 经过查找资料后,发现沁恒MounRiver Studio如果要printf输出浮点数需要打开Use float with nano print…...
初识Redis · 主从复制(下)
目录 前言: 数据同步 全量复制 部分复制 实时复制 前言: 前文我们已经介绍过了主从复制的基本概念,即分布式系统中存在多个Redis节点,一个是充当为主节点,其他的为从节点,并且从节点也是可以成为主节…...
BDO分厂开展地沟“大清肠”工作
BDO分厂装置区内的地沟主要回收生产过程中产生的污水、日常雨水,日积月累地沟内堆积了一层淤泥和杂物。厚厚的淤泥气味不仅影响员工健康,而且造成排水系统不畅通,存在安全隐患。分厂借助此次待产停车的有利时机对沉积已久的淤泥进行一次彻底“…...
程序和进程的详细对比
💡 一、程序(Program) ✅ 定义: 程序是一组指令的集合,通常是一个 可执行文件(如 .exe、.out),它是静态的、保存在磁盘上的一段代码,还没有被执行。 ✅ 特点ÿ…...
Flink介绍——实时计算核心论文之Flink论文
引入 通过前面的文章,我们梳理了大数据流计算的核心发展脉络: S4论文详解S4论文总结Storm论文详解Storm论文总结Kafka论文详解Kafka论文总结MillWheel论文详解MillWheel论文总结Dataflow论文详解Dataflow论文总结 而我们专栏的主角Flink正是站在前人的…...
【C++指南】位运算知识详解
. 💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 文章目录 引言一、位运算符概述1. 按位与(&)2. 按位或(|&#…...
网络开发基础(游戏)之 数据交换格式
数据交换格式是不同系统、应用程序或组件之间传输和共享数据时使用的标准化数据表示方式。在网络通信中,数据交换格式的选择直接影响系统的性能、可维护性和扩展性。以下是常用的数据交换格式的介绍和选择建议。 Protobuf (Protocol Buffers)协议缓冲区 是 Googl…...