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

数据结构-树(1)

一、树的基本概念

二,树的抽象数据结构

三,树的存储结构

1.双亲表示法

  • 数组存储结点,含数据域和双亲下标(根结点双亲为 - 1)

代码示例

  • include <stdio.h>
    #include <stdlib.h>#define MAX_TREE_SIZE 100
    typedef int TElemType;// 双亲表示法结点结构
    typedef struct PTNode {TElemType data;        // 结点数据int parent;           // 双亲位置下标(-1表示无双亲)
    } PTNode;// 树结构
    typedef struct {PTNode nodes[MAX_TREE_SIZE];  // 结点数组int r, n;                   // 根的位置和结点数
    } PTree;// 初始化树(示例:构建文档中的树结构)
    void InitTree(PTree* T) {TElemType data[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };T->n = 10;T->r = 0;  // 根结点下标为0// 设定各结点的双亲T->nodes[0].data = data[0];T->nodes[0].parent = -1;T->nodes[1].data = data[1];T->nodes[1].parent = 0;T->nodes[2].data = data[2];T->nodes[2].parent = 0;T->nodes[3].data = data[3];T->nodes[3].parent = 1;T->nodes[4].data = data[4];T->nodes[4].parent = 2;T->nodes[5].data = data[5];T->nodes[5].parent = 2;T->nodes[6].data = data[6];T->nodes[6].parent = 3;T->nodes[7].data = data[7];T->nodes[7].parent = 3;T->nodes[8].data = data[8];T->nodes[8].parent = 3;T->nodes[9].data = data[9];T->nodes[9].parent = 4;
    }// 输出每个结点的双亲
    void PrintParents(PTree T) {printf("结点\tdata\tparent\n");for (int i = 0; i < T.n; i++) {printf("%d\t%c\t%d\n", i, T.nodes[i].data, T.nodes[i].parent);}
    }int main() {PTree T;InitTree(&T);printf("双亲表示法存储结构:\n");PrintParents(T);return 0;
    }

2.孩子表示法

每个结点有多个指针域,其中每个指针指向一颗子树的根结点,我们把这种方法叫做多重链表表示法

有两种方案解决

方案一:

一种是指针域的个数就等于树的度,树的度是树各个结点度的最大值

这种方法对于树中的各个结点的度相差很大时,显然是很浪费空间的,因为有很多的结点,它的指针域是空的。

不过如果树的各结点度相差很小时,那就意味着开辟的空间被充分利用了,这时存储结构的缺点反而变成了优点

方案二

第二种方案每个结点指针域的个数等于该结点的度,我们专门取一个位置来存储结点指针域的个数

这种方法克服了浪费空间的缺点,对空间利用率是很高的,但是由于各个结点的链表是不相同的结构,加上要维护结点的度的 数值,在运算上就会带来时间上的损耗

这时,我们想到了更好的办法,既可以减少空指针的浪费又能使结点结构相同

这就是孩子表示法,具体办法就是,把每个结点的孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空;然后n个指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中

/*树的孩子表示法的结构定义代码*/
#define MAX_TREE_SIZE 100
typedef struct CTNode //孩子结点
{int child;struct CTNode *next;
}*ChildPtr;typedef struct //表头结构
{TElemType data;ChildPtr firstchild;
}*CTBox;typedef struct
{CTBox nodes[MAX_TREE_SIZ];int r,n;
}CTree;

代码示例:

#include <stdio.h>
#include <stdlib.h>#define MAX_TREE_SIZE 100
typedef char TElemType; // 修改为char类型以匹配数据初始化// 孩子结点
typedef struct CTNode {int child;          // 孩子结点下标struct CTNode* next; // 指向下一个孩子的指针
} *ChildPtr;// 表头结构
typedef struct CTBox {TElemType data;      // 结点数据ChildPtr firstchild; // 第一个孩子指针
} CTBox;// 树结构
typedef struct {CTBox nodes[MAX_TREE_SIZE];  // 表头数组int r, n;                   // 根的位置和结点数
} CTree;// 创建新的孩子结点
ChildPtr createChildNode(int childIndex) 
{ChildPtr newNode = (ChildPtr)malloc(sizeof(struct CTNode));if (newNode == NULL) {printf("内存分配失败\n");exit(EXIT_FAILURE);}newNode->child = childIndex;newNode->next = NULL;return newNode;
}// 添加孩子结点到指定父结点
void addChild(CTree* T, int parentIndex, int childIndex)
{ChildPtr newNode = createChildNode(childIndex);newNode->next = T->nodes[parentIndex].firstchild;T->nodes[parentIndex].firstchild = newNode;
}// 创建完整的树结构(示例:构建书中图6-4-1的树)
void CreateChildTree(CTree* T) 
{TElemType data[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };T->n = 10;T->r = 0;  // 根结点下标为0// 初始化表头数据for (int i = 0; i < T->n; i++) {T->nodes[i].data = data[i];T->nodes[i].firstchild = NULL;}// 添加所有孩子结点关系addChild(T, 0, 1); // A的孩子: BaddChild(T, 0, 2); // A的孩子: CaddChild(T, 1, 3); // B的孩子: DaddChild(T, 2, 4); // C的孩子: EaddChild(T, 2, 5); // C的孩子: FaddChild(T, 3, 6); // D的孩子: GaddChild(T, 3, 7); // D的孩子: HaddChild(T, 3, 8); // D的孩子: IaddChild(T, 4, 9); // E的孩子: J
}// 输出每个结点的孩子列表
void PrintChildren(CTree T) 
{printf("结点\tdata\t孩子列表\n");for (int i = 0; i < T.n; i++) {printf("%d\t%c\t", i, T.nodes[i].data);ChildPtr p = T.nodes[i].firstchild;while (p) {printf("%d(%c) ", p->child, T.nodes[p->child].data);p = p->next;}printf("\n");}
}// 释放树的内存
void destroyTree(CTree* T) 
{for (int i = 0; i < T->n; i++) {ChildPtr current = T->nodes[i].firstchild;while (current != NULL) {ChildPtr next = current->next;free(current);current = next;}}
}int main() {CTree T;CreateChildTree(&T);printf("孩子表示法存储结构:\n");PrintChildren(T);destroyTree(&T); // 释放内存return 0;
}

这时,也存在着问题,我如何知道某个结点的双亲是谁呢?比较麻烦,需要整棵树遍历才行。

我们可以把双亲表示法和孩子表示法综合一下。

 

代码示例:

#include <stdio.h>
#include <stdlib.h>#define MAX_TREE_SIZE 100
typedef char TElemType; // 结点数据类型(示例为字符型)// 孩子结点结构(用于孩子链表)
typedef struct ChildNode 
{int child_idx;       // 孩子结点在数组中的下标struct ChildNode* next; // 指向下一个兄弟结点
} ChildNode;// 双亲孩子表示法的结点结构
typedef struct PTNode 
{TElemType data;           // 结点数据int parent_idx;          // 双亲结点下标(-1表示根结点)ChildNode* first_child;  // 第一个孩子结点指针
} PTNode;// 树结构
typedef struct 
{PTNode nodes[MAX_TREE_SIZE]; // 结点数组int root_idx;                // 根结点下标int node_count;              // 结点总数
} ParentChildTree;// 创建孩子结点
ChildNode* create_child_node(int child_idx) 
{ChildNode* node = (ChildNode*)malloc(sizeof(ChildNode));node->child_idx = child_idx;node->next = NULL;return node;
}// 向双亲孩子结点中添加孩子
void add_child(ParentChildTree* tree, int parent_idx, int child_idx) 
{ChildNode* new_node = create_child_node(child_idx);// 将新孩子插入到孩子链表头部(或尾部,此处示例为头部)new_node->next = tree->nodes[parent_idx].first_child;tree->nodes[parent_idx].first_child = new_node;// 设置孩子的双亲tree->nodes[child_idx].parent_idx = parent_idx;
}// 初始化示例树(构建书中图6-4-1的树结构)
void init_example_tree(ParentChildTree* tree) 
{// 初始化结点数据TElemType data[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };tree->node_count = 10;tree->root_idx = 0; // 根结点下标为0// 初始化每个结点的基本信息(无孩子和双亲)for (int i = 0; i < tree->node_count; i++) {tree->nodes[i].data = data[i];tree->nodes[i].parent_idx = -1;tree->nodes[i].first_child = NULL;}// 添加孩子关系(按书中示例树结构)// A的孩子:B(下标1)、C(下标2)add_child(tree, 0, 1);add_child(tree, 0, 2);// B的孩子:D(下标3)add_child(tree, 1, 3);// C的孩子:E(下标4)、F(下标5)add_child(tree, 2, 4);add_child(tree, 2, 5);// D的孩子:G(下标6)、H(下标7)、I(下标8)add_child(tree, 3, 6);add_child(tree, 3, 7);add_child(tree, 3, 8);// E的孩子:J(下标9)add_child(tree, 4, 9);
}// 打印树的存储结构
void print_tree(ParentChildTree tree) 
{printf("结点\t数据\t双亲\t孩子列表\n");for (int i = 0; i < tree.node_count; i++) {PTNode node = tree.nodes[i];printf("%d\t%c\t", i, node.data);printf("%d\t", node.parent_idx);// 打印孩子列表ChildNode* child = node.first_child;printf("孩子: ");while (child) {printf("%d ", child->child_idx);child = child->next;}printf("\n");}
}// 释放内存(避免内存泄漏)
void free_tree(ParentChildTree* tree) 
{for (int i = 0; i < tree->node_count; i++) {ChildNode* child = tree->nodes[i].first_child;while (child) {ChildNode* temp = child;child = child->next;free(temp);}}
}int main() {ParentChildTree tree;init_example_tree(&tree);printf("双亲孩子表示法存储结构:\n");print_tree(tree);free_tree(&tree); // 释放内存return 0;
}

3.孩子兄弟表示法

任一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟

                                

其中 data 是数据域,frstchikd 为指针域,存储该结点的第一个孩子结点的存储地址,rightsib是指针域,存储该结点的右兄弟结点的存储地址。

/*树的孩子兄弟表示法结构定义*/
typedef struct CSNode
TElemType datar
struct CsNode *firstchild,*rightsib;CSNode,*CsTreei

代码示例:

#include <stdio.h>
#include <stdlib.h>typedef int TElemType;// 孩子兄弟表示法结点结构
typedef struct CSNode {TElemType data;struct CSNode* firstchild, * rightsib;
} CSNode, * CSTree;// 创建示例树(简单二叉树结构)
CSTree CreateCSTree() {// 手动构建示例树(根结点A,左孩子B,右孩子C)CSNode* A = (CSNode*)malloc(sizeof(CSNode));CSNode* B = (CSNode*)malloc(sizeof(CSNode));CSNode* C = (CSNode*)malloc(sizeof(CSNode));A->data = 'A';A->firstchild = B;A->rightsib = NULL;B->data = 'B';B->firstchild = NULL;B->rightsib = C;C->data = 'C';C->firstchild = NULL;C->rightsib = NULL;return A;
}// 前序遍历孩子兄弟表示法的树
void PreOrder(CSTree T) {if (T) {printf("%c ", T->data);PreOrder(T->firstchild);  // 遍历长子PreOrder(T->rightsib);    // 遍历右兄弟}
}int main() {CSTree T = CreateCSTree();printf("孩子兄弟表示法遍历结果:\n");PreOrder(T);  // 输出: A B Creturn 0;
}

如果有必要,可以再增加一个parent指针域来解决快速查找双亲的问题

代码如下:

#include <stdio.h>
#include <stdlib.h>typedef int TElemType;// 孩子兄弟表示法结点结构,增加parent指针域
typedef struct CSNode {TElemType data;struct CSNode* firstchild, * rightsib;struct CSNode* parent; // 新增parent指针,指向父结点
} CSNode, * CSTree;// 创建示例树(简单二叉树结构)
CSTree CreateCSTree() {// 手动构建示例树(根结点A,左孩子B,右孩子C)CSNode* A = (CSNode*)malloc(sizeof(CSNode));CSNode* B = (CSNode*)malloc(sizeof(CSNode));CSNode* C = (CSNode*)malloc(sizeof(CSNode));A->data = 'A';A->firstchild = B;A->rightsib = NULL;A->parent = NULL; // 根结点的parent为NULLB->data = 'B';B->firstchild = NULL;B->rightsib = C;B->parent = A; // B的父结点是AC->data = 'C';C->firstchild = NULL;C->rightsib = NULL;C->parent = A; // C的父结点是Areturn A;
}// 前序遍历孩子兄弟表示法的树
void PreOrder(CSTree T) {if (T) {printf("%c ", T->data);PreOrder(T->firstchild);  // 遍历长子PreOrder(T->rightsib);    // 遍历右兄弟}
}// 通过parent指针查找指定结点的双亲
CSNode* FindParent(CSTree T, TElemType target) {if (T == NULL) {return NULL;}if (T->data == target) {return T->parent;}CSNode* temp = T->firstchild;while (temp) {CSNode* parent = FindParent(temp, target);if (parent) {return parent;}temp = temp->rightsib;}return NULL;
}int main() {CSTree T = CreateCSTree();printf("孩子兄弟表示法遍历结果:\n");PreOrder(T);  // 输出: A B Cprintf("\n");TElemType target = 'B';CSNode* parent = FindParent(T, target);if (parent) {printf("结点%c的双亲是%c\n", target, parent->data);}else {printf("未找到结点%c的双亲\n", target);}return 0;
}

相关文章:

数据结构-树(1)

一、树的基本概念 二&#xff0c;树的抽象数据结构 三&#xff0c;树的存储结构 1.双亲表示法 数组存储结点&#xff0c;含数据域和双亲下标&#xff08;根结点双亲为 - 1&#xff09; 代码示例 include <stdio.h> #include <stdlib.h>#define MAX_TREE_SIZE 10…...

什么是ERP?ERP有哪些功能?小微企业ERP系统源码,SpringBoot+Vue+ElementUI+UniAPP

什么是ERP&#xff1f; ERP翻译过来叫企业资源计划&#xff0c;通俗的讲&#xff0c;应该叫企业的全面预算控制&#xff0c;其通常包括三个部分&#xff1a;工程预算、投资预算和经营预算&#xff08;即产销存预算&#xff09;。之所以做预算控制&#xff0c;是因为企业运作的…...

视觉-语言-动作模型:概念、进展、应用与挑战(上)

25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步&#xff0c;旨在将感知、自然语言理解和具体动作统一在一个计…...

C++ 与 Go、Rust、C#:基于实践场景的语言特性对比

目录 ​编辑 一、语法特性对比 1.1 变量声明与数据类型 1.2 函数与控制流 1.3 面向对象特性 二、性能表现对比​编辑 2.1 基准测试数据 在计算密集型任务&#xff08;如 10⁷ 次加法运算&#xff09;中&#xff1a; 在内存分配测试&#xff08;10⁵ 次对象创建&#xf…...

RDB和AOF的区别

Redis提供两种主要的持久化机制&#xff1a;RDB&#xff08;Redis Database&#xff09;和AOF&#xff08;Append Only File&#xff09;&#xff0c;它们在数据持久化方式、性能影响及恢复策略上各有特点。以下是两者的对比分析及使用建议&#xff1a; RDB&#xff08;快照持久…...

因子分析基础指南:原理、步骤与地球化学数据分析应用解析

前言 在看深度学习成矿预测以及地球化学数据分析的文献的时候很多引言部分的内容会提到一些老的技术&#xff0c;正所谓&#xff1a;知其然知其所以然。所以我把关于一些老技术的基础铺垫的内容作为&#xff1a;研究生基础指南部分进行记录。 这部分讲述的是因子分析&#xf…...

采用AI神经网络降噪算法的通信语音降噪(ENC)模组性能测试和应用

采用AI降噪的语言通话环境抑制模组性能效果测试 随着AI时代来临.通话设备的环境噪音抑制也进入AI降噪算法时代. AI神经网络降噪技术是一款革命性的语音处理技术&#xff0c;他突破了传统单麦克风和双麦克风降噪的局限性,利用采集的各种日常环境中的噪音样本进行训练学习.让降噪…...

面试题 - Kafka、RabbitMQ、RocketMQ如何选型?

在当今的高并发、大数据时代&#xff0c;系统架构的复杂性呈指数级增长。你是否曾遇到过这样的问题&#xff1a;用户订单提交后&#xff0c;系统响应缓慢甚至卡顿&#xff1f;或者在业务高峰期&#xff0c;消息积压导致系统崩溃&#xff1f; 这些问题的背后&#xff0c;往往隐…...

【落羽的落羽 C++】stack和queue、deque、priority_queue、仿函数

文章目录 一、stack和queue1. 概述2. 使用3. 模拟实现 二、deque三、priority_queue1. 概述和使用2. 模拟实现 四、仿函数 一、stack和queue 1. 概述 我们之前学习的vector和list&#xff0c;以及下面要认识的deque&#xff0c;都属于STL的容器&#xff08;containers&#x…...

Golang 空结构体特性与用法

文章目录 1.简介2.核心特性2.1 零内存占用2.2 值比较语义2.3 类型隔离2.4 值地址 3.作用3.1 实现集合&#xff08;Set&#xff09;3.2 不发送数据的信道3.3 无状态方法接收者3.4 作为 context 的 value 的 key 4.小结参考文献 1.简介 在 Go 语言中&#xff0c;空结构体是一个不…...

企业对数据集成工具的需求及 ETL 工具工作原理详解

当下&#xff0c;数据已然成为企业运营发展过程中的关键生产要素&#xff0c;其重要性不言而喻。 海量的数据分散在企业的各类系统、平台以及不同的业务部门之中&#xff0c;企业要充分挖掘这些数据背后所蕴含的巨大价值&#xff0c;实现数据驱动的精准决策&#xff0c;数据集…...

基于HTTP头部字段的SQL注入:SQLi-labs第17-20关

前置知识&#xff1a;HTTP头部介绍 HTTP&#xff08;超文本传输协议&#xff09;头部&#xff08;Headers&#xff09;是客户端和服务器在通信时传递的元数据&#xff0c;用于控制请求和响应的行为、传递附加信息或定义内容类型等。它们分为请求头&#xff08;Request Headers&…...

Megatron系列——流水线并行

内容总结自&#xff1a;bilibili zomi 视频大模型流水线并行 注&#xff1a;这里PipeDream 1F1B对应时PP&#xff0c;Interleaved 1F1B对应的是VPP 1、朴素流水线并行 备注&#xff1a; &#xff08;1&#xff09;红色三个圈都为空泡时间&#xff0c;GPU没有做任何计算 &am…...

Android HttpAPI通信问题(待解决)

使用ClearTextTraffic是Android中一项重要的网络设置&#xff0c;它控制了应用程序是否允许在不使用HTTPS加密的情况下访问网络。在默认情况下&#xff0c;usescleartexttraffic的值为true&#xff0c;这意味着应用程序可以通过普通的HTTP协议进行网络通信。然而&#xff0c;这…...

WebFlux vs WebMVC vs Servlet 对比

WebFlux vs WebMVC vs Servlet 技术对比 WebFlux、WebMVC 和 Servlet 是 Java Web 开发中三种不同的技术架构&#xff0c;它们在编程模型、并发模型和适用场景上有显著区别。以下是它们的核心对比&#xff1a; 核心区别总览 特性ServletSpring WebMVCSpring WebFlux编程模型…...

Spring MVC参数传递

本内容采用最新SpringBoot3框架版本,视频观看地址:B站视频播放 1. Postman基础 Postman是一个接口测试工具,Postman相当于一个客户端,可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果。 2. Spring MVC相关注解 3. Spring MVC参数传递 Spri…...

Spring MVC 和 Spring Boot 是如何访问静态资源的?

Spring MVC 和 Spring Boot 在配置静态资源访问方面有所不同&#xff0c;Spring Boot 提供了更便捷的自动配置。 一、Spring Boot 如何配置静态资源访问 (推荐方式) Spring Boot 遵循“约定优于配置”的原则&#xff0c;对静态资源的访问提供了非常方便的自动配置。 默认静态…...

如何应对网站被爬虫和采集?综合防护策略与实用方案

在互联网时代&#xff0c;网站内容被恶意爬虫或采集工具窃取已成为常见问题。这不仅侵犯原创权益&#xff0c;还可能影响网站性能和SEO排名。以下是结合技术、策略与法律的综合解决方案&#xff0c;帮助网站构建有效防护体系。 一、技术防护&#xff1a;阻断爬虫的“技术防线”…...

MySQL 分页查询优化

目录 前言1. LIMIT offset, count 的性能陷阱&#xff1a;为什么它慢&#xff1f;&#x1f629;2. 优化策略一&#xff1a;基于排序字段的“跳跃式”查询 (Seek Method) &#x1f680;3. 优化策略二&#xff1a;利用子查询优化 OFFSET 扫描 (ID Subquery)4. 基础优化&#xff1…...

我用Deepseek + 亮数据爬虫神器 1小时做出輿情分析器

我用Deepseek 亮数据爬虫神器 1小时做出輿情分析器 一、前言二、Web Scraper API 实战&#xff08;1&#xff09;选择对应的URL&#xff08;2&#xff09;点击进入对应url界面&#xff08;3&#xff09;API结果实例和爬取结果展示&#xff08;4&#xff09;用户直接使用post请…...

langchain4j中使用milvus向量数据库做RAG增加索引

安装milvus向量数据库 官方网址 https://milvus.io/zh 使用docker安装milvus mkdir -p /data/docker/milvus cd /data/docker/milvus wget https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh#在docker中启动milvus sh standalone_emb…...

【开源工具】深度解析:基于PyQt6的Windows时间校时同步工具开发全攻略

&#x1f552; 【开源工具】深度解析&#xff1a;基于PyQt6的Windows时间校时同步工具开发全攻略 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热…...

开源 RPA 工具深度解析与官网指引

开源 RPA 工具深度解析与官网指引 摘要 &#xff1a;本文深入解析了多款开源 RPA 工具&#xff0c;涵盖 TagUI、Aibote、Taskt 等&#xff0c;分别介绍了它们的核心功能&#xff0c;并提供了各工具的官网链接&#xff0c;方便读者进一步了解与使用&#xff0c;同时给出了基于不…...

【免杀】C2免杀技术(一)VS设置

一、概述 编译器生成的二进制文件特征&#xff08;代码结构、元数据、指纹&#xff09;可能被杀软的静态或动态检测规则匹配。Visual Studio 的构建设置&#xff08;特别是运行库、编译器优化、链接方式等&#xff09;会直接影响最终生成的二进制文件的结构、行为特征和依赖关…...

OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库

准备工作 请依照这篇文章搭建环境 OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——环境配置_openharmony交叉编译-CSDN博客 编译依赖 相关依赖有 gmp-6.3.0 请依照这篇文章编译 OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库…...

Kotlin与Ktor构建Android后端API

以下是一个使用 Kotlin 和 Ktor 构建 Android 后端 API 的详细示例,包含常见功能实现: 1. 项目搭建 (build.gradle.kts) plugins {applicationkotlin("jvm") version "1.9.0"id("io.ktor.plugin") version "2.3.4"id("org.je…...

网页jupyter如何显示jpipvenv虚拟环境

今天使用社区版pycharm编辑.ipynb文件时&#xff0c;发现pycharm编辑.ipynb文件需要订阅。但是发现pipvenv虚拟环境解释器在jupyter中只有一个Python3:ipykernel版本&#xff0c;没有venv和conda的虚拟环境。因此在网上搜寻资料&#xff0c;作为备份记录。 以windows为例 假设目…...

学习黑客5 分钟深入浅出理解Windows System Configuration

5 分钟深入浅出理解Windows System Configuration ⚙️ 大家好&#xff01;今天我们将探索Windows系统配置——这是Windows操作系统的核心控制中心&#xff0c;决定了系统如何启动、运行和管理各种功能。无论你是计算机初学者&#xff0c;还是在TryHackMe等平台上学习网络安全…...

Spyglass:跨时钟域同步方案

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 Spyglass可以用于检测设计中的跨时钟域相关问题&#xff0c;确保电路中添加了适当的同步机制&#xff0c;以避免此类问题的发生&#xff0c;例如&#xff1a; 与亚稳…...

Ubuntu虚拟机文件系统扩容

1. 删除所有的虚拟机快照。 2. 选择扩展 将最大大小调整为你所需的大小 3. 进入虚拟机&#xff0c;输入命令&#xff1a; sudo apt install gparted sudo gparted 4. 选择磁盘&#xff0c;右键根分区&#xff0c;选择Resize/Move&#xff0c;调整大小。 5. 调整所需分区大…...

Window、CentOs、Ubuntu 安装 docker

Window 版本 网址&#xff1a;https://www.docker.com/ 下载 下载完成后&#xff0c;双击安装就可以了 Centos 版本 卸载 Docker &#xff08;可选&#xff09; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-log…...

mac M2下虚拟机CentOS 8 安装上安装 Berkeley DB

问题&#xff1a;直接在centos8 yum安装db4-devel失败&#xff0c;只能手工安装 进入home目录&#xff0c;下载 wget http://download.oracle.com/berkeley-db/db-4.6.21.tar.gz 解压 tar -zxvf db-4.6.21.tar.gz 切到cd db-4.6.21的build_unix下 cd db-4.6.21 cd build_…...

Python文字转语音TTS库示例(edge-tts)

1. 安装 pip install edge-tts2. 命令行使用 # 生成语音文件 # -f&#xff1a;要转换语音的文本文件&#xff0c;例如一个txt文件 # --text&#xff1a;指明要保存的mp3的文本 # --write-media&#xff1a;指明保存的mp3文件路径 # --write-subtitles&#xff1a;指定输出字幕…...

lua入门语法,包含安装,注释,变量,循环等

文章目录 LUA入门什么是lualua安装入门lua的使用方式注释定义变量lua中的数据类型流程控制ifelsewhile语法&#xff1a;for 函数表模块 LUA入门 什么是lua 一种脚本语言&#xff0c;设计的目的是为了能够在一些应用程序提供灵活的扩展功能和定制功能。 lua安装 有linux版本…...

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《文心智能体》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff0…...

TWASandGWAS中GBS filtering and GWAS(1)

F:\文章代码\TWASandGWAS\GBS filtering and GWAS README.TXT 请检查幻灯片“Vitamaize_update_Gorelab_Ames_GBS_filtering_20191122.pptx”中关于阿姆斯&#xff08;Ames&#xff09;ID处理流程的详细信息。 文件夹“Ames_ID_processing”包含了用于处理阿姆斯ID的文件和R…...

Linux电源管理(五),发热管理(thermal),温度控制

更多linux系统电源管理相关的内容请看&#xff1a;Linux电源管理、功耗管理 和 发热管理 (CPUFreq、CPUIdle、RPM、thermal、睡眠 和 唤醒)-CSDN博客 本文主要基于linux-5.4.18版本的内核代码进行分析。 1 简介 1.1 硬件知识 CPU等芯片在工作时会产生大量热量&#xff0c;…...

【C++11】异常

前言 上文我们学习到了C11中类的新功能【C11】类的新功能-CSDN博客 本文我们来学习C下一个新语法&#xff1a;异常 1.异常的概念 异常的处理机制允许程序在运行时就出现的问题进行相应的处理。异常可以使得我们将问题的发现和问题的解决分开&#xff0c;程序的一部分负…...

C#WPF里不能出现滚动条的原因

使用下面这段代码,就不能出现滚动条: <mdix:DrawerHost.LeftDrawerContent><Grid Width="260" Background="{StaticResource MaterialDesign.Brush.Primary}"><Grid.RowDefinitions><RowDefinition Height="auto"/>&l…...

安装Hadoop并运行WordCount程序

一、安装 Java Hadoop 依赖 Java&#xff0c;首先需要安装 Java 开发工具包&#xff08;JDK&#xff09;。以 Ubuntu 为例&#xff1a; bash sudo apt update sudo apt install openjdk-8-jdk安装后&#xff0c;设置环境变量&#xff1a; bash echo export JAVA_HOME/usr/li…...

从零搭建AI工作站:Gemma3大模型本地部署+WebUI配置全套方案

文章目录 前言1. 安装Ollama2.Gemma3模型安装与运行3. 安装Open WebUI图形化界面3.1 Open WebUI安装运行3.2 添加模型3.3 多模态测试 4. 安装内网穿透工具5. 配置固定公网地址总结 前言 如今各家的AI大模型厮杀得如火如荼&#xff0c;每天都有新的突破。今天我要给大家安利一款…...

《数字人技术实现路径深度剖析与研究报告》

《数字人技术实现路径深度剖析与研究报告》 一、引言 1.1 研究背景与意义 近年来,随着人工智能、虚拟现实、计算机图形学等技术的飞速发展,数字人技术应运而生并取得了显著进展。数字人作为一种新兴的技术应用,正逐步渗透到各个领域,成为推动行业创新发展的重要力量。从最…...

《棒球百科》MLB棒球公益课·棒球1号位

MLB&#xff08;美国职业棒球大联盟&#xff09;的棒球公益课通过推广棒球运动、普及体育教育&#xff0c;对全球多个地区产生了多层次的影响&#xff1a; 1. 体育文化推广 非传统棒球地区的普及&#xff1a;在棒球基础较弱的地区&#xff08;如中国、欧洲部分国家&#xff09…...

Android 中 Handler (创建时)内存泄漏问题及解决方案

一、Handler 内存泄漏核心原理 真题 1&#xff1a;分析 Handler 内存泄漏场景 题目描述&#xff1a; 在 Activity 中使用非静态内部类 Handler 发送延迟消息&#xff0c;旋转屏幕后 Activity 无法释放&#xff0c;分析原因并给出解决方案。 内存泄漏链路分析&#xff1a; 引…...

linux-驱动开发之设备树详解(RK平台为例)

前言 Linux3.x以后的版本才引入了设备树&#xff0c;设备树用于描述一个硬件平台的板级细节。 在早些的linux内核&#xff0c;这些“硬件平台的板级细节”保存在linux内核目录“/arch”&#xff0c; 以ARM为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/ar…...

【现代深度学习技术】注意力机制05:多头注意力

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

RDD的五大特征

1. 由多个分区&#xff08;Partitions&#xff09;组成 特性&#xff1a;RDD 是分区的集合&#xff0c;每个分区在集群的不同节点上存储。分区是数据并行处理的基本单位。作用&#xff1a;分区使 RDD 能够在集群中并行计算&#xff0c;提高处理效率。 2. 有一个计算每个分区的…...

键盘RGB矩阵与LED指示灯(理论部分)

键盘RGB矩阵与LED指示灯(理论部分) 一、LED指示灯基础 在键盘世界里,LED指示灯不仅仅是装饰,它们还能提供丰富的状态信息。QMK固件提供了读取HID规范中定义的5种LED状态的方法: Num Lock(数字锁定)Caps Lock(大写锁定)Scroll Lock(滚动锁定)Compose(组合键)Desp…...

HTTP方法和状态码(Status Code)

HTTP方法 HTTP方法&#xff08;也称HTTP动词&#xff09;主要用于定义对资源的操作类型。根据HTTP/1.1规范&#xff08;RFC 7231&#xff09;以及后续扩展&#xff0c;常用的HTTP方法有以下几种&#xff1a; GET&#xff1a;请求获取指定资源的表示形式。POST&#xff1a;向指…...

【sqlmap需要掌握的参数】

sqlmap需要掌握的参数 目标-u 指定URL 用于get请求-l 用于post请求- r 用于post请求指定数据库/表/字段 -D/-T/-C 脱库获得数据库获取用户获取表获取列获取字段获取字段类型获取值 其他 目标 -u 指定URL 用于get请求 -u URL, --urlURL 目标URL 只使用于get命令中 -l 用于pos…...