Other

算法学习-图论-图的存储-最短路

题目概述及细节 单源最短路,模板,luoguP3371 单源最短路,模板 dij算法 核心是把节点分为两类,一类是以确定到起点最短的距离,一类是没有确定 初始时所有都未确定 从没有确定的节点中选取一个距离起点最短的 依据此点确定别的未更新的点的距离 首先补充题目中常见的数值: int -2^31=-21 4748 3648 到 2^31-1=21 4748 3647。共10位数字,最大整数用十六进制表示07fffffff(共32位,4位为一组) memset是对字节进行赋值,例如: int a[10]; memset(a,0x3f, sizeof(a));//实际上a数组中每个元素均为0x3f3f3f3f,sizeof返回a所占的字节数40,也就是每个字节均被赋值为0x3f,最终又以四个字节合为int ps:声明的全局变量默认初始化为0,在函数内则不为 由于0的表示为0x00,-1在计算机内用补码表示为0xff,所以两个在进行memset操作后所得结果仍为原来的,而1就不能。 而题目中说明所有w之和 < 2^31,也就是说明dis数组可以为int数组。 对于此题数据1 <= n <= 104来讲,用邻接矩阵存储需要大约100mb,可能可以,但还没尝试。(**也不行qwq**,对于大多数题目,若n>104,申请二维数组的时候就需要注意了)对另一道题1 <= n <= 10^5来说,就完全不能用邻接矩阵来存储了,故采取用链式前向星模拟邻接表的方式来存储边。 不论是用邻接矩阵还是模拟邻接表的方式,单源最短路径的要素有 visit[]:标记是否已经取得最优解 dis[]:存储起点到该点的权值 邻接矩阵解法 邻接矩阵dij //变量声明 const int MaxN = 1002;//适题目而定 int dis[MaxN]; int visit[MaxN]; int e[MaxN][MaxN];//存储边的关系, 此处读入需要注意有向图和无向图的区别,起始需要初始化相应值 int n, m, s;//点数,边数,起点 void dij(){ //变量初始化 memset(dis, 0x3f, sizeof(dis)); memset(visit, 0, sizeof(visit)); dis[s] = 0;//使起点第一个被拿出来用来更新别的边 for(int k = 0; k < n;k++){//每次确定一个点,n次循环结果必然确定 int u;//记录当前离起点最近的点 int minNum = INT_MAX;//需要包含头文件<climits>,整数的最大值 for(int i = 1; i <= n; i++){//在没有确定的点中选一个离起点最近的 if(!

EFCore启用数据库连接池

本文环境为.Net5 + ASP.Net Core Web API + EFCore 5.0.12 + MySQL 5,介绍了如何使用EFCore开启数据库连接池。 在实现了自己的DbContext之后,需要在Startup.cs的ConfigureServices方法中注册DbContext。在ASP.Net Core Web API中,每次请求对应的Controller都会创建一次DbContext对象,而普通的注册会在每次创建DbContext对象时连接一次数据库,这样会频繁的连接数据库(然后关闭),很有可能会使数据库的连接资源耗尽。因此,需要使用连接池以便减少数据库的连接次数,使系统更加稳健。 EFCore提供了2种开启数据库连接池的方法,一种是使用IServiceCollection接口的扩展方法AddDbContextPool,该扩展方法注册了DbContext类,可以在Controller中注入DbContext对象;另一种方法是使用IServiceCollection接口的扩展方法AddPooledDbContextFactory,该扩展方法注册了IDbContextFactory接口,可以在Controller中注入IDbContextFactory类型的对象。 2种开启数据库连接池方法的区别是:前者(AddDbContextPool)直接注入DbContext对象,因此在请求建立连接时就进行数据库连接,尽管是使用池种的数据库连接;后者(AddPooledDbContextFactory)对IDbContextFactory进行了单例注册,在需要数据库连接的时候使用CreateDbContext方法建立数据库连接,可视为能够仅在需要请求数据库的时候动态建立数据库连接,灵活性比较大。 针对上述2种方法,AddDbContextPool方法适合在每个请求都需要连接数据库的Controller中使用,AddPooledDbContextFactory方法则没有使用限制,唯一需要注意的是处理好2个关联的需要使用DbContext对象的方法,防止频繁创建DbContext。鉴于此,更推荐使用AddPooledDbContextFactory方法启用数据库连接池。 需要注意的是,在启用数据库连接池的时候,自己实现的DbContext派生类中,构造函数不能有除了DbContextOptions以外的参数,这是因为连接池时DbContext对象会被连接池保存,这意味着DbContext对象是单例的,所以不能有其他注入的服务。参考stackoverflow。 此外,数据库连接字符串默认参数是pooling=true,如果改为pooling=false也会对启用数据库连接池造成影响。 1、默认不启用数据库连接池 //注册数据库上下文 services.AddDbContext<MySqlDbContext>(); 2、使用AddDbContextPool启用数据库连接池 //注册数据库上下文(启用数据库连接池) var connectionString = Configuration.GetConnectionString(MySQLConnection); services.AddDbContextPool<MySqlDbContext>(optionsBuilder => optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)), 64 ); 3、使用AddPooledDbContextFactory启用数据库连接池 //注册数据库上下文(启用数据库连接池) var connectionString = Configuration.GetConnectionString(MySQLConnection); services.AddPooledDbContextFactory<MySqlDbContext>(optionsBuilder => optionsBuilder.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)), 64 ); [Route(api/[controller])] [ApiController] public class ClientsController : ControllerBase { private readonly ILogger<ClientsController> _logger; private readonly IDbContextFactory<MySqlDbContext> _dbContextFactory; public ClientsController( ILogger<ClientsController> logger, IDbContextFactory<MySqlDbContext> dbContextFactory ) { _logger = logger; _dbContextFactory = dbContextFactory; } [HttpGet(count)] public async Task<IActionResult> GetCountAsync() { try { using (var dbContext = _dbContextFactory.

mysql启动提示:由于找不到MSVCR120.dll,无法继续执行代码

解决mysql启动提示:由于找不到MSVCR120.dll,无法继续执行代码  解决办法: 微软官网下载对应插件安装即可解决 微软官网地址 (vcredist) :https://www.microsoft.com/zh-CN/download/details.aspx?id=40784   参考资料:解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码.重新安装程序可能会解决此问题。 - Winton-H - 博客园 (cnblogs.com)

netcore centos unit服务文件

[Unit] Description=apinetcore web1 [Service] ExecStart=/usr/bin/dotnet /opt/netcore/publish/WebApplication1.dll Restart=always # Restart service after 10 seconds if the dotnet service crashes: RestartSec=10 SyslogIdentifier=WebApplication1 User=root Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target  

2022年Redis最新面试题 - Redis基础知识

最近整理一份关于Redis常见面试题的,也会根据自己的经验, 标注一些出现的概率,最高5颗★出现的概率最高。比如这样: Redis 最适合的场景, 可以简单的说说吗?出现概率: ★★★★ 整体目录大概如下: 目录 一、Redis基础知识 1、什么是 Redis, 有哪些优缺点? 2、Redis 最适合的场景, 可以简单的说说吗? 3、Redis 相比 Memcached 有哪些优势? 4、一个字符串类型的值能存储最大容量是多少? 5、Redis 读写分离 二、数据结构 1、Redis的数据类型有哪些? 2、说说 Redis 哈希槽的概念? 3、Hash如何实现O(1)的查询和设置速度, 以及扩容原理 4、布隆过滤器 三、事务 1、怎么理解 Redis 事务? 2、Redis事务执行过程 3、Redis事务的一些使用场景 4、Redis事务与Redis pipeline的区别 5、集群模式下Redis事务如何保证原子性 四、Redis数据持久化 1、为什么 Redis 需要把所有数据放到内存中? 2、Redis如何做持久化的? 3、Redis key 的过期时间和永久有效分别怎么设置? 五、Redis集群 1、Redis 是单进程单线程的? 2、是否使用过 Redis 集群,集群的原理是什么? 3、可以简单说说你对Redis Sentinel的理解 4、Redis Sentinal和Redis Cluster的区别 5、Redis 的同步机制了解么? 6、Redis 集群最大节点个数是多少? 六、Redis淘汰策略

安装桌面版Ubuntu

1.通过阿里云镜像站提供的下载连接下载Ubuntu镜像https://mirrors.aliyun.com/ubuntu-releases/22.04/   新建虚拟机-选择典型-进入下一步  选择操作系统镜像   选择已经下好的安装包   点击下一步   配置虚拟机用户名、密码、点击下一步  为虚拟机命名及选择安装位置,进入下一步   配置虚拟磁盘容量及磁盘格式  完成虚拟安装,最后检查虚拟机详细配置信息   安装完成  unbantu安装WMtools  2.安装  3.找到下载到桌面的 WMware Tools   4.进入目录打开终端  5.切换到管理员账户  6.解压wm-tools安装包  7.进入/opt/vmware-tools-distrib路径下  8.然后根据提示输入y或yes,有时按enter键,完成           

Windows如何卸载服务/删除服务

相信很多朋友都会遇到:有些软件删除了但服务还在?都在纠结怎么删除/卸载残留服务呢?  今天一位美女网友也遇到了这样的情况,由于需要重新安装vmware workstation pro,结果一直报错“Failed to install the hcmon drivers”,结果去看服务,才发现“VMUSBArbService”服务是存在的,而且这个服务路径也是有问题的,因此必须先删除它,但是:我们应该如何删除服务列表中的服务呢?  从上图可以清楚看到: 服务名称、显示名称、描述,其中“服务名称”非常重要,后面会用到。  Windows卸载/删除系统服务方法有很多,这里讲最常用的两种办法,具体如下:  第一种:通过Dos命令来 删除/卸载服务  1、开始 - 运行 -“cmd”。  2、进入Dos命令行,输入命令: sc delete VMUSBArbService  注意:VMUSBArbService是服务名称。  当然:也可以通过:sc --help 查看sc命令参数等信息等。  第二种方法:直接修改注册表 删除/卸载服务  1、开始 - 运行 - “regedit”。  2、在“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”中删除相应的 键值 即可!    

JavaCV的摄像头实战之七:推流(带声音)

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《JavaCV的摄像头实战》的第七篇,在《JavaCV的摄像头实战之五:推流》一文中,咱们将摄像头的内容推送到媒体服务器,再用VLC成功播放,相信聪明的您一定觉察到了一缕瑕疵:没有声音 虽然《JavaCV的摄像头实战》系列的主题是摄像头处理,但显然音视频健全才是最常见的情况,因此就在本篇补全前文的不足吧:编码实现摄像头和麦克风的推流,并验证可以成功远程播放音视频 关于音频的采集和录制 本篇的代码是在《JavaCV的摄像头实战之五:推流》源码的基础上增加音频处理部分 编码前,咱们先来分析一下,增加音频处理后具体的代码逻辑会有哪些变化 只保存视频的操作,与保存音频相比,步骤的区别如下图所示,深色块就是新增的操作: 相对的,在应用结束时,释放所有资源的时候,音视频的操作也比只有视频时要多一些,如下图所示,深色就是释放音频相关资源的操作: 为了让代码简洁一些,我将音频相关的处理都放在名为AudioService的类中,也就是说上面两幅图的深色部分的代码都在AudioService.java中,主程序使用此类来完成音频处理 接下来开始编码 开发音频处理类AudioService 首先是刚才提到的AudioService.java,主要内容就是前面图中深色块的功能,有几处要注意的地方稍后会提到: package com.bolingcavalry.grabpush.extend; import lombok.extern.slf4j.Slf4j; import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.FrameRecorder; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.DataLine; import javax.sound.sampled.TargetDataLine; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.ShortBuffer; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author willzhao * @version 1.0 * @description 音频相关的服务 * @date 2021/12/3 8:09 */ @Slf4j public class AudioService { // 采样率 private final static int SAMPLE_RATE = 44100; // 音频通道数,2表示立体声 private final static int CHANNEL_NUM = 2; // 帧录制器 private FFmpegFrameRecorder recorder; // 定时器 private ScheduledThreadPoolExecutor sampleTask; // 目标数据线,音频数据从这里获取 private TargetDataLine line; // 该数组用于保存从数据线中取得的音频数据 byte[] audioBytes; // 定时任务的线程中会读此变量,而改变此变量的值是在主线程中,因此要用volatile保持可见性 private volatile boolean isFinish = false; /** * 帧录制器的音频参数设置 * @param recorder * @throws Exception */ public void setRecorderParams(FrameRecorder recorder) throws Exception { this.

Python sorted() 函数

描述 sorted() 函数对所有可迭代的对象进行排序操作。 sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。 语法 sorted 语法: sorted(iterable, cmp=None, key=None, reverse=False) 参数说明: iterable -- 可迭代对象。 cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。 key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。 reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。 返回值 返回重新排序的列表。 实例 a = [5,7,6,3,4,1,2] b = sorted(a) # 保留原列表 a [5, 7, 6, 3, 4, 1, 2] b [1, 2, 3, 4, 5, 6, 7] L=[('b',2),('a',1),('c',3),('d',4)] sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数 [('a', 1), ('b', 2), ('c', 3), ('d', 4)] sorted(L, key=lambda x:x[1]) # 利用key [('a', 1), ('b', 2), ('c', 3), ('d', 4)] students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)] sorted(students, key=lambda s: s[2]) # 按年龄排序 [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] sorted(students, key=lambda s: s[2], reverse=True) # 按降序 [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]