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

数据结构与算法-图论-拓扑排序

前置芝士

概念

拓扑排序(Topological Sorting)是对有向无环图(DAG,Directed Acyclic Graph)的顶点进行排序的一种算法。它将图中的所有顶点排成一个线性序列,使得对于图中的任意一条有向边 (u, v),顶点 u 在序列中都出现在顶点 v 之前。也就是说,拓扑排序的结果反映了图中顶点之间的先后依赖关系。

需要注意的是,只有有向无环图才有拓扑排序,因为如果图中存在环,就无法满足先后顺序的要求。

算法流程

Kahn 算法(基于入度的算法)

-1统计入度:遍历图中的所有边,统计每个顶点的入度(即指向该顶点的边的数量)。

-2初始化队列:将所有入度为 0 的顶点加入一个队列中。

-3拓扑排序过程

-从队列中取出一个顶点,并将其加入拓扑排序的结果序列中。

-对于该顶点的所有邻接顶点,将它们的入度减 1。

-如果某个邻接顶点的入度变为 0,则将其加入队列。

-4检查结果:重复步骤 3,直到队列为空。如果最终拓扑排序结果序列中的顶点数量等于图中的顶点数量,则说明图是有向无环图,得到的序列就是拓扑排序结果;否则,图中存在环,不存在拓扑排序。

具体的 C++ 算法

#include <iostream>

#include <vector>

#include <queue>

using namespace std;

// 拓扑排序函数

vector<int> topologicalSort(int n, vector<vector<int>>& graph) {

    // 存储每个顶点的入度

    vector<int> inDegree(n, 0);

    // 存储拓扑排序的结果

    vector<int> result;

    // 队列用于存储入度为 0 的顶点

    queue<int> q;

    // 统计每个顶点的入度

    for (int i = 0; i < n; ++i) {

        for (int neighbor : graph[i]) {

            ++inDegree[neighbor];

        }

    }

    // 将所有入度为 0 的顶点加入队列

    for (int i = 0; i < n; ++i) {

        if (inDegree[i] == 0) {

            q.push(i);

        }

    }

    // 拓扑排序过程

    while (!q.empty()) {

        int u = q.front();

        q.pop();

        result.push_back(u);

        // 遍历该顶点的所有邻接顶点

        for (int v : graph[u]) {

            --inDegree[v];

            if (inDegree[v] == 0) {

                q.push(v);

            }

        }

    } 

    // 如果拓扑排序结果的长度不等于顶点数量,说明图中存在环

    if (result.size() != n) {

        return {}; // 返回空向量表示不存在拓扑排序

   }

return result;

}

int main() {

    int n = 6; // 顶点数量

    vector<vector<int>> graph(n);

    // 添加有向边

    graph[5].push_back(2);

    graph[5].push_back(0);

    graph[4].push_back(0);

    graph[4].push_back(1);

    graph[2].push_back(3);

    graph[3].push_back(1);

    vector<int> result = topologicalSort(n, graph);

    if (result.empty()) {

        cout << "图中存在环,不存在拓扑排序。" << endl;

    } else {

        cout << "拓扑排序结果:";

        for (int vertex : result) {

            cout << vertex << " ";

        }

        cout << endl;

    }

return 0;

}

应用场景

任务调度:在项目管理中,任务之间可能存在先后依赖关系。可以将任务看作图的顶点,任务之间的依赖关系看作有向边,通过拓扑排序可以确定任务的执行顺序,确保在执行某个任务之前,其所有前置任务都已经完成。

课程安排:在学校的课程体系中,某些课程可能需要先修其他课程。可以将课程看作顶点,先修关系看作有向边,使用拓扑排序可以得到一个合理的课程学习顺序。

编译顺序:在软件开发中,源文件之间可能存在依赖关系。通过拓扑排序可以确定源文件的编译顺序,确保在编译某个文件之前,其所有依赖的文件都已经编译完成。

数据流分析:在计算机科学中,数据流图可以表示数据在系统中的流动和处理过程。拓扑排序可以用于确定数据处理的顺序,确保数据在被处理之前已经被正确生成。

练习题:

家谱图:

标准的板子题:

代码:

#include<bits/stdc++.h>

using namespace std;

unordered_map<int,vector<int>>e;

const int N=110;

queue <int> Q;

int in[N];

int n;

void toposort() {

for(int i = 1; i <= n; i++) {

if(in[i] == 0) {

printf("%d ", i);

Q.push(i);

}

}

while(Q.size()) {

int u = Q.front(); Q.pop();

for(int v:e[u]) {

in[v]--;

if(in[v] == 0) {

printf("%d ", v);

Q.push(v);

}

}

}

}

int main(){

    cin>>n;

    for(int i=1;i<=n;i++){

        int tmp=0;

        while(cin>>tmp,tmp!=0){

            e[i].push_back(tmp);

            in[tmp]++;

        }

    }

    toposort();

    

}

奖金

分析:

差分约束的简化版,这里使用拓普排序,如果u->v,那么f[v]=max(f[v],f[u]+1);

为什么是max?因为还有其他的u1连接到了v,万一u1的值更大,那么v就要满足>u1

所以要求的是满足一系列v>u,u1,u2....的v的最小值

至于如果把100搞定,当然可以直接把初值设置为100或者答案最后加100就好了

同时归纳下:

如果边权无限制,只有使用差分约束了

如果边权非负,那就可以使用tarjan算法

如果边权为正数,就可以使用拓扑排序来做了!

代码

可达性统计:

分析:


求拓扑序,然后倒序求出f[i],这里的f[i]表示i之后可达的点的集合

f[i]=所以i的子节点能到的点的并集,这里的集合我们用string来模拟01001的二进制串来表示

代码:

#include<bits/stdc++.h>

using namespace std;

// 定义常量 N 作为最大顶点数

const int N = 30010;

// n 表示图的顶点数量,m 表示图的边数量

int n, m;

// in 数组用于记录每个顶点的入度,入度即指向该顶点的边的数量

int in[N];

// q 数组作为队列使用,用于拓扑排序过程中存储入度为 0 的顶点

int q[N];

// h 是队列的头指针,初始化为 0;t 是队列的尾指针,初始化为 -1

int h = 0, t = -1;

// f 数组是一个 bitset 数组,f[i] 表示从顶点 i 出发能够到达的所有顶点的集合// bitset 是一种高效存储二进制位的数据结构,这里用它可以方便地进行位运算

bitset<N> f[N];

// e 是一个无序映射,用于存储图的邻接表// e[u] 存储的是从顶点 u 出发的所有边指向的顶点

unordered_map<int, vector<int>> e;

// 拓扑排序函数,用于对有向图进行拓扑排序

bool toposort() {

    // 遍历所有顶点,将入度为 0 的顶点加入队列

    for (int i = 1; i <= n; i++) {

        if (!in[i]) {

            // 入度为 0 的顶点入队,尾指针后移

            q[++t] = i;

        }

    }

    // 当队列不为空时,持续进行处理

    while (h <= t) {

        // 取出队头元素

        int u = q[h++];

        // 遍历从顶点 u 出发的所有边指向的顶点

        for (int v : e[u]) {

            // 将顶点 v 的入度减 1,表示移除从 u 到 v 的边

            --in[v];

            // 如果顶点 v 的入度变为 0,将其加入队列

            if (!in[v]) {

                q[++t] = v;

            }

        }

    }

    // 这里原代码直接返回 1,存在问题,正确应该判断是否拓扑排序成功

    // 若拓扑排序成功,队列中应该存储了所有顶点,即 t == n - 1

return t == n - 1;

}

int main() {

    // 读取图的顶点数量 n 和边的数量 m

    scanf("%d%d", &n, &m);

    // 循环读取每条边的信息

    for (int i = 0; i < m; i++) {

        int u, v;

        // 读取边的起点 u 和终点 v

        scanf("%d%d", &u, &v);

        // 将终点 v 添加到起点 u 的邻接表中

        e[u].push_back(v);

        // 终点 v 的入度加 1

        in[v]++;

    }

    // 调用拓扑排序函数

    if (!toposort()) {

        // 如果拓扑排序失败,说明图中存在环,输出错误信息并退出程序

        cerr << "图中存在环,无法进行可达性统计。" << endl;

        return 1;

    }

    // 按照拓扑排序结果的逆序遍历顶点

    for (int i = n - 1; i >= 0; i--) {

        // 取出当前处理的顶点

        int u = q[i];

        // 顶点 u 能到达自身,将 f[u] 的第 u 位设为 1

        f[u][u] = 1;

        // 遍历从顶点 u 出发的所有边指向的顶点

        for (int v : e[u]) {

            // 通过位运算将 f[v] 能到达的顶点合并到 f[u] 中

            f[u] |= f[v];

        }

    }

    // 遍历所有顶点,输出每个顶点能到达的顶点数量

    for (int i = 1; i <= n; i++) {

        // count() 方法返回 bitset 中 1 的个数,即能到达的顶点数量

        cout << f[i].count() << endl;

    }

return 0;

}

车站分级:

分析

这道题可以通过建立有向图并进行拓扑排序来求解火车站最少的级别数,以下是具体思路:

建立有向图思路

顶点含义:将每个火车站看作图中的一个顶点,编号为 1 到 n ,对应图中的 n 个顶点。

边的构建:对于每一趟车次,设其停靠站为 si1​,si2​,⋯,sisi​​(按编号从小到大排列)。对于这趟车次的任意两个停靠站 sij​ 和 sik​(j<k),在图中添加有向边 (sij​,sik​)。这是因为根据题目条件,如果一趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠,添加边表示了这种级别上的 “约束” 关系。更通俗地理解,就是停靠靠前的车站可以 “指向” 停靠靠后的车站,意味着靠前车站的级别小于等于靠后车站的级别。

边的隐含意义:有向边 (u,v) 表示火车站 u 的级别小于等于火车站 v 的级别。通过这样构建有向图,就将车次运行情况转化为了图中顶点之间的关系。

拓扑排序思路

入度统计:在构建好有向图后,统计每个顶点(即每个火车站)的入度,入度表示有多少条边指向该顶点。

初始处理:把所有入度为 0 的顶点(即没有其他顶点的级别小于它的火车站)加入队列。这些顶点可以看作是最低级别的候选者。

拓扑排序过程:

从队列中取出一个顶点,这个顶点代表的火车站可以被划分为一个级别。

对于该顶点的所有邻接顶点(即由该顶点出发的边指向的顶点),将它们的入度减 1。这是因为已经处理了当前顶点,与它相关的 “约束” 减少了。

如果某个邻接顶点的入度变为 0,则将其加入队列。这表示在处理完当前级别后,这个顶点所代表的火车站也可以被确定为一个新的级别(在当前已处理的级别基础上)。

结果确定:重复上述步骤,直到队列为空。每一轮从队列中取出顶点并处理的过程,相当于确定了一个新的级别。最终统计处理的轮数,这个轮数就是 n 个火车站最少划分的级别数 。因为拓扑排序的特性保证了在处理过程中,先处理的顶点级别不高于后处理的顶点级别,通过这种方式能得到满足车次运行要求的最少级别划分。

建立边的及技巧

9 2

4 1 3 5 6

这里的1->3->5->6,可以如下优化

代码:

#include <bits/stdc++.h>

using namespace std;

const int N=2010;

unordered_map<int,vector<pair<int,int>>>e;

int n,m;

int in[N];

bool st[N];

int q[N];

int dis[N]={0};

int h=0,t=-1;

void toposort(){

    for(int i=1;i<=n;i++)

        if(!in[i])q[++t]=i;

    while(h<=t){

        int u=q[h++];

        for(auto ww:e[u]){

            int v=ww.first;

            if(--in[v]==0){

                q[++t]=v;

            }

        }

    }

}int main(){

    cin>>n>>m;

    for(int i=1;i<=m;i++){

        memset(st,0,sizeof st);

        int cnt;

        cin>>cnt;

        int start=n,end=1;

        for(int j=0;j<cnt;j++){

            int stp;

            scanf("%d",&stp);

            start=min(start,stp);

            end=max(end,stp);

            st[stp]=1;

        }

        int v=i+n;

        for(int i=start;i<=end;i++){

            if(st[i]){

                e[i].push_back({v,0});

                in[v]++;

            }

            else {

                e[v].push_back({i,1});

                in[i]++;

            }

        }

    }

    toposort();

    for(int i=1;i<=n;i++)dis[i]=1;

    for(int i=0;i<n+m;i++){

        int u=q[i];

        for(auto ww:e[u]){

            int v=ww.first,w=ww.second;

            dis[v]=max(dis[v],dis[u]+w);

        }

    }

    int res=0;

    for(int i=1;i<=n;i++)res=max(res,dis[i]);

    cout<<res;

}

相关文章:

数据结构与算法-图论-拓扑排序

前置芝士 概念 拓扑排序&#xff08;Topological Sorting&#xff09;是对有向无环图&#xff08;DAG&#xff0c;Directed Acyclic Graph&#xff09;的顶点进行排序的一种算法。它将图中的所有顶点排成一个线性序列&#xff0c;使得对于图中的任意一条有向边 (u, v)&#x…...

RabbitMQ的高级特性介绍(一)

消息确认机制 ⽣产者发送消息之后, 到达消费端之后, 可能会有以下情况: a. 消息处理成功 b. 消息处理异常 RabbitMQ向消费者发送消息之后, 就会把这条消息删掉, 那么第二种情况, 就会造成消息丢失。 那么如何确保消费端已经成功接收了, 并正确处理了呢? 为了保证消息从队列…...

嵌入式硬件篇---WIFI模块

文章目录 前言一、核心工作原理1. 物理层&#xff08;PHY&#xff09;工作频段2.4GHz5GHz 调制技术直接序列扩频正交频分复用高效数据编码 2. 协议栈架构MAC层Beacon帧4次握手 3. 核心工作模式 二、典型应用场景1. 智能家居系统远程控制环境监测视频监测 2. 工业物联网设备远程…...

Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取。本地部署方式

开源地址&#xff1a;https://github.com/mendableai/firecrawl 01、FireCrawl 项目简介 Firecrawl 是一款开源、优秀、尖端的 AI 爬虫工具&#xff0c;专门从事 Web 数据提取&#xff0c;并将其转换为 Markdown 格式或者其他结构化数据。 Firecrawl 还特别上线了一个新的功…...

zabbix数据库溯源

0x00 背景 zabbix数据库如果密码泄露被登录并新增管理员如何快速发现&#xff1f;并进行溯源&#xff1f; 本文介绍数据库本身未开启access log的情况。 0x01 实践 Mysql 数据库查insert SELECT * FROM sys.host_summary_by_statement_type where statement like %insert% 查…...

oracle 索引

Oracle 数据库中的索引是优化查询性能的重要工具&#xff0c;其类型多样&#xff0c;适用于不同场景。以下是 Oracle 索引的主要分类及特点&#xff1a; 1.B-Tree 索引&#xff08;平衡树索引&#xff09; 特点&#xff1a; 默认索引类型&#xff0c;树形结构&#xff08;根、…...

ZooKeeper集群高可用性测试与实践:从规划到故障模拟

#作者&#xff1a;任少近 文章目录 ZooKeeper集群环境规划1.集群数据一致性测试2.集群节点故障测试 ZooKeeper集群高可用性测试的主要目的是确保在分布式环境中&#xff0c;ZooKeeper服务能够持续提供一致性和高可用性的协调服务。 ZooKeeper集群环境规划 节点ipZooKeeper版本…...

RocketMQ 架构

一、RocketMQ 核心架构概述 ​1. 主要组件 ​Name Server&#xff1a; 集群的「中枢神经」&#xff0c;负责 Topic 元数据管理&#xff08;如 Topic 分区分布、Broker 节点状态监控&#xff09;。 ​Broker&#xff1a; 消息存储与流转的核心节点&#xff0c;负责消息的持久化…...

Microchip AN1477中关于LLC数字补偿器的疑问

最近在学习Microchip的AN1477关于LLC的功率级传递函数推导及数字补偿器设计&#xff0c;对其中的2P2Z数字补偿器的系数有一些困惑。我在MATLAB中运行了源程序提供的VMC_LLC.m文件&#xff0c;发现有些地方和AN1477中的结果不一致。现在把相关有疑问的地方列举出来&#xff0c;也…...

力扣热题100(方便自己复习,自用)

力扣热题100 1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 查找两数之和是不是等于target也就是我们找到一个数之后&#xff0c;用target将其减掉&#xff0c;再寻找应当对应的元素是什么每找到一个数&#xff0c;我们就将其放在集合中&#xff0c;因为集合中可以去重…...

视频翻译器免费哪个好?轻松玩转视频直播翻译

你是不是觉得看外语视频很麻烦&#xff1f;每次遇到喜欢的外语电影、电视剧或动漫&#xff0c;总是要等字幕组的翻译&#xff0c;或者因为语言不通而错过精彩的情节。 这个时候&#xff0c;掌握多语种直播翻译方案就显得尤为重要&#xff0c;有了实时字幕&#xff0c;看外语视…...

深度学习中的“刹车”:正则化如何防止模型“超速”

深度学习中的“刹车”&#xff1a;正则化如何防止模型“超速” 大家好&#xff01;今天我们来聊聊深度学习中的一个重要概念——正则化。 什么是过拟合&#xff1f; 想象一下&#xff0c;你正在教一个孩子认字。你给他看很多猫的图片&#xff0c;他都能正确识别。但是&#…...

【pytest框架源码分析五】pytest插件的注册流程

前文介绍到pytest整体是运用插件来实现其运行流程的。这里仔细介绍下具体过程。 首先进入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…...

【协作开发】低成本一键复刻github的gitea

在阅读 next-public 时&#xff0c;反思原本的需求&#xff0c;是否本未倒置&#xff0c;故而重新调研当下开源现状。发现 gitea 完全满足商业软件的开发要求&#xff0c;并且价格足够低&#xff0c;使用足够方便&#xff0c;其他同类软件完全不用看了&#xff0c;真是世界级的…...

虚拟机 | Ubuntu操作系统:su和sudo理解及如何处理忘记root密码

系列文章目录 虚拟机 | Ubuntu 安装流程以及界面太小问题解决 虚拟机 | Ubuntu图形化系统&#xff1a; open-vm-tools安装失败以及实现文件拖放 文章目录 系列文章目录前言一、su和sudo是什么&#xff1f;1、su忘记root密码的解决方案无法进入GRUB引导页面 2、sudo推荐使用sud…...

token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)

思路&#xff1a; 首先&#xff0c;用户的需求是确保使用同一个Token的外部调用都在一个Session中处理。 需要考虑Token与Session绑定、安全措施、Session管理、分布式处理等。 使用Redis作为Session存储&#xff0c; 在Java中 通过Spring Data Redis或Lettuce库实现。 2.生成…...

Flink 通过 Chunjun Oracle LogMiner 实时读取 Oracle 变更日志并写入 Doris 的方案

文章目录 一、 技术背景二、 关键技术1、 Oracle LogMiner2、 Chunjun 的 LogMiner 关键流程3、修复 Chunjun Oracle LogMiner 问题 一、 技术背景 在大数据实时同步场景中&#xff0c;需要将 Oracle 数据库的变更数据&#xff08;CDC&#xff09; 采集并写入 Apache Doris&am…...

若依(RuoYi)框架新手使用指南

若依&#xff08;RuoYi&#xff09;框架新手使用指南 若依&#xff08;RuoYi&#xff09;是一款基于 Spring Boot Vue 的前后端分离企业级开发框架&#xff0c;集成了权限管理、代码生成、监控日志等核心功能&#xff0c;适用于快速构建中后台管理系统。以下是详细的使用指南…...

k8s-coredns-CrashLoopBackOff 工作不正常

本文作者&#xff1a; slience_me 问题描述 # 问题描述 # rootk8s-node1:/home/slienceme# kubectl get pods --all-namespaces # NAMESPACE NAME READY STATUS RESTARTS AGE # kube-flannel kube-flannel-ds-66bcs …...

【css酷炫效果】纯CSS实现粒子旋转动画

【css酷炫效果】纯CSS实现粒子旋转动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492008 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…...

SQL 通配符

SQL 通配符 在SQL查询中&#xff0c;通配符是一种非常有用的特性&#xff0c;它允许用户在查询时使用特殊字符来匹配一系列的值。本文将详细介绍SQL中的通配符及其用法&#xff0c;帮助读者更好地理解如何在SQL查询中使用通配符。 1. 什么是通配符&#xff1f; 通配符是SQL查…...

【工具】C#防沉迷进程监控工具使用手册

一、软件简介 本工具用于监控指定进程的运行时长&#xff0c;当达到预设时间时通过声音、弹窗、窗口抖动等方式进行提醒&#xff0c;帮助用户合理控制程序使用时间。 软件在上篇文章。 二、系统要求 Windows 7/10/11.NET Framework 4.5 或更高版本 三、快速入门 1. 配置文件…...

4.数据结构-树和二叉树

树和二叉树 4.1树和二叉树的定义4.1.1树的定义4.1.2树的基本术语4.1.3二叉树的定义 4.2二叉树的性质和存储结构4.2.1二叉树的性质4.2.1二叉树的存储结构顺序存储链式存储 4.3遍历二叉树和线索二叉树4.3.1遍历二叉树根据遍历序确定二叉树先序序列创建二叉链表复制二叉树计算二叉…...

【工作记录】F12查看接口信息及postman中使用

可参考 详细教程&#xff1a;如何从前端查看调用接口、传参及返回结果&#xff08;附带图片案例&#xff09;_f12查看接口及参数-CSDN博客 1、接口信息 接口基础知识2&#xff1a;http通信的组成_接口请求信息包括-CSDN博客 HTTP类型接口之请求&响应详解 - 三叔测试笔记…...

k8s搭建kube-prometheus

后续再补一个k8s集群搭建的博客&#xff0c;从0开始搭建k8s集群。使用kube-prometheus非常方便&#xff0c;主要问题只在于拉取镜像。除了拉取镜像外其他时间5分钟即可。耐心等待拉取镜像。 一.kube-prometheus简介 kube-prometheus 是一个专为 Kubernetes 设计的开源监控解决…...

Linux应用:Linux的信号

什么是信号 信号是一种软件中断&#xff0c;用于通知进程系统中发生了某种特定事件。它是操作系统与进程之间&#xff0c;以及进程与进程之间进行异步通信的一种方式。在 Linux 系统中&#xff0c;信号是一种比较简单的进程间通信机制。当一个信号产生时&#xff0c;内核会通过…...

C++特性——RAII、智能指针

RAII 就像new一个需要delete&#xff0c;fopen之后需要fclose&#xff0c;但这样会有隐形问题&#xff08;忘记释放&#xff09;。RAII即用对象把这个过程给包起来&#xff0c;对象构造的时候&#xff0c;new或者fopen&#xff0c;析构的时候delete. 为什么需要智能指针 对于…...

springboot项目,指定用alibaba连接池所需要的配置

1、依赖&#xff1a;引入相关的两个依赖 2、application.yml...

在本地跑通spark环境

官网下载spark 下载spark 解压就好 本地配置环境变量 配置环境变量&#xff08;系统环境变量&#xff09; 新增 SPARK_HOME 变量名&#xff1a;SPARK_HOME 变量值&#xff1a;F:\class\spark\Spark_env\spark-3.4.4-bin-hadoop3 配置 PATH&#xff0c;新增如下&#xff1a…...

python-56-基于Vue和Flask进行前后端分离的项目开发示例实战

文章目录 1 创建Vue前端项目1.1 运行demo1.2 实现需求2 flask部署上述dist(前后端未分离)2.1 代码app.py2.2 运行访问3 nginx部署(前后端分离)3.1 nginx前端服务3.3.1 windows安装nginx3.3.2 修改nginx.conf配置文件3.3.3 启动nginx3.3.3 停止nginx3.2 启动后端服务3.2.1 app.p…...

云盘搭建笔记

报错问题&#xff1a; No input file specified. 伪静态 location / {if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last;break;} } location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php/$1 last; break; } } 设…...

学习C2CRS Ⅳ (Conversational Recommender Model)

C2CRS_Model C2CRS_Model 是一个用于对话推荐系统(Conversational Recommender System, C2CRS)的端到端模型。该模型结合了知识图谱(KG)、上下文信息、用户表示和对话生成等多个模块,以实现高效的推荐和对话功能。它通过以下模块实现: 用户表示模块(CoarseFineDRUserMo…...

【工具】huggingface 模型下载过程

前述 记录下自己下载模型的几种方式 方式 1、网页直接浏览器下载&#xff1a; 简单&#xff0c;但是随时可能断 2、git lfs # 拉代码 GIT_LFS_SKIP_SMUDGE1 git clone https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0 # 进入目录 cd stable-diffusion-…...

空调遥控器低功耗单片机方案

RAMSUN空调遥控器采用先进的32位低功耗单片机作为核心控制器&#xff0c;通过优化软件算法和硬件设计&#xff0c;实现了空调遥控器的低功耗运行。单片机集成了多种功能模块&#xff0c;包括红外发射、按键扫描、电源管理等&#xff0c;有效降低了整体功耗。同时&#xff0c;该…...

K8S学习之基础三十五:k8s之Prometheus部署模式

Prometheus 有多种部署模式&#xff0c;适用于不同的场景和需求。以下是几种常见的部署模式&#xff1a; 1. 单节点部署 这是最简单的部署模式&#xff0c;适用于小型环境或测试环境。 特点&#xff1a; 单个 Prometheus 实例负责所有的数据采集、存储和查询。配置简单&…...

Agent toolkits集成指南

文章目录 CSV Agent的集成Pandas Dataframe Agent的集成PowerBI Dataset Agent的集成Agent toolkits的集成旨在简化并增强LLM应用中的数据处理和分析功能。CSVAgent提供了一个专门的工具,允许开发者处理CSV数据。Pandas Agent则集成了Pandas框架,赋予了开发者在应用中进行高效…...

蓝桥杯关于字符串的算法题目(leetcode回文串的判断问题)

文章目录 1.题目概述2.思路分析3.代码解析 1.题目概述 这个题目主要是需要我们找到回文串&#xff0c;这个回文实际上就是文学里面的这个修辞手法&#xff0c;在这个编程的时候&#xff1a;大概说的就是这个字符串从左向右个从右向左都是一样的这个效果&#xff0c;我们把这样…...

数据结构-----队列

顺序队列&#xff08;Queue&#xff09; 一、队列核心概念 1. 基本特性 先进先出&#xff08;FIFO&#xff09;&#xff1a;最早入队的元素最先出队操作限制&#xff1a; 队尾&#xff08;Rear&#xff09;&#xff1a;唯一允许插入的位置队头&#xff08;Front&#xff09;&…...

GitHub Copilot 在 VS Code 上的终极中文指南:从安装到高阶玩法

GitHub Copilot 在 VS Code 上的终极中文指南&#xff1a;从安装到高阶玩法 前言 GitHub Copilot 作为 AI 编程助手&#xff0c;正在彻底改变开发者的编码体验。本文将针对中文开发者&#xff0c;深度解析如何在 VS Code 中高效使用 Copilot&#xff0c;涵盖基础设置、中文优化…...

深入理解 RLP 编码与 JSON:原理、应用与比较

在区块链和数据存储领域&#xff0c;RLP&#xff08;Recursive Length Prefix&#xff09;编码和**JSON&#xff08;JavaScript Object Notation&#xff09;**是两种重要的数据编码方式。它们分别适用于不同的应用场景&#xff0c;并具有不同的优缺点。本文将系统性地分析 RLP…...

AI大白话(三):深度学习——AI的‘大脑‘是如何构建的?

🌟引言: 专栏:《AI大白话》 AI大白话(一):5分钟了解AI到底是什么? AI大白话(二):机器学习——AI是怎么“学习“的? 大家好!继前两篇介绍AI基础和机器学习的文章后,今天我们来聊聊深度学习——这个让AI技术近年来突飞猛进的"神奇引擎"。别担心,我会用…...

初识R语言饼状图

目录 基础饼图 标签个性化 边界修改 密度条纹 边框颜色 基础饼图 rm(list ls())# Create Data Prop <- c(3,7,9,1,2) # Make the default Pie Plot P1 <- pie(Prop) dev.off() 标签个性化 P2 <-pie(Prop , labels c("Gr-A","Gr-B","…...

[DeepRetrieval] 用DeepSeek-R1-Zero的思路教会模型怎么用搜索引擎找文本

前段时间很火的 DeepSeek-R1-Zero&#xff0c;通过这种方式既然能增强模型的推理能力&#xff0c;那是否可以在RAG的方面上增强文本的召回呢&#xff1f; 今天带来一篇关于这个方面工作的技术报告来分享一下。 技术报告&#xff1a; https://arxiv.org/pdf/2503.00223 原文链接…...

⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal

⭐算法OJ⭐二叉树的中序遍历【树的遍历】&#xff08;C实现&#xff09;Binary Tree Inorder Traversal ⭐算法OJ⭐二叉树的前序遍历【树的遍历】&#xff08;C实现&#xff09;Binary Tree Preorder Traversal Given the root of a binary tree, return the postorder traver…...

【LeetCode 热题100】 234. 回文链表的算法思路及python代码

234. 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true&#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&…...

Grid布局示例代码

示例一 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Grid Layout Example</title><styl…...

【K8S】ImagePullBackOff状态问题排查。

ImagePullBackOff 是在使用 Kubernetes&#xff08;K8s&#xff09;时经常遇到的一种错误状态&#xff0c;下面为你详细介绍其含义、可能的原因及解决办法。 含义 当你在 K8s 集群中创建一个 Pod 时&#xff0c;Kubelet 会尝试从指定的镜像仓库拉取所需的容器镜像。如果拉取镜…...

在 Kubernetes(k8s)部署过程中常见的问题

在 Kubernetes(k8s)部署过程中,常见的问题主要包括以下几类,以下是具体示例及简要说明: 1. 资源配额不足(Resource Quota) 现象:Pod 处于 Pending 状态,事件日志显示 Insufficient CPU/Memory。 原因: 节点(Node)资源不足,无法满足 Pod 的 requests 或 limits。 命…...

微信小程序状态管理与计算属性同时使用:miniprogram-computed 和 mobx-miniprogram

两个框架扩展提供的 ComponentWithStore 与 ComponentWithComputed 方法无法结合使用。如果需要在一个组件中既想使用 mobx-miniprogram-bindings 又想使用 miniprogram-computed解决方案是&#xff1a; 使用旧版 API 自定义组件仍然使用 Component 方法构建组件&#xff0c;将…...

Redis设置开机自启报错start-limit-hit

Redis设置开机自启报错start-limit-hit 问题&#xff1a;在银河麒麟服务器上编译安装了redis后设置systemctl开机自启报错start-limit-hit 如何解决&#xff1f; 因为开机自启的需求是后面新增的&#xff0c;所以一开始使用的是命令启动&#xff0c;使用命令启动就会直接在前台…...