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

探索Go语言中的循环单链表

简介

循环单链表是一种特殊的链表数据结构,它的最后一个节点指向链表的头节点,形成一个闭环。今天我们将探讨如何在Go语言中实现和操作这种数据结构。

为什么选择循环单链表?

  • 连续访问:在循环单链表中,可以无限循环地遍历数据元素,这在某些应用场景下非常有用,例如游戏中的无限滚动背景或队列管理。
  • 内存效率:由于循环特性,链表的尾节点可以直接链接到头节点,无需额外的指针或标记。

代码实现

以下是我们在Go中实现循环单链表的完整代码:

// -------------------------------------------
// @file      : CircularLinkedList.go
// @author    : Serein
// @contact   : xming9523@gmail.com
// @blog      : https://blog.childish.vip
// @time      : 2024/12/3 21:15:22 星期二
// -------------------------------------------package mainimport "fmt"// 循环单链表// CircularListNode 节点结构体定义
type CircularListNode struct {Val  int               // 节点的值Next *CircularListNode // 指向下一个节点的指针
}// CircularLinkList 循环单链表结构体定义
type CircularLinkList struct {Head *CircularListNode // 链表的头节点Tail *CircularListNode // 链表的尾节点
}// NewCircularLinkList 初始化循环单链表
func NewCircularLinkList() *CircularLinkList {return &CircularLinkList{Head: nil, Tail: nil} // 返回一个新的空循环链表
}func (l *CircularLinkList) insertNode(val int, atHead bool) {newNode := &CircularListNode{Val: val} // 创建一个新的节点// 如果链表为空if l.Head == nil {l.Head = newNode     // 新节点作为头节点l.Tail = newNode     // 也是尾节点l.Tail.Next = l.Head // 形成循环return}// 在头部插入节点if atHead {newNode.Next = l.Head // 新节点的下一个节点是原来的头节点l.Head = newNode      // 新节点成为新的头节点l.Tail.Next = l.Head  // 更新尾节点的下一个节点为新的头节点} else {// 在尾部插入节点操作l.Tail.Next = newNode // 当前尾节点的下一个节点是新节点l.Tail = newNode      // 新节点成为新的尾节点l.Tail.Next = l.Head  // 是链表保持循环}
}// InsertAtHead 在头部插入节点操作
func (l *CircularLinkList) InsertAtHead(val int) {l.insertNode(val, true) // 调用通用的插入方法,在头部插入
}// InsertAtTail 在尾部插入节点操作
func (l *CircularLinkList) InsertAtTail(val int) {l.insertNode(val, false) // 调用通用的插入方法,在尾部插入
}// InsertAtRandomPosition 在随机位置插入节点
func (l *CircularLinkList) InsertAtRandomPosition(pos int, val int) {if pos <= 0 || l.Head == nil { // 如果位置无效和链表为空l.insertNode(val, true) // 直接插入到头部return}// 计算链表的长度length := 1 // 初始长度为1,因为至少有一个头节点current := l.Headfor current.Next != l.Head {length++               // 增加长度计数current = current.Next // 移动到下一个节点}if pos >= length { // 如果位置超过链表长度l.insertNode(pos, false) // 插入尾部return}current = l.Headfor i := 0; i < pos-1; i++ {current = current.Next // 移动到指定位置的前一个节点}newNode := &CircularListNode{Val: val} // 创建新节点newNode.Next = current.Next            // 新节点的下一个节点是当前节点的下一个节点current.Next = newNode                 // 当前节点的下一个节点指向新节点}
func (l *CircularLinkList) DeleteAtPosition(pos int) {if l.Head == nil || pos < 0 { // 如果链表为空或位置无效,直接返回return}// 如果删除的是头节点if pos == 0 {if l.Head == l.Tail { // 如果只有一个头节点,就直接把头节点和尾节点置空l.Head = nill.Tail = nil} else {l.Head = l.Head.Next // 头节点移到下一个节点l.Tail.Next = l.Head // 更新尾节点的下一个节点为新的头节点}return}current := l.Headfor i := 0; current.Next != l.Head && i < pos-1; i++ { // 移动到要删除的节点的前一个节点current = current.Next}if current.Next == l.Head { // 如果到达了链表的末尾,返回return}// 删除节点toDelete := current.Nextcurrent.Next = toDelete.Next // 将当前节点的下一个节点指向删除节点的下一个节点if toDelete.Next == l.Tail { // 如果删除节点是尾节点l.Tail = current // 更新尾节点}}// 打印循环单链表的操作
func (l *CircularLinkList) PrintList() {if l.Head == nil { // 如果链表为空return}current := l.Headfor {fmt.Println(current.Val) // 打印当前节点的值current = current.Next   // 移动到下一个节点if current == l.Head {   // 如果回到头头节点,循环结束break}}
}func main() {circularList := NewCircularLinkList()circularList.InsertAtHead(1)circularList.InsertAtTail(2)circularList.InsertAtHead(3)circularList.InsertAtTail(4)circularList.InsertAtRandomPosition(2, 5)circularList.PrintList()circularList.DeleteAtPosition(2)fmt.Println("删除后")circularList.PrintList()}

关键点解析

  • 节点结构体CircularListNode定义了每个节点的结构,包含一个值和一个指向下一个节点的指针。
  • 链表结构体CircularLinkList使用头指针和尾指针来管理整个链表,确保了操作的效率。
  • 插入操作:通过insertNode方法,我们可以灵活地在链表的头部或尾部插入新节点。InsertAtHeadInsertAtTail方法简化了这个过程。
  • 随机位置插入InsertAtRandomPosition方法允许我们在一个指定位置插入节点。
  • 删除操作DeleteAtPosition方法展示了如何删除指定位置的节点,并处理了特殊情况,如删除头节点或尾节点。
  • 打印链表PrintList方法用来遍历并打印整个链表。

运行和测试

main函数中,我们展示了如何创建一个循环单链表、插入节点、删除节点以及打印链表的状态:

func main() {// ... (代码)
}

总结

通过这个实现,我们了解了如何在Go中构建和操作一个循环单链表。循环单链表虽然在某些方面比普通链表复杂,但在特定应用中,它们提供的优点使其成为值得学习的数据结构。通过代码,我们还展示了Go语言在处理复杂数据结构时的简洁性和高效性。

实际应用

  • 循环调度:如操作系统中的轮转调度算法。
  • 循环缓冲区:如在视频播放或数据流中使用。
  • 游戏开发:例如无限循环的游戏地图。

相关文章:

探索Go语言中的循环单链表

简介 循环单链表是一种特殊的链表数据结构&#xff0c;它的最后一个节点指向链表的头节点&#xff0c;形成一个闭环。今天我们将探讨如何在Go语言中实现和操作这种数据结构。 为什么选择循环单链表&#xff1f; 连续访问&#xff1a;在循环单链表中&#xff0c;可以无限循环…...

[go-redis]客户端的创建与配置说明

创建redis client 使用go-redis库进行创建redis客户端比较简单&#xff0c;只需要调用redis.NewClient接口创建一个客户端 redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379",Password: "",DB: 0, })NewClient接口只接收一个参数red…...

Windows 和 Linux 系统命令行操作详解:从文件管理到进程监控

1.切换盘符与目录操作 在命令行中&#xff0c;切换盘符和目录是最常见的操作。尽管 DOS 和 Linux 在这些操作上有所不同&#xff0c;但它们都能实现相似的功能。 (1)切换盘符 ①DOS命令&#xff1a;在 DOS 中&#xff0c;切换盘符非常简单&#xff0c;使用 盘符名:&#xff…...

SpringBoot中@Import和@ImportResource和@PropertySource

1. Import Import注解是引入java类&#xff1a; 导入Configuration注解的配置类&#xff08;4.2版本之前只可以导入配置类&#xff0c;4.2版本之后也可以导入普通类&#xff09;导入ImportSelector的实现类导入ImportBeanDefinitionRegistrar的实现类 SpringBootApplication…...

etcd-v3.5release-(3)-readIndexRead

笔记1&#xff1a;读操作包括两种&#xff0c;readIndex和serilizable&#xff0c;readIndex指一致性读&#xff0c;一旦a读到了数据x&#xff0c;那么a及a以后的数据都能读到x&#xff0c;readIndex读会先确认本leader是不是有效地leader&#xff0c;如果有效则记录此刻的comm…...

Chrome 中小于 12px 文字的实现方式与应用场景详解

让 Chrome 支持小于 12px 的文字 在 Web 开发中,有时需要将文字显示为小于 12px 的尺寸,尤其是在设计精细的 UI 元素时。虽然大多数浏览器支持小于 12px 的字体大小,但 Chrome 默认情况下会通过调整文本渲染来确保文字可读性,尤其在非常小的文字尺寸下,可能会进行抗锯齿处…...

数据挖掘之数据预处理

​​​​​​​ 引言 数据挖掘是从大量数据中提取有用信息和知识的过程。在这个过程中&#xff0c;数据预处理是不可或缺的关键步骤。数据预处理旨在清理和转换数据&#xff0c;以提高数据质量&#xff0c;从而为后续的数据挖掘任务奠定坚实的基础。由于现实世界中的数据通常…...

slam学习笔记6---样例展示雅可比手推过程

背景&#xff1a;一直在使用模板、自动化求导&#xff0c;对于背后雅可比推导只剩一个基本概念&#xff0c;有必要好好梳理巩固一下。本人水平有限&#xff0c;若推导过程有误&#xff0c;欢迎评论区提出。 假设一个二维slam问题&#xff0c;使用欧式距离观测模型&#xff0c;…...

ThreadLocal 详解

ThreadLocal 详解 ThreadLocal 是 Java 提供的一种线程本地存储机制&#xff0c;用于为每个线程提供独立的变量副本&#xff0c;变量的值仅在线程内可见&#xff0c;从而实现线程隔离。这种特性在需要为每个线程维护独立状态的场景中非常有用&#xff0c;例如用户上下文、事务…...

SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测

之前和很多群友聊天发现对2016的无域和负载均衡满心期待&#xff0c;毕竟可以简单搭建而且可以不适用第三方负载均衡器&#xff0c;SQL自己可以负载了。windows2016已经可以下载使用了&#xff0c;那么这回终于可以揭开令人憧憬向往的AlwaysOn2016 负载均衡集群的神秘面纱了。 …...

Unity 基于Collider 组件在3D 物体表面放置3D 物体

实现 从鼠标点击的屏幕位置发送射线&#xff0c;以射线监测点击到的物体&#xff0c;根据点击物体的法线向量调整放置物体的位置及朝向。 Ray ray Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 100)) {obj.transform.…...

项目搭建:springboot,mybatis, maven

创建一个基于Spring Boot、MyBatis和Maven的项目可以简化很多配置&#xff0c;因为Spring Boot自带了很多自动配置的功能。下面我将给出一个简单的示例来展示如何搭建这样一个项目。 ### 1. 创建一个新的Spring Boot项目 你可以通过Spring Initializr&#xff08;https://sta…...

网页端五子棋对战(四)---玩家匹配实现上线下线处理

文章目录 1.游戏大厅用户匹配1.1请求和响应1.2设计匹配页面1.3获取玩家信息1.4玩家信息的样式设置1.5初始化我们的websocket1.6点击按钮和客户端交互1.7点击按钮和服务器端交互 2.服务器端实现匹配功能框架2.1方法重写2.2借用session 3.处理上线下线3.1什么是上线下线3.2实现用…...

Linux笔记---进程:进程替换

1. 进程替换的概念 进程替换是指在一个正在运行的进程中&#xff0c;用一个新的程序替换当前进程的代码和数据&#xff0c;使得进程开始执行新的程序&#xff0c;而不是原来的程序。 这种技术通常用于在不创建新进程的情况下&#xff0c;改变进程的行为。 我们之前谈到过for…...

【AI日记】24.12.04 kaggle 比赛 Titanic-7

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容&#xff1a; 学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster学习机器学习基础&#xff08;pandas&#xff0c;numpy&#xff0c;sklearn&#xff0c;seaborn&#xff0c;matplotl…...

使用 Flutter 进行移动应用开发:深入探索

文章目录 前言一、介绍二、安装 Flutter 环境三、Flutter 应用结构与基础组件四、状态管理策略五、高级主题结语 前言 随着移动技术的迅猛发展&#xff0c;跨平台开发的需求日益增长。开发者们一直在寻找一种既能保证应用性能又能减少开发成本和时间的技术方案。Flutter 应运而…...

SQLServer 服务器只接受 TLS1.0,但是客户端给的是 TLS1.2

Caused by: javax.net.ssl.SSLHandshakeException: the server selected protocol version TLS10 is not accepted by client preferences [TLS12] 原因描述&#xff1a;SQLServer 服务器只接受 TLS1.0&#xff0c;但是客户端给的是 TLS1.2 解决方法如下&#xff1a; 打开文件…...

Linux命令行解释器的模拟实现

欢迎拜访&#xff1a;羑悻的小杀马特.-CSDN博客 本篇主题&#xff1a;Linux命令行解释器 制作日期&#xff1a;2024.12.04 隶属专栏&#xff1a;linux之旅 本篇简介&#xff1a; 主线带你用ubuntu版系统步步分析实现基础版本的shell&#xff1b;比如支持重定向操作&#xff0…...

模块化设计割草机器人系统研究与实现(系统架构师论文)

摘要&#xff1a; 割草机器人项目旨在实现自主草坪修剪&#xff0c;以提高园艺工作的效率。本文以具体项目为背景&#xff0c;介绍系统架构师在项目开发过程中的架构设计策略、关键技术应用、问题解决方案和优化措施。首先&#xff0c;本文分析割草机器人项目的总体架构需求&a…...

javascript(前端)作为客户端端通过grpc与cpp(服务端)交互

参考文章 https://blog.csdn.net/pathfinder1987/article/details/129188540 https://blog.csdn.net/qq_45634989/article/details/128151766 前言 临时让我写前端, 一些配置不太懂, 可能文章有多余的步骤但是好歹能跑起来吧 你需要提前准备 公司有自带的这些, 但是版本大都…...

股市复盘笔记

复盘是股市投资中非常重要的一个环节&#xff0c;它指的是投资者在股市收盘后&#xff0c;对当天的市场走势、个股表现以及自己的交易行为进行回顾和总结&#xff0c;以便更好地指导未来的投资决策。以下是对复盘的详细解释&#xff1a; 一、复盘的目的 总结市场走势&#xff…...

【SARL】单智能体强化学习(Single-Agent Reinforcement Learning)《纲要》

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…...

Linux 权限管理:用户分类、权限解读与常见问题剖析

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 目录 &#x1f4af;L…...

Windows通过指令查看已安装的驱动

Windows通过指令查看已安装的驱动 在 Windows 操作系统中&#xff0c;有几种命令可以用来查看已安装的驱动程序。以下是常见的几种方法&#xff1a; 1. 使用 pnputil 查看已安装驱动程序 pnputil 是一个 Windows 内置工具&#xff0c;可以列出所有已安装的驱动程序包。 命令…...

Springboot(五十一)SpringBoot3整合Sentinel-nacos持久化策略

上文中我记录了在Springboot项目中链接sentinel-dashboard使用限流规则的全过程。 但是呢,有一个小小的问题,我重启了一下我本地的sentinel-dashboard服务,然后,我之前创建的所有的流控规则都没了…… 这……好像有点不合理啊,咱就不能找地儿存储一下?你这一重启就没了,…...

Scala的正则表达式

package hfdobject Test35_3 {def main(args: Array[String]): Unit {println("a\tb")//定义一个规则 正则表达式//1. .表示除了换行之外的其他的任意单个字符//2. \d等于[0-9] 匹配一个数字//3. \D除了\d之外的其他的任意字符&#xff0c;表示非数字//4. \w等价于[…...

cuda12.1版本的pytorch环境安装记录,并添加到jupyter和pycharm中

文章目录 前置准备使用anaconda prompt创建虚拟环境创建虚拟环境激活pytorch虚拟环境把pytorch下载到本地使用pip把安装包安装到pytorch环境中进入python环境检验是否安装成功将环境添加到jupyter在pycharm中使用该环境&#xff1a; 前置准备 安装anaconda&#xff0c;我的版本…...

牛客linux

1、 统计文件的行数 # 方法 1 wc -l ./nowcoder.txt | awk {print $1} # 方法 2 &#xff0c;awk 可以打印所有行的行号, 或者只打印最后一行 awk {print NR} ./nowcoder.txt |tail -n 1 awk END{print NR} ./nowcoder.txt # 方法 3 grep -c 、-n等等 grep -c "" ./…...

通过HTML Canvas 在图片上绘制文字

目录 前言 一、HTML Canvas 简介 二、准备工作 三、绘制图片 四、绘制文字 五、完整代码 效果演示&#xff1a; 前言 HTML canvas 为我们提供了无限的创意可能性。今天&#xff0c;我们就来探索一下如何通过 HTML canvas 将图片和文字绘制到图片上&#xff0c;创造出独特…...

【C#】ListBox中找到多个image中的其中一个并重置赋值以便清理占用内存

1.ListBox中定义多个image 定义ListBox前台代码及Image控件的赋值 <ListBox Background"{DynamicResource BackgroundBrush}" ItemsSource"{Binding ElementNameDRFinish,PathImages}" Style"{x:Null}" Name"ImageList"ItemConta…...

Apache Commons工具类库使用整理

文章目录 Apache Commons工具类库分类- commons-lang3字符串工具&#xff1a;StringUtils日期工具&#xff1a;DateUtils数值工具&#xff1a;NumberUtils对象工具&#xff1a;ObjectUtils数组工具&#xff1a;ArrayUtils异常工具&#xff1a;ExceptionUtils枚举工具&#xff1…...

npm 设置镜像

要在npm中设置镜像&#xff0c;你可以使用npm config命令。以下是设置npm镜像的步骤&#xff1a; 临时使用淘宝镜像&#xff1a; npm --registry https://registry.npmmirror.com install package-name 永久设置镜像&#xff1a; npm config set registry https://registry…...

数据结构自测5

第6章 树和二叉树 自测卷解答 一、下面是有关二叉树的叙述&#xff0c;请判断正误&#xff08;每小题1分&#xff0c;共10分&#xff09; &#xff08; √ &#xff09;1. 若二叉树用二叉链表作存贮结构&#xff0c;则在n个结点的二叉树链表中只有n—1个非空指针域。 &#xff…...

【后端面试总结】缓存策略选择

一般来说我们常见的缓存策略有三种&#xff0c;他们各自的优劣势和实现逻辑分别如下 Cache Aside&#xff08;旁路缓存&#xff09; 特点&#xff1a; 灵活性高&#xff1a;应用程序直接与缓存和数据库交互&#xff0c;具有高度的灵活性&#xff0c;可以根据业务需求自定义缓…...

40分钟学 Go 语言高并发:RPC服务开发实战

RPC服务开发实战 一、RPC服务基础概览 开发阶段关键点重要程度考虑因素接口设计API定义、协议选择、版本控制⭐⭐⭐⭐⭐可扩展性、兼容性服务实现业务逻辑、并发处理、资源管理⭐⭐⭐⭐⭐性能、可靠性错误处理异常捕获、错误码、故障恢复⭐⭐⭐⭐稳定性、可维护性性能测试负载…...

Linux 无界面模式下使用 selenium

文章目录 前言什么是无界面模式&#xff1f;具体步骤安装谷歌浏览器查看安装的谷歌浏览器的版本下载对应版本驱动并安装Python 测试代码 总结个人简介 前言 在 Linux 服务器上运行自动化测试或网页爬虫时&#xff0c;常常需要使用 Selenium 来驱动浏览器进行操作。然而&#x…...

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时&#xff0c;同时使用两个指针&#xff08;变量&#xff0c;常用来指向数组、链表等数据结构中的元素位置&am…...

学习如何解决“区间划分”问题(一般方法论+实例应用讲解)

文章目录 解决“区间划分”问题的一般方法论方法论&#xff1a;解决区间划分问题的四步法1. 问题分析与建模2. 动态规划状态的定义3. 状态转移方程4. 初始条件与边界 方法论应用&#xff1a;最小和最大石子合并得分问题描述步骤 1&#xff1a;问题分析与建模步骤 2&#xff1a;…...

消息中间件-Kafka2-3.9.0源码构建

消息中间件-Kafka2-3.9.0源码构建 1、软件环境 JDK Version 1.8Scala Version 2.12.0Kafka-3.9.0 源码包 下载地址&#xff1a;https://downloads.apache.org/kafka/3.9.0/kafka-3.9.0-src.tgzGradle Version > 8.8Apache Zookeeper 3.7.0 2、源码编译 打开源码根目录修改…...

达梦归档文件名与实例对应关系

默认的&#xff0c;达梦归档文件名比较难以看懂&#xff0c;且多实例下不好区分 靠它就行 select upper(to_char((select DB_MAGIC), xxxxxxxxxx)) mag_id; 这样就对上号了。...

STL算法之sort

STL所提供的各式各样算法中&#xff0c;sort()是最复杂最庞大的一个。这个算法接受两个RandomAccessIterators(随机存取迭代器)&#xff0c;然后将区间内的所有元素以渐增方式由小到大重新排列。还有一个版本则是允许用户指定一个仿函数代替operator<作为排序标准。STL的所有…...

elementui table滚动分页加载

文章目录 概要 简化的实现示例&#xff1a; 小结 概要 在使用 Element UI 的 Table 组件时&#xff0c;如果需要实现滚动分页加载的功能&#xff0c;可以通过监听 Table 的滚动事件来动态加载更多数据。 简化的实现示例&#xff1a; <template><el-table ref"…...

【MySQL 进阶之路】索引的使用

5.索引的使用规则 在数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;索引是提高查询效率的关键机制之一。MySQL索引优化是指通过设计、调整和选择合适的索引策略&#xff0c;以提高数据库的查询性能和降低资源消耗。以下是一些关键的索引使用规则&#xff1a; 1. …...

FPGA中所有tile介绍

FPGA中包含的tile类型&#xff0c;以xinlinx 7k为例&#xff0c;可以通过f4pga项目中的原语文件夹查看&#xff0c;主要包含以下这些&#xff1a; 以下是您提到的 Xilinx 7 系列 FPGA 中各种模块的含义及用途&#xff1a; 1. BRAM (Block RAM) BRAM 是 FPGA 中的块存储资源&…...

理解 Python PIL库中的 convert(‘RGB‘) 方法:为何及如何将图像转换为RGB模式

理解 Python PIL库中的 convert(RGB) 方法&#xff1a;为何及如何将图像转换为RGB模式 在图像处理中&#xff0c;保持图像数据的一致性和可操作性是至关重要的。Python的Pillow库&#xff08;继承自PIL, Python Imaging Library&#xff09;提供了强大的工具和方法来处理图像&…...

LVS默认的工作模式支持哪些负载均衡算法?

LVS默认的工作模式支持哪些负载均衡算法? LVS&#xff08;Linux Virtual Server&#xff09;默认支持多种负载均衡算法&#xff0c;这些算法在不同的场景下具有各自的优势。以下是 LVS 默认支持的负载均衡算法及其特点&#xff1a; 1. 轮询调度&#xff08;Round Robin Sched…...

C/C++中的调用约定

在C/C编程中&#xff0c;调用约定(calling conventions)是一组指定如何调用函数的规则。主要在你调用代码之外的函数(例如OS API&#xff0c;操作系统应用程序接口)或OS调用你(如WinMain的情况)时起作用。如果编译器不知道正确的调用约定&#xff0c;那么你很可能会遇到非常奇怪…...

RAG评估指南:从检索到生成,全面解析LLM性能评估方法

前言 这一节我们将从时间线出发对RAG的评估方式进行对比&#xff0c;这些评估方式不仅限于RAG流程之中&#xff0c;其中基于LLM的评估方式更加适用于各行各业。 RAG常用评估方式 上一节我们讲了如何用ROUGE 这个方法评估摘要的相似度&#xff0c;由于篇幅限制&#xff0c;没…...

极兔速递开放平台快递物流查询API对接流程

目录 极兔速递开放平台快递物流查询API对接流程API简介物流查询API 对接流程1. 注册用户2. 申请成为开发者3. 企业认证4. 联调测试5. 发布上线 签名机制详解1. 提交方式2. 签名规则3. 字段类型与解析约定 物流轨迹服务极兔快递单号查询的其他方案总结 极兔速递开放平台快递物流…...

FFmpeg:强大的音视频处理工具指南

FFmpeg&#xff1a;强大的音视频处理工具指南 1. FFmpeg简介2. 核心特性2.1 基础功能2.2 支持的格式和编解码器 3. 主要组件3.1 命令行工具3.2 开发库 4. 最新发展5. 安装指南5.1 Windows系统安装5.1.1 直接下载可执行文件5.1.2 使用包管理器安装 5.2 Linux系统安装5.2.1 Ubunt…...