IT公司的吉祥“树” 二叉树-(堆)C语言创建

news2024/12/29 10:54:01

目录

🍪前言

一、树概念及结构     

✅基本概念

✅树的专有名词

✅ 树的表示

🚩孩子兄弟表示法

二、二叉树概念及结构

        ✅概念

 😍😍现实中的二叉树(又称IT公司的吉祥物)😍😍

 

✅特殊的二叉树

✅二叉树的性质

✅二叉树的存储结构  

🍁顺序存储

 🍁链式存储

三、堆(堆的概念及结构)

 🍁概念

🍔小堆:

🍔大堆:

🍁堆的性质:

🍁堆的实现

💧 堆向下调整算法

⭕代码实现:

💧堆的创建

💧 堆的插入

⭕代码实现:

💧 堆的删除

⭕代码实现:

😍堆的全部代码

✅Heap.h 文件(头文件)

✅Heap.c 文件

✅Test.c文件


🍪前言

        🍁经过前面的学习,我们了解了一定的数据结构的知识,栈以及队列的强大我们也有所见证,见识到了链表的速度,以及带头双链表的便捷,也有几了道在线OJ的刷题经验了。

        🍁这段时间的自我提升,也能接受传说中的二叉树了,下面我将带领大家认识一下什么是二叉树以及二叉树的基本概念,学习二叉树中的堆的结构,后面也会学习堆的牛逼之处堆排序,这可是比冒泡排序更快更方便的一种排序方法(后面我会继续更新的,有想了解的可以关注一下,也会有堆相关的OJ题目讲解)

一、树概念及结构     

✅基本概念

        🍟树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的

🥝有一个特殊的结点,称为根结点,根节点没有前驱结点

🥝除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、…...、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继

🥝因此,树是递归定义的。

🚨注意:树形结构中,子树之间不能有交集,否则就不是树形结构。

        🚩下面这些就是个别比较典型的非树结构 

afd3cd21e3e046f09dd16901697ed035.png

✅树的专有名词

        🍟了解完基本树的结构,下面还有一碟开胃小菜,请各位客官细品🥰

        🍁下面介绍了一些树中的一些专有名词,以下面这个图中的树为例

435c7ec2f20646d79e04dd613e0a0c78.png

节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6

叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点

非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点

父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点; 如上图:A是B的父节点

孩子节点:一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点

兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点

树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推

树的高度或深度:树中节点的最大层次; 如上图:树的高度为4

堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点

节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙

森林:由m(m>0)棵互不相交的树的集合称为森林

✅ 树的表示

        树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,既然保存值域,也要保存结点和结点之间的关系,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法等。

        🍁我们这里就简单的了解其中最常用的孩子兄弟表示法。🥰

🚩孩子兄弟表示法

        🍎孩子兄弟表示法,顾名思义是只有孩子和兄弟的表示方法,即:父亲的 child 地址只存最左边的那个孩子,孩子的兄弟地址记录了他的兄弟(举个例子就是:在家里父亲要找你们兄妹几个去吃饭,父亲只需要找到长子,然后让长子去找他的兄弟姐妹们)

        🍎我们还是老套路拿图来解释:a94e06a36715497eb74f2754965d43c3.png

         下面就是代码实现的过程了

typedef int DataType;
struct Node
{
    struct Node* _firstChild1;     // 第一个孩子结点
    struct Node* _pNextBrother;    // 指向其下一个兄弟结点
    DataType _data;                // 结点中的数据域
};

二、二叉树概念及结构

        ✅概念

       🍟 一棵二叉树是结点的一个有限集合,该集合由一个根节点加上两棵别称为左子树和右子树的二叉树组成(或者为空)。

7ef47d6543e5457eabc2603d0129ead3.png

 从上图可以看出:

⭕二叉树不存在度大于2的结点
⭕二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树

 🚨注意:对于任意的二叉树都是由以下几种情况复合而成的

319434e0d13a4d67a9f49c48eb1bdde9.png

 😍😍现实中的二叉树(又称IT公司的吉祥物)😍😍

34f8f0ff785a41e9b9bc8258585b1614.jpeg

0b1908bd968aee3374dcd7bf3ffaf314.jpeg

         😍😍同学们看到这两张图会不会有很神圣的感觉,我会感觉神圣的感觉。😍😍

而且这些“树”肯定能做IT公司的吉祥物!!!😍😍😍   (泰裤辣!!!)67a9edfcbcf44144bfbdeb53c8f3dfc3.png

 

✅特殊的二叉树

⭕ 满二叉树   :一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1 ,则它就是满二叉树。

完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
🚨注意:满二叉树也属于特殊的完全二叉树!!! 

055b3b0690c443ee910e9d19126672e2.png

二叉树的性质

若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有 2^(i-1)个结点.

若规定根节点的层数为1,则深度为 h 的二叉树的最大结点数是 2^h-1.

对任何一棵二叉树, 如果度为0其叶结点个数为n。 , 度为2的分支结点个数为n2 ,则有n。=n2+1

若规定根节点的层数为1,具有n个结点的满二叉树的深度,h= log2(n+1). (ps:log2(n+1) 是log以2为底,n+1为对数)

对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为 i 的结点有:

  1. 若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i 为根节点编号,无双亲节点
  2. 若2i+1<n,左孩子序号:2i+1,2i+1>=n 否则无左孩子
  3. 若2i+2<n,右孩子序号:2i+2,2i+2>=n 否则无右孩子

✅二叉树的存储结构
  

🍪二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构

🍁顺序存储

        🥝 顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储,关于堆我们后面会专门讲解。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树

 

 🍁链式存储

        🥝 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分为二叉链和三叉链,当前我们学习中一般都是二叉链,后面会学到高阶数据结构如红黑树等会用到三叉链.

         🍔链式存储结构的代码来一份吧!!!

typedef int BTDataType;
// 二叉链
struct BinaryTreeNode
{
    struct BinTreeNode* _pLeft; // 指向当前节点左孩子
    struct BinTreeNode* _pRight; // 指向当前节点右孩子
    BTDataType _data; // 当前节点值域
}
// 三叉链
struct BinaryTreeNode
{
    struct BinTreeNode* _pParent; // 指向当前节点的双亲
    struct BinTreeNode* _pLeft; // 指向当前节点左孩子
    struct BinTreeNode* _pRight; // 指向当前节点右孩子
    BTDataType _data;             // 当前节点值域
};

三、堆(堆的概念及结构)

 🍁概念

        🍔普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段。

🍔小堆:

        如果有一个集合K = {k_{0}, k_{1}, k_{2}, ..., k_{n-1}}, 把它的所有元素按完全二叉树的顺序存储方式存储
在一个一维数组中,并满足:K_{i}<=K_{2*i+1} 且K_{i}<=K_{2*i+2}  i =0, 1, 2......,则称为小堆,根节点最小的堆叫做最小堆或小根堆。

🍔大堆:

        如果有一个集合K = {k_{0}, k_{1}, k_{2}, ..., k_{n-1}}, 把它的所有元素按完全二叉树的顺序存储方式存储
在一个一维数组中,并满足:K_{i}>=K_{2*i+1} 且K_{i}>=K_{2*i+2}  i =0, 1, 2......,则称为大堆,将根节点最大的堆叫做最大堆或大根堆。

🍁堆的性质:

堆中某个节点的值总是不大于或不小于其父节点的值。

堆总是一棵完全二叉树。

 

 🍁堆的实现

💧 堆向下调整算法

         🥝现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。

int array[] = {27,15,19,18,28,34,65,49,25,37};

⭕代码实现:

void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;   // 通过父亲节点找到孩子
	
	while (child < n)   //  当孩子节点超过了数组的大小那么就跳出循环
	{
		if (child < n - 1 && a[child] < a[child + 1])  //找到孩子中最大的那个
		{
			child++;
		}
		if (a[child] > a[parent])  // 最大的跟父亲比较,大于(小于)父亲了就交换位置
		{
			swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}

 

💧堆的创建

🥝 下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。根节点左右子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的子树开始调整一直调整到根节点的树,就可以调整成堆。

💧 堆的插入

🥝 先插入一个10到数组的尾上,再进行向上调整算法,直到满足堆。

⭕代码实现:

void AdjustUp(HPDataType* a, int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			return;
		}
	}
}

void HeapPush(HP* php, HPDataType x)
{
	assert(php);  //防止传入的是空指针
	if (php->capacity == php->size)   //当空间不够用了,扩展空间
	{
		int newcapacity = (php->capacity == 0 ? 4 : php->capacity * 2);
		HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));
		if (tmp == NULL)  //判断是否扩展成功
		{
			perror("realloc fail");  // 失败返回错误信息
			return;
		}
		php->a = tmp;    //初始化扩展好的空间
		php->capacity = newcapacity;
	}
	php->a[php->size] = x;
	php->size++;
	AdjustUp(php->a, php->size - 1);  // 向上调整数据
}

 

💧 堆的删除

🥝删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。

🔴将堆顶元素与堆中最后一个元素进行交换

🔴除堆中最后一个元素

🔴将堆顶元素向下调整到满足堆特性为止

 ⭕代码实现:

void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;   // 通过父亲节点找到孩子
	
	while (child < n)   //  当孩子节点超过了数组的大小那么就跳出循环
	{
		if (child < n - 1 && a[child] < a[child + 1])  //找到孩子中最大的那个
		{
			child++;
		}
		if (a[child] > a[parent])  // 最大的跟父亲比较,大于(小于)父亲了就交换位置
		{
			swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}
void HeapPop(HP* php)
{
	assert(php);
	assert(!HeapEmpty(php));
	swap(&php->a[php->size-1], &php->a[0]);
	php->size--;
	AdjustDown(php->a, php->size, 0);
}

堆的全部代码

✅Heap.h 文件(头文件)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int HPDataType;  //定义堆的类型
typedef struct Heap      //创建堆的初始结构
{
	HPDataType* a;
	int size;
	int capacity;
}HP;

//向上调整数据
void AdjustUp(HPDataType* a, int child); 

//向下调整数据
void AdjustDown(int* a, int n, int parent);

//初始化堆
void HeapInit(HP* php);

//堆的销毁
void HeapDestroy(HP* php);

//向堆中插入数据
void HeapPush(HP* php, HPDataType x);

//删除堆顶的数据
void HeapPop(HP* php);

//弹出堆顶的数据
HPDataType HeapTop(HP* php);

//判断是否为空堆
bool HeapEmpty(HP* php);

//计算堆的大小
int HeapSize(HP* php);

✅Heap.c 文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "Heap.h"
//交换堆中指定的两个数据
void swap(HPDataType* x, HPDataType* y)
{
	HPDataType tmp = *x;
	*x = *y;
	*y = tmp;
}
//向上调整数据
void AdjustUp(HPDataType* a, int child)
{
	int parent = (child - 1) / 2;
	while (child > 0)
	{
		if (a[child] > a[parent])
		{
			swap(&a[child], &a[parent]);
			child = parent;
			parent = (child - 1) / 2;
		}
		else
		{
			return;
		}
	}
}
//向下调整数据
void AdjustDown(int* a, int n, int parent)
{
	int child = parent * 2 + 1;

	while (child < n)
	{
		if (child < n - 1 && a[child] < a[child + 1])
		{
			child++;
		}
		if (a[child] > a[parent])
		{
			swap(&a[child], &a[parent]);
			parent = child;
			child = parent * 2 + 1;
		}
		else
		{
			return;
		}
	}
}
//初始化堆
void HeapInit(HP* php)
{
	assert(php);
	php->a = NULL;
	php->capacity = 0;
	php->size = 0;
}
//堆的销毁
void HeapDestroy(HP* php)
{
	assert(php);
	free(php->a);
	php->a = NULL;
	php->capacity = 0;
	php->size = 0;
}

//向堆中插入数据
void HeapPush(HP* php, HPDataType x)
{
	assert(php);
	if (php->capacity == php->size)
	{
		int newcapacity = (php->capacity == 0 ? 4 : php->capacity * 2);
		HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		php->a = tmp;
		php->capacity = newcapacity;
	}
	php->a[php->size] = x;
	php->size++;
	AdjustUp(php->a, php->size - 1);
}
//删除堆顶的数据
void HeapPop(HP* php)
{
	assert(php);
	assert(!HeapEmpty(php));
	swap(&php->a[php->size - 1], &php->a[0]);
	php->size--;
	AdjustDown(php->a, php->size, 0);
}
//弹出堆顶的数据
HPDataType HeapTop(HP* php)
{
	assert(php);
	return php->a[0];
}
//判断是否为空堆
bool HeapEmpty(HP* php)
{
	return php->size == 0;
}
//计算堆的大小
int HeapSize(HP* php)
{
	return php->size;
}

✅Test.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "Heap.h"
int main()
{
	HP hp;
	HeapInit(&hp);
	int a[] = { 65,100,70,32,50,60 };
	for (int i = 0; i < sizeof(a) / sizeof(int); ++i)
	{
		HeapPush(&hp, a[i]);
	}
	while (!HeapEmpty(&hp))
	{
		int top = HeapTop(&hp);
		printf("%d\n", top);
		HeapPop(&hp);
	}

	return 0;
}

🥰 运行结果如下产生了一个大堆

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/581508.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx常用操作说明

Nginx常用操作说明 介绍Nginx概念深入浅出Nginx环境搭建Nginx反向代理-负载均衡Nginx动静分离Nginx动静分离先在部署Nginx的机器&#xff0c;Nginx目录下创建一个目录static_resources将项目中所有的静态资源全部拷贝到该目录下&#xff0c;而后将项目中的静态资源移除重新打包…

Hexo 个人博客主题美化

anzhiyu主题文档&#xff1a;https://anzhiy.cn/posts/220c.html anzhiyu主题插件地址&#xff1a;https://github.com/anzhiyu-c/hexo-theme-anzhiyu anzhiyu 主题安装 在博客根目录里执行命令&#xff0c;安装 anzhiyu 主题&#xff1a; git clone -b main https://github.co…

sql partition by和rank的统计用法

问题背景 最近公司有个项目需要用到某种特殊的统计用法&#xff0c; 例如从所有的数据中找出每个账号最新的一条余额信息&#xff08;根据某个关键信息进行排序并获取排序值最高的记录&#xff09;。 当时用的是非常普通的语句&#xff0c;也就是多个子查询嵌套select出每个账…

chatgpt赋能python:Python下载jieba:优化中文分词的必备工具

Python下载jieba&#xff1a;优化中文分词的必备工具 在中文自然语言处理的领域中&#xff0c;分词是一项基础且重要的任务。jieba是一个优秀的中文分词组件&#xff0c;它支持三种分词模式&#xff0c;并且具有高效、准确、易用等优点。本文将介绍如何通过Python来下载jieba&…

chatgpt赋能python:Python中8//3**2*10的解析与运算

Python中8//3**2*10的解析与运算 Python是一种高效&#xff0c;多范式&#xff0c;解释性编程语言&#xff0c;广泛用于Web开发&#xff0c;数据科学&#xff0c;人工智能等领域。在Python的运算中&#xff0c;有一个8//3**2*10的表达式&#xff0c;本篇文章将对其进行解析与运…

Springboot 配置文件脱敏的实践

写作目的 数据安全这块还是挺严重的&#xff0c;尤其是自己专注于业务开发&#xff0c;不能总停留在一个地方&#xff0c;还要关注其他的一些问题&#xff0c;比如数据安全。 配置脱敏 实现配置的脱敏我使用了Java的一个加解密工具Jasypt。该工具支持对称加密和非对称加密。…

pytorch基础学习-tensorboardX

最近训练总是出问题&#xff0c;听取建议&#xff0c;在pytorch环境下引入了tensorboard 1、安装tensorboardX tensorboardX是在tensorboard前提下进行安装的&#xff0c;所以我们需要先安装tensorboard pip install tensorboardpip install tensorboardX2、简单使用 这里我…

应急响应-windows

win系统常见的安全事件 1.病毒&#xff0c;木马&#xff0c;蠕虫事件 2.web服务器入侵事件或第三方服务入侵事件 3.系统入侵事件&#xff0c;用win漏洞入侵系统&#xff0c;利用弱口令等。 4.网络攻击事件&#xff0c;如DDos&#xff0c;ARP欺骗等。 win系统安全事件发现的…

基于自适应反馈调节因子的阿基米德优化算法(IAOA)-附代码

基于自适应反馈调节因子的阿基米德优化算法(IAOA) 文章目录 基于自适应反馈调节因子的阿基米德优化算法(IAOA)1.阿基米德优化算法2. 改进阿基米德优化算法2.1 佳点集种群初始化2.2 自适应反馈调节因子2.3 莱维旋转变换策略 3.实验结果4.参考文献5.Matlab代码6.Python代码 摘要&…

软考A计划-试题模拟含答案解析-卷七

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

Maven学习笔记(单一架构案例)22版

第一节 创建工程&#xff0c;引入依赖 1 架构 ①架构的概念 『架构』其实就是『项目的结构』&#xff0c;只是因为架构是一个更大的词&#xff0c;通常用来形容比较大规模事物的结构。 ②单一架构 单一架构也叫『all-in-one』结构&#xff0c;就是所有代码、配置文件、各种…

基于hdoop的短视频用户画像研究_kaic

基于hadoop的短视频用户画像研究 摘 要 在这个互联网迅速发展的时代&#xff0c;网络和信息技术都跟上了时代的潮流&#xff0c;在互联网中的用户数据也出现了爆炸性的增长。用户的各种日常行为都通过互联网被记录下来&#xff0c;对于所有的互联网企业来说&#xff0c;想要从…

TCP报文中序列号的作用

TCP&#xff08;传输控制协议&#xff09;中的序列号用于标识TCP报文段中的数据部分。每个TCP报文段都包含一个序列号字段&#xff0c;该字段指示了报文段中第一个字节的序号。在后续的报文段中&#xff0c;序列号将递增&#xff0c;以指示下一个字节的序号。 TCP序列号是一个…

升级Springboot2.7.11之后内嵌tomcat启动成功, 但访问任何接口都是404

背景 最近项目在升级JDK17, 但原先低版本Springboot不能识别jdk17编译的字节码, 为了能够使用JDK17的语法, 因此对SpringBoot也做了升级, 直接升级到了SpringBoot 2.7.11版本. 对一些变更修改升级完成后, 本地启动服务运行, 一切正常!!! 于是发布到公司的容器环境运行, 发布平…

queue的常见接口说明(基于c++标准库的STL)

前言 队列是一种容器适配器&#xff0c;专门用于先进先出&#xff08;FIFO&#xff09;的操作中 &#xff0c;其容器从一端插入数据&#xff0c;从另一端取出数据。队列作为一种容器适配器实现&#xff0c;容器适配器即将特定的容器封装起来&#xff0c;queue提供一组特定的成员…

LBM-BGK计算泊肃叶流动

LBM在计算泊肃叶流动时&#xff0c;需要添加外力项&#xff0c;这部分网上没什么资料&#xff0c;仅有的资料也写的模糊不清&#xff0c;这里点名批评这个知乎博文。 有些地方字母都对不上。。。 本站上也有一篇博文&#xff0c;写的也比较一般&#xff0c;但是代码是多松弛MR…

测试C#分词工具jieba.NET(续2:其它用法)

jieba.NET除分词和关键词提取功能之外&#xff0c;还有一些其它用法&#xff0c;本文基于参考文献学习并记录。 设置停用词 提取关键词时&#xff0c;部分词语可能不重要或者并非所需的词语&#xff0c;此时可以通过设置停用词&#xff0c;在提取关键词时过滤掉指定的停用词。…

【笔记整理】图神经网络学习

【笔记整理】图神经网络学习 文章目录 【笔记整理】图神经网络学习一、GNN简介1、图结构 & 图基础算法1&#xff09;引言&#xff08;"非欧几何, 处理图数据的NN"&#xff09;2&#xff09;图基本概念 & 分类&#xff08;"邻接矩阵, 图结构分类"&a…

搭建springboot工程_学习笔记

2.搭建springboot环境 2.1 使用maven项目 在pox.xml文件中加入parent <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.4</version></parent>在pom…

chatgpt赋能python:Python中8%3的运算:一种常见的数学问题

Python中8%3的运算&#xff1a;一种常见的数学问题 在Python中&#xff0c;8%3是一种常见的数学问题。在本文中&#xff0c;我们将介绍Python中的这种运算符以及它的用途。 什么是8%3&#xff1f; 百度百科给出的解释是&#xff1a; 求余运算符&#xff08;%&#xff09;用来…