二叉树(中)-- 堆
- 大堆: 任何一个父亲都大于等于孩子
- 小堆: 任何一个父亲都小于等于孩子
- 根是最小或者最大
- 效率很高
堆的定义
我们来看一下一个堆的定义
堆逻辑上是一个二叉树,有父子关系啊层级关系,但是在物理上是一个数组,存储着一些数
所以我们在创建的时候要按着物理层面去创建,但是心中要想到他的逻辑图
typedef int HPDataType;
typedef struct Heap {HPDataType* a; //数组int size; //元素个数int capacity; //空间大小
}HP;
堆的初始化和销毁显而易见,和顺序表一致
//初始化
void HPInit(HP* php)
{assert(php);php->a = NULL;php->size = php->capacity = 0;
}
//堆的销毁
void HPDestory(HP* php)
{assert(php);free(php->a);php->capacity = php->size = 0;
}
堆的插入
我们以小堆为例
堆的插入逻辑如下:
如果是小堆,则将待插入的数据先放在最后,然后与其父节点进行比较,如果比父节点小就与父节点交换位置
如果不能理解可以这么想假设父节点是 a,有一个已知的子节点 b ,现在有待插入节点 c ,a < b 且 a > c 则 a 与 c 进行交换 ,c < a 且 c < b ,c 是 a 和 b 的父节点符合小堆的定义然后再继续往上一级比较,也就是和自己所有的祖先进行比较
//向上调整
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = 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;}elsebreak;}
}
void HPPush(HP* php, HPDataType x)
{assert(php);//扩容if (php->size == php->capacity){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, newcapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc failed");exit(1);}php->a = tmp;php->capacity = newcapacity;}php->a[php->size] = x;php->size++;//向上调整AdjustUp(php->a, php->size - 1); //我们计算父子关系用的下标来计算
}
上图便是向上调整的图解方法
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;}elsebreak;}
}
在向上调整函数 AdjustUp中,while 循环的结束条件child = 0 的时候,也就是插入的节点来到了根节点处。
那把结束条件改成 parent < 0 呢,我们知道当parent 到 0 的时候也算到了根节点处,但是数组没有负数下标,在 parent = (child - 1) / 2 中怎么除也不会小于 0 ,巧合地是当 parent = 0 时且 child = 0 时,a[child] = a[parent] ,不符合判断条件,直接break,也完成了插入。所以两种方法都可以,但是最好用 child > 0 作为判断
建堆
有了插入,我们现在就可以来建堆了,只需要将数组中的元素依次插入即可
int main()
{HP a;int arr[8] = { 2, 3 ,5, 7 ,9 ,1 ,10, 4 };HPInit(&a);for (size_t i = 0; i < sizeof(arr) / sizeof(int); i++){HPPush(&a, arr[i]);}return 0;
}
该函数会自动调整是元素满足堆的排列规则
堆的删除
关于堆的删除,我们并不是删除其在物理层面的最后一个元素而是将根节点删除
我们不能使用挪动覆盖删除堆顶的数据,直接覆盖会导致堆中的关系大乱,兄弟变父子,父子变兄弟
我们可以先将物理层面数组的第一个数据和最后一个数据先互换,再删除最后一个数据,也就是一开始的根节点被删除了,但是此时根节点与其子节点的关系出现问题,此时就需要使用向下调整算法
pop 一次后我们发现一个有趣的事情,此时的根节点是现在最小的那个数,比之前删除的那个数大,所以每次删除都会有序取出堆中最小的数,如果全部 pop 并依次排列便会形成一个有序的升序数列,看似无序的堆变得有序了起来
如何判断向下调整到了叶节点呢,我们只需要判断其是否存在左孩子即可,如果乘二加一后其下标已经超过数组了,则不存在左孩子也就是到达叶节点了
如果想改成大堆的话,就把向上调整和向下调整的大小关系换一下就行了
//删除堆顶的数据(根位置)
//向下调整
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;}elsebreak;}
}
void HPPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdjustDown(php->a, php->size, 0);
}
向下调整算法的三个参数分别是 数组 元素总个数 当前待向下调整的节点所在数组的下标
取堆顶元素
//返回堆顶元素
HPDataType HPTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];
}
判空
//判空
bool HPEmpty(HP* php)
{assert(php);return php->size == 0;
}
打印最小的 n 个数
当我们有了插入函数和删除函数与取堆顶函数之后,我们便可以打印出1堆数字中最小的 n 个数
#include "Heap.h"int main()
{HP a;int arr[] = { 2, 3 ,5, 7 ,9 ,1 ,10, 4 };HPInit(&a);for (size_t i = 0; i < sizeof(arr) / sizeof(int); i++){HPPush(&a, arr[i]);}//打印有序while (!HPEmpty(&a)){printf("%d ", HPTop(&a));HPPop(&a);}return 0;
}
现在只能是打印排序而没有真正影响到堆的排序,但也是堆排序的前生
如果想实现真正的排序,且让空间复杂度尽量小,我们不能专门建一个堆,这样太烦了,所以我们可以直接使用向上调整函数,把一个数组当成完全二叉树
void HeapSort(int* a, int n)
{//建堆for (int i = 1; i < n; i++){AdjustUp(a, i);}
}
这样就直接将一个数组变成小堆了
需要提醒的是堆的物理和逻辑层,我们在删除的时候,并不是真正的删除,只是逻辑上的将最后一个元素排除在堆外,但物理上他仍然在数组中,我们要综合两个方面取思考不能完全被逻辑图糊弄
想变成降序,就建小堆
首先我们变成小堆后,根节点就是最小的一个,模仿删除函数,我们将首和尾换位置后删除,此时最后一个便是最小的
多次进行同样的操作我们便可以形成降序数列
//降序排列
void HeapSort(int* a, int n)
{//建堆for (int i = 1; i < n; i++){AdjustUp(a, i);}int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}
所以这里排序的关键就是这两个向上调整和向下调整算法
其时间复杂度为 O(N * log N) 算是比较快的排序算法了
这个时候,我们想一个问题,建堆有没有更快的方法呢?向下调整算法的前提是其子树也按大堆排列的,那么同理子节点的子树也要大堆排列,很麻烦。既然对于向下调整算法是要求下面都是大堆,我们不如从下往上来进行向下调整算法。对于叶子节点,其既是大堆又是小堆,不用管,所以从倒数第一个非叶子节点开始向下调整
这个建堆算法更快,写法差不多
void HeapSort(int* a, int n)
{//建堆
// for (int i = 1; i < n; i++)
// {
// AdjustUp(a, i);
// }for (int i = (n - 1 - 1) / 2; i >= 0; i--){AdjustDown(a, n, i);}
}
所以说,向上调整算法可以让随意一个数组变成大小堆,向下调整算法要其子树是小堆才能全变成小堆,子树是大堆才能变成大堆。
相关文章:
二叉树(中)-- 堆
堆是一个独立的数据结构,堆是一个二叉树。堆和栈几乎没有什么关联 堆是一个完全二叉树,可以用数组存储 大堆: 任何一个父亲都大于等于孩子小堆: 任何一个父亲都小于等于孩子 请注意,小堆大堆并不一定是升序或降序&…...
艾伦·图灵:计算机科学与人工智能之父
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 艾伦图灵:计算机科学与人工智能之父 一、天才的诞生与早期生涯 1912年6月…...
Doris 安装部署、实际应用及优化实践:对比 ClickHouse 的深度解析
在实时分析、报表系统以及高并发 OLAP 查询等场景中,列式存储数据库因其卓越的查询性能逐渐成为主流。Doris 和 ClickHouse 是近年来最受欢迎的两款开源 OLAP 引擎,本文将系统介绍 Doris 的安装部署、应用场景及优化实践,并与 ClickHouse 做一…...
Vue的学习总结-day02
一、Vue的基本语法 1、Vue.js 使用双大括号 {{ }} 来表示文本插值: <template><div class"demo">{{msg}}</div> </template> 2、指令 v-bind:动态绑定一个或多个特性,或一个组件 prop。 <template…...
MySQL 中查询 VARCHAR 类型 JSON 数据的
在数据库设计中,有时我们会将 JSON 数据存储在 VARCHAR 或 TEXT 类型字段中。这种方式虽然灵活,但在查询时需要特别注意。本文将详细介绍如何在 MySQL 中有效查询存储为 VARCHAR 类型的 JSON 数据。 一、问题背景 当 JSON 数据存储在 VARCHAR 列中时&a…...
Spring Boot 的启动流程
Spring Boot 是一个用于简化 Spring 应用程序开发的框架,它通过自动配置和约定优于配置的原则,大大降低了开发者的工作量。下面我们将深入探讨 Spring Boot 的启动流程,帮助你理解其背后的工作机制。 1. 启动入口 Spring Boot 应用的启动入…...
JMeter的接口测试步骤
创建测试计划 新建测试计划: 打开 JMeter,右键点击 Test Plan,选择 Add -> Threads (Users) -> Thread Group。双击 Thread Group,设置线程数(用户数)、循环次数等参数。 添加取样器(S…...
Linux基础14
一、搭建LAMP平台 安装包:mariadb-server、php、php-mysqlnd、php-xml、php-json 搭建平台步骤: php步骤: 创建网页:index.php 网页内编写php语言: > eg:<?p…...
七种数码管驱动/LED驱动综合对比——《器件手册--数码管驱动/LED驱动》
十四、数码管驱动/LED驱动 名称 工作原理 应用场景 优缺点 特点 LED驱动 LED驱动的核心是为发光二极管提供稳定的电流。LED的亮度与电流成正比,而其正向电压相对稳定。驱动电路需要根据电源电压和LED的正向电压,通过限流电阻或恒流芯片来控制电流。…...
【25软考网工笔记】第二章 数据通信基础(2) 信道延迟计算
目录 一、信道延迟 1. 线路延迟 1)线路延迟与传输距离的关系 2)光纤线路与电缆线路的传播速度 3)线路延迟计算示例:1000米电缆的延迟 2. 发送延迟 1)发送延迟的定义与计算 2)发送延迟的影响因素 3.…...
代码随想录第16天:(二叉树)
一、最大二叉树(Leetcode 654) class Solution:def constructMaximumBinaryTree(self, nums: List[int]) -> TreeNode:# 基础条件:当数组只有一个元素时,直接返回该元素构建的二叉树节点if len(nums) 1:return TreeNode(nums[…...
Android activity属性taskAffinity的作用
1. taskAffinity的基本概念 在Android开发中,taskAffinity是一个定义在标签中的属性,用于指定Activity与哪个任务(Task)相关联。默认情况下,应用的所有Activity都共享同一个任务堆栈,其taskAffinity值为应…...
Vuex Actions 多参数传递的解决方案及介绍
Vuex Actions 多参数传递的解决方案及介绍 引言 在Vuex状态管理模式中,Actions 扮演着至关重要的角色。它主要用于处理异步操作,并且可以提交 Mutations 来修改全局状态。然而,在实际开发中,我们常常会遇到需要向 Actions 传递多…...
SQL学习--基础语法学习
SQL和excle对比 学习目标 单表查询 项目背景 SQL 练习环境 SQL Online Compiler - Next gen SQL Editor 商品信息表:https://study-zhibo.oss-cn-shanghai.aliyuncs.com/test/%E5%95%86%E5%93%81%E4%BF%A1%E6%81%AF%E8%A1%A8.csv 订单明细表:https://…...
ProfibusDP转ModbusTCP接流量计技巧
ProfibusDP转ModbusTCP接流量计技巧 在现代工业自动化系统中,设备的互联互通至关重要。为了实现不同协议设备之间的数据交换与统一管理,Profibus DP主站转Modbus TCP网关成为了一个重要的解决方案。本文将详细介绍这一转换方案及其在电磁流量计中的应用…...
【数据结构与算法】ArrayList 和 顺序表
文章目录 🌲List🌲1. 线性表🌲2. 顺序表🌿2.1 MyArrayList2.1.1 类中重写所有接口方法1.新增元素2.在pos位置新增元素(指定位置)3.判定是否包含了某个特定元素 4.查找特定元素对应的位置 5.获取pos下标的元素 6.给pos位置的元素替…...
VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南
VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南—目录 一、VMware 产品说明二、下载 VMware Fusion三、安装前准备四、安装 VMware Fusion步骤 1:安装程序步骤 2:首次启动配置步骤 3:输入许可证 五、创建虚拟机步骤 1:…...
GESP2025年3月认证C++七级( 第三部分编程题(1)图上移动)
参考程序(动态规划) #include <cstdio> using namespace std; const int K 25; // 最大步数 多开一点 const int N 505; // 最大结点数 const int E N << 1; // 最多边数(因为是无向图,每条边…...
将LINUX系统本机文件上传到LINUX虚拟机,未联网的情况下
将LINUX系统本机文件上传到LINUX虚拟机,未联网的情况下 1.将需要上传的文件,归档为.iso镜像文件 命令:mkisofs -r -o myiso.iso /iso/tool 2.打开虚拟机,选择需要挂载的光盘 3.创建挂载点,一般在/mnt目录下 mkdir /mnt/tool 4.临时挂载镜像 mount /dev/cdrom /mnt/tool 5.需要…...
Selenium之Actions事件
鼠标、键盘组合键 在使用selenium的时候,有的时候我们需要鼠标单击、双击、拖动;或者是按下键盘的某个键,松开某个按键,以及组合键的使用;今天我们就来看一看,怎么样实现上面的操作 先把准备工作做好&…...
高等数学同步测试卷 同济7版 试卷部分 上 做题记录 第三章微分中值定理与导数的应用同步测试卷 A 卷
第三章微分中值定理与导数的应用同步测试卷 A 卷 一、单项选择题(本大题共5小题,每小题3分,总计15分) 1. 2. 3. 4. 5. 二、填空题(本大题共5小题,每小题3分,总计15分) 6. 7. 8. 9. 10. 三、求解下列各题(本大题共5小题,每小题6分,总计…...
使用Vscode排除一些子文件搜索
打开用户/工作区设置 全局生效:打开命令面板(CtrlShiftP 或 CmdShiftP),搜索并选择 Preferences: Open User Settings (JSON)。 仅当前项目生效:在项目根目录下创建 .vscode/settings.json 文件(如果不存在…...
《前端面试题之 CSS篇(第一集)》
目录 1、CSS的盒模型2、CSS选择器及其优先级3、隐藏元素的方法有那些4、px、em、rem的区别及使用场景5、重排、重绘有什么区别6、水平垂直居中的实现7、CSS中可继承与不可继承属性有哪些8、Sass、Less 是什么?为什么要使用他们?9、CSS预处理器/后处理器是…...
第九天 开始Unity Shader的学习之单张纹理
Unity Shader的学习笔记 第九天 开始Unity Shader的学习之单张纹理 文章目录 Unity Shader的学习笔记前言一、基础纹理二、单张纹理① Properties② Cg代码块的变量③ 顶点着色器和片元着色器的结构体(a2v 和 v2f)④ 顶点着色器vert⑤ 片元着色器 frag效果展示 总结 前言 前几…...
Linux-内核驱动-led
登记设备号(后面可以动态分配) 自己定义内核函数 登记设备名字和功能 exit和init在内核启动自动执行 这样定义直接操作物理地址 ioctl 定义了设备文件的各种操作,并准备将其注册到内核中。 代码中声明了一个cdev结构体变量cdev,这…...
Web 项目实战:构建属于自己的博客系统
目录 项目效果演示 代码 Gitee 地址 1. 准备工作 1.1 建表 1.2 引入 MyBatis-plus 依赖 1.3 配置数据库连接 1.4 项目架构 2. 实体类准备 - pojo 包 2.1 dataobject 包 2.2 request 包 2.3 response 包 2.3.1 统一响应结果类 - Result 2.3.2 用户登录响应类 2.3.3…...
C++算法(1):stringstream详解,高效字符串处理与类型转换的利器
什么是stringstream? stringstream是C标准库中的一个类,定义在<sstream>头文件中。它提供了一种方便的方式来处理字符串与其他数据类型之间的转换和格式化操作。stringstream结合了istringstream和ostringstream的功能,既可以用于输入…...
【前端】【css】flex布局详解
Flex 布局(Flexible Box Layout,弹性盒子布局)是 CSS3 中的一种布局模式,用于在容器中更高效地分配空间并对齐内容,即使它们的大小是动态未知的。它非常适用于响应式设计。 一、Flex 布局的基本概念 1. 启用 Flex 布局…...
Python Cookbook-5.15 根据姓的首字母将人名排序和分组
任务 想将一组人名写入一个地址簿,同时还希望地址簿能够根据姓的首字母进行分组,且按照字母顺序表排序。 解决方案 Python 2.4 的新 itertools.groupby 函数使得这个任务很简单: import itertools def qroupnames(name_iterable):sorted_names sort…...
深入探析C#设计模式:访问者模式(Visitor Pattern)的原理与应用
引言 在软件开发中,设计模式为我们提供了高效、可维护的解决方案。而在众多设计模式中,访问者模式(Visitor Pattern)以其独特的结构和应用场景,在复杂系统中发挥着重要作用。本文将深入讲解访问者模式的定义、原理、优…...
2025蓝桥杯省赛C/C++研究生组游记
前言 至少半年没写算法题了,手生了不少,由于python写太多导致行末老是忘记打分号,printf老是忘记写f,for和if的括号也老是忘写,差点连&&和||都忘记了。 题目都是回忆版本,可能有不准确的地方。 …...
RPA VS AI Agent
图片来源网络 RPA(机器人流程自动化)和AI Agent(人工智能代理)在自动化和智能化领域各自扮演着重要角色,但它们之间存在显著的区别。以下是对两者区别的详细分析: 一、定义与核心功能 RPA(机…...
软件信息化项目等级分类评定表
对信息化项目进行分类评级管理,能够优化资源配置、保障项目成效。可从项目性质、规模、战略价值等维度分类,依据技术、风险、收益等指标评级,进而实现精细化管理。 分类管理 按项目性质分类:可分为业务流程优化项目,如优化企业采购流程的信息化项目,旨在提升效率;还有信…...
从0~1搭建自动化备份全网服务器数据平台
目录 摘要: 一、项目背景 1.1 rsync简介 作用: 特点: 语法: 1.2 项目需求 配置需求: 二、项目环境 2.1 项目拓扑结构 2.2 软硬件环境清单 三、任务清单 3.1 项目环境搭建 3.2 服务器部署 Web服务器搭建部署&#…...
用户态视角理解内核ROP利用:快速从shell到root的进阶
用户态视角理解内核ROP利用:快速从shell到root的进阶 一、摘要 本文仅限于快速从用户态向内核态入门,可能会有很多不严谨的地方,存在问题请及时告知感谢!本文旨在通过对比用户态 ROP 利用和内核 ROP 利用,揭示两者在利用手法上的相似性。通过分析用户态漏洞利用的流程,结合…...
我又叕叕叕更新了~纯手工编写C++画图,有注释~
本次更新内容: 优化性能,朗读 提前申明:如果运行不了,请到主页查看RedpandaDevc++下载,若还是不行就卸了重装。 版本号:1.26.36 779行 24690字 最终结果预览 代码预览 //版本号 :v1.26.36 //最终归属权为作者(饼干帅成渣)所有 //禁止转载 //仅供学习,不得用于违法 #…...
【家政平台开发(37)】家政平台蜕变记:性能优化与代码重构揭秘
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
基于springboot+vue的秦皇岛旅游景点管理系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 用户登录 旅游路…...
图像预处理-翻转与仿射变换
一.图像翻转 cv2.flip(img,flipcode) 参数 - flipcode : 指定翻转类型的标志,为0,表示沿x轴翻转,>0(默认1) 表示沿y轴翻转,为 <0(默认-1) 表示水平垂直翻转 OpenCV中,图片的镜像旋转以图像的中心为原点 impo…...
[ABC400F] Happy Birthday! 3 题解
考虑正难则反。问题转化为: 一个环上有 n n n 个物品,颜色分别为 c o l i col_i coli,每次操作选择两个数 i , j i, j i,j 使得 ∀ k ∈ [ i , j ] , c o l k c o l i ∨ c o l k 0 \forall k \in [i, j], col_k col_i \lor col_k …...
使用nuxt3+tailwindcss4+@nuxt/content3在页面渲染 markdown 文档
nuxt3tailwindcss在页面渲染 markdown 文档 页面效果 依赖 “nuxt/content”: “^3.4.0” “tailwindcss”: “^4.0.10” “nuxt”: “^3.16.2” “tailwindcss/vite”: “^4.0.10” tailwindcss/typography (这个是格式化 md 样式用的) 注意: 这里nuxt/content…...
畅游Diffusion数字人(23):字节最新表情+动作模仿视频生成DreamActor-M1
畅游Diffusion数字人(0):专栏文章导航 前言:之前有很多动作模仿或者表情模仿的工作,但是如果要在实际使用中进行电影级的复刻工作,仅仅表情或动作模仿还不够,需要表情和动作一起模仿。最近字节跳动提出了一个表情+动作模仿视频生成DreamActor-M1。 目录 贡献概述 核心动…...
多模态学习分析(MLA)驱动高中差异化教学策略研究
一、引言 1.1 研究背景 在当今时代,教育数字化转型的浪潮正席卷全球,深刻地改变着教育的面貌。这一转型不仅是技术的革新,更是教育理念、教学模式和教育管理的全面变革。随着互联网、大数据、人工智能等现代信息技术在教育领域的广泛应用&a…...
为什么ASCII的A是65[特殊字符]
为什么ASCII的A是65 1. ASCII是怎么来的 ASCII是1960年代美国标准协会制定的,目的是统一计算机字符编码。它们要在**7个比特位(0-127)**里,塞下所有英文字符,数字,标点和控制符。 2. 为什么A是65&#x…...
Python正则表达式实战技巧:如何高效处理文本匹配?
当你需要在Python中处理文本数据时,正则表达式绝对是你的瑞士军刀。无论是数据清洗、日志分析还是表单验证,掌握正则表达式都能让你事半功倍。今天我们就来聊聊Python中re模块的那些实用技巧和常见陷阱。 为什么正则表达式如此重要? 想象一…...
驱动学习专栏--写在前面
此专栏基于正点原子的文档【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 开发板为luckfox的rv1106开发板,之前参加过一个CM1相机的开源项目,与其吃灰不如作为一个学习的工具来发挥余热 所以文档中的一些东西需要对应的在rv1106平台上做修改ÿ…...
Java中的Map vs Python字典:核心对比与使用指南
一、核心概念 1. 基本定义 Python字典(dict) :动态类型键值对集合,语法简洁,支持快速查找。Java Map:接口,常用实现类如 HashMap、LinkedHashMap,需声明键值类型(泛型&…...
从零搭建微服务项目Pro(第0章——微服务项目脚手架搭建)
前言: 在本专栏Base第0章曾介绍一种入门级的微服务项目搭建,尽管后续基于此框架上实现了Nacos、Eureka服务注册发现、配置管理、Feign调用、网关模块、OSS文件存储、JSR参数校验、LogBack日志配置,鉴权模块、定时任务模块等,但由于…...
RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings)
RAG创建向量数据库:docsearch = FAISS.from_texts(documents, embeddings) 代码解释 docsearch = FAISS.from_texts(documents, embeddings) 这行代码主要作用是基于给定的文本集合创建一个向量数据库(这里使用 FAISS 作为向量数据库工具 )。具体说明如下: FAISS :FAISS …...