- 博客(44)
- 收藏
- 关注
原创 c++ 实现 actor 框架
客户端:https://github.com/xukeawsl/coro_actor_client。服务端:https://github.com/xukeawsl/coro_actor。
2024-08-14 21:07:23
367
原创 MQTT 服务器(基于 C++20 asio 协程实现)
项目地址: https://github.com/xukeawsl/mqtt-server。
2024-03-03 19:10:55
259
原创 Linux tail 命令实现 (C语言)
设计要求编写一个程序,输出一个文件的最后几行。这个程序运行后要能跳到文件末尾附近,然后一直读取指定的数据行数,并全部打印出来。运行程序的命令是 tail -n file ,其中参数 n 是指从文件末尾数起要打印的行数,默认的 n 为 10 行设计思路利用 lseek() 系统调用移动文件指针的位置,先移动到文件末尾,然后从下往上一步一步的移动,每次读取文件的一个字符,根据 \n 的个数进行行数计算为了防止文件过大引起的缓存不足,使用 零拷贝 的 sendfile() 系统调用,直接将文件内容重
2021-12-20 20:10:00
1930
原创 简单线程池实现(C++)
为什么需要线程池首先我们要知道**池(pool)**的概念,池是一组资源的集合,这组资源在一开始先被创建并初始化,当客户需要相关的资源,就可以直接从池中获取,无需动态分配。这样取得资源的速度要比动态分配快得多。当处理完一个客户连接后,可以把相关的资源放回池中,无须手动释放资源。根据不同的资源类型,池可分为多种,常见的有 内存池 、进程池、线程池 和 连接池 。当我们需要一个工作线程来处理客户请求时,我们可以支持从线程池中取得一个执行实体,而无需手动穿件线程简单线程池的实现对于简单的线程池来说,客户不
2021-11-05 20:18:37
635
原创 蓝桥杯-算法提高-求最大值(C/C++)
资源限制时间限制:1.0s 内存限制:256.0MB问题描述 给n个有序整数对ai bi,你需要选择一些整数对 使得所有你选定的数的ai+bi的和最大。并且要求你选定的数对的ai之和非负,bi之和非负。 输入格式 输入的第一行为n,数对的个数 以下n行每行两个整数 ai bi 输出格式 输出你选定的数对的ai+bi之和 样例输入5-403 -625-847 901-624 -708-293 413886 709样例输出1715数据规模和约定1&l
2021-04-10 20:01:39
488
原创 蓝桥杯-历届试题-波动数列(C/C++)
观察这个数列:1 3 0 2 -1 1 -2 …这个数列中后一项总是比前一项增加2或者减少3,且每一项都为整数。栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加 a 或者减少 b 的整数数列可能有多少种呢?输入格式共一行,包含四个整数 n,s,a,b,含义如前面所述。输出格式共一行,包含一个整数,表示满足条件的方案数。由于这个数很大,请输出方案数除以 100000007 的余数。数据范围1≤n≤1000,−1e9≤s≤1e9,1≤a,b≤1e6输入样例
2021-03-10 17:52:49
438
原创 蓝桥杯-历届试题-地宫取宝(C/C++)
记忆化搜索暴力搜索的途中会经过很多重复的结点,这导致的普通dfs的超时,因此我们可以用一个备忘录来记录每个状态是否求解过了,当重复搜索到同一状态时,我们就可以直接返回而不必重复相同的递归操作了,这样就大量节省时间复杂度。备忘录的定义:根据题意,我们需要知道4个状态,即当前的位置(i, j),以及当前拿了多少件宝物和最近拿的宝物的价值c因此备忘录是一个四维数组:memo[i][j][k][c]根据要求,memo数组的值应该表示从(i, j, k, c)这个状态走到终点的合法方案数细节问题:由于本题
2021-03-09 14:27:41
409
原创 蓝桥杯-历届试题-幸运数
考点:链表模拟根据题意,每一轮都需要删除题目要求的数,然后将剩余的数连起来,序号重新规划,因此我们可以想到链表这一数据结构,可以实现O(1)的时间复杂度的删除操作,可以发现,除了第一次要求删除序号为2的倍数的结点以外,其余的都是要求删除序号为最后一个幸运数的值的倍数的结点。每一轮我们可以删除若干个节点,以此类推,直到不能再删除了为止。考虑到题意,我们可以剪枝判断,当前最后一个幸运数如果大于等于n的话我们就不用再去管后面的数了。这个算法的时间复杂度为O(nlogn),题目的数据范围是m < n <
2021-02-23 00:42:25
216
原创 蓝桥杯-算法提高-递推求值(C/C++)
考点:矩阵快速幂,确定矩阵递推公式#include <iostream>#include <cstring>using namespace std;typedef long long LL;LL n, mod = 99999999;LL a[7][7] = { {0, 1, 0, 0, 2, 0, 5}, {1, 0, 0, 0, 3, 2, 3}, {1, 0, 0, 0, 0, 0, 0},
2021-02-01 21:59:09
347
1
原创 1010 Radix (25分) (C/C++)
考点:进制转换、整型溢出、二分#include <iostream>#include <cmath>#include <cstring>#include <algorithm>typedef long long LL;using namespace std;//将base进制转换为10进制LL get_value(string s, int base){ LL sum = 0; int digit; LL exp =
2021-01-27 21:31:50
144
原创 1004 Counting Leaves (30分)(C/C++)
考点:存树、BFS#include <stdio.h>#include <stdlib.h>#include <string.h>const int N = 105, M = 1e5 + 5;int h[N], to[M], ne[M], q[M], idx;int n, m;void add(int parent, int child){ to[idx] = child, ne[idx] = h[parent], h[parent] = idx
2021-01-19 12:44:31
129
原创 Kruskal算法模板(C语言)
Kruskal算法是求连通网的最小生成树的另一种方法,该算法的思想是从小到大加入边,是个贪心算法,算法的时间主要消耗在对边进行排序,时间复杂度为O(eloge),适合求边数较少图的最小生成树。算法步骤:1.记录边的信息,要有边对应的点的编号2.以边权值进行排序3.每次从小到大取一条边,如果两个点不是同一个集合,就合并;否则就继续查看下一条边4.当边数为n - 1时结束遍历,得到最小生成树代码如下:#include <stdio.h>#include <stdlib.h>
2021-01-08 21:20:57
399
原创 Prim算法模板(C语言)
Prim算法Prim算法是一种常见并且好写的最小生成树算法。该算法的基本思想是从一个节点开始,不断加点 (这里假设节点为1~n),适用于点少边多的图。算法步骤:1.用二维矩阵记录每两点之间的费用2.用一个dist数组维护各点与点集的最短距离3.随便选一个起点,这里选1号点,然后每次选一个距离点集最近的点加入集合4.更新dist数组朴素prim算法1.邻接矩阵存图#include <stdio.h>const int N = 1010, INF = 1e9;int dist
2021-01-08 20:09:00
392
原创 Floyd算法模板(C语言)
Floyd算法Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。算法过程1.从任意一条单边路径开始。所有两点之间的距离是边的全,如果两点之间没有边相连,则权为无穷大。2.对于每一对顶点u和v,看看是否存在一个顶点w使得从u到w再到v比已知的路径更短。如果是则更新它。Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,
2021-01-03 20:42:57
209
原创 SPFA算法模板(C/C++)
单源最短路径算法,可以用于解决带负边权的情况。是队列优化的Bellman-Ford算法,时间复杂度O(nm)。朴素spfa算法模板#include <stdio.h>#include <string.h>const int N = 1010, M = 2e6, INF = 1e9;int n, m; //n是节点数,m是边数int dist[N], q[N]; //dist[i]表示源点到i点的最短距离int h[N], to[M], w[M], ne[M], id
2021-01-03 20:12:10
978
原创 Dijkstra模板(C语言)
dijkstra的经典的单源最短路径算法,用于求解无负边权的最短(最长)路问题。主要特点是从起点开始,采用贪心方法的策略,每次遍历到离源点最近且未访问过的邻接节点,直到扩张到终点为止。算法步骤:1.初始化dist数组为INF(dist[i]表示源点到i的最短距离)2.预处理,将dist[s]设为0,自己到自己的距离为0,且将s点与其邻接点的距离更新到dist数组中3.从未收录的结点中选择距离最近结点的收录4.将s点与收录点的所有未邻接点的距离更新(贪心)朴素dijkstra1.当图中节点较少(
2021-01-02 18:10:38
596
原创 快速排序模板(C语言)
代码模板:void swap(int* a, int* b){ int tmp = *a; *a = *b; *b = tmp;}//以中间点为pivotvoid quick_sort_mid(int* arr, int l, int r){ if(l >= r) return; int i = l - 1, j = r + 1, x = arr[l + r >> 1]; while(i < j){ while
2020-12-25 12:22:57
309
原创 并查集(C语言)
并查集 并查集是一种树形的数据结构,顾名思义,它用于处理一些不相交集的合并和查询问题。它支持两种操作:1.查找(Find):确定某个元素处于哪个集合2.合并(Union):将两个子集合并成一个集合在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。一般我们用一个数组来表示全部集合,数组有两种初始化的方式,第一种,数组每个元素都设置为-1,理由是数组下标都是非负整数,用负数可以标记一
2020-12-19 20:49:32
1203
1
原创 归并排序(C语言)
归并排序 归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法的一个非常典型的应用。归并排序的最优时间复杂度、平均时间复杂度和最坏时间复杂度均为O(nlogn),空间复杂度为O(n)。归并排序分为三个步骤:1.将数列划分为两部分2.递归地分别对两个子序列进行归并排序3.合并两个子序列将已有的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有。其本质是由小规模有序到大规模有序的自底向上的过程。核心算法是两个有序序列的排序,即使用双指针对两个数组进行扫描,以线
2020-12-18 19:05:58
422
原创 线段树(C语言)
线段树线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶子结点。使用线段树可以快速以O(logN)的时间复杂度实现单点、区间的修改和查询,综合性能较好。对于线段树中的每一个非叶子结点[i, j],它的左儿子表示的区间为[i, (i + j)/2],右儿子表示的区间为[(i + j)/2 + 1, j],因此线段树是平衡二叉树。以数组arr = [1, 2, 3, 5, 7]为例,我们可以画出以下的线段树,每个结点的值表示对应区间的元素和,叶子结点表示单
2020-12-14 22:06:22
819
原创 差分、前缀和数组(C语言)
差分、前缀和数组差分数组作用:加快区间修改的速度一般要将数组的[i, j]区间元素都加上或减去一个数,需要从i遍历到j,但是使用差分数组,只需要修改差分数组上两个位置的值即可int nums[6] = {2, 3, 5, 8, 4, 9}; //待操作的数组int diff[6];diff[0] = 0;for(int i = 1; i < 6; i++){ diff[i] = nums[i] - nums[i - 1]; }//diff[6] = {0, 1, 2, 3,
2020-12-13 22:12:02
1320
原创 哈希表(C语言)
哈希表 哈希表又称散列表,是一种是“key-value"形式存储的数据结构。即将key映射到表上的一个单元,从而实现快速查找等操作,这个映射操作就叫散列,具体通过散列函数实现相应的映射。根据key的形式,散列的形式多种多样,这里以正整数为例,常用的散列函数为:Hash(Key)=Key%TableSizeHash(Key) = Key \% TableSizeHash(Key)=Key%TableSize TableSize为表长,一般情况下,我们希望一个元素能唯一对应表上的一个单元,但是这是
2020-12-13 21:15:56
3276
原创 基数排序(C语言)
基数排序基数排序(Radix sort)是一种非比较型的排序算法,最早用于解决卡片排序的问题。它的工作原理是将待排序的元素拆分为k个关键字,其中k为最大值的位数,从低位开始进行稳定排序。(注意:数列中的元素都是非负整数)基数排序是一种稳定的排序算法。代码实现:#include <stdio.h>#include <string.h>#include <stdlib.h>typedef unsigned long long ULL;//数据预处理,保证
2020-12-12 20:11:47
1899
原创 Python手写数字识别MNIST数据集(PyTorch)
import numpy as npimport torchfrom torchvision import transformsfrom torchvision import datasetsfrom torch.utils.data import DataLoaderimport torch.nn.functional as Fimport torch.optim as optim#MNIST数据集中包含59968张数字图片,大小为(28 * 28),通道数为1 59968 = 64 *
2020-12-02 20:09:51
460
原创 Pyinstaller打包pyqt5文件全过程
步骤1确保已经安装了pyinstaller包可用pip命令,也可以在pycharm里面安装(推荐)如果你安装了matplotlib库,确保版本低于3.2,可以在pycharm中更换版本步骤2找到要打包的文件的父目录,shift + 右键进入命令行窗口确保命令行属性中的当前代码页采用的编码是utf-8如果如上图所示不是utf-8,则键入 chcp 65001 切换至utf-8(编码格式可能会影响pyinstaller命令)然后使用pyinstaller -F demo3.py命令打包文件
2020-10-05 20:44:59
1926
原创 Python笔记
笔记对应视频链接:python教程快捷键Ctrl + ] 选中的代码行右缩进一个TabCtrl + [ 选中的代码行左缩进一个TabAlt + 3 在选中代码行的最左端添加注释符号’##’Alt + 4 删除选中代码行最左端的注释符号’##’F5 运行编辑器内的程序文件pip list 查看以及安装的库print函数输出数字:print(222)输出字符串:print(‘hello’) print(“hello”)输出表达式:print(2 + 4)输入文件:fp = open(
2020-10-02 22:51:18
1391
原创 学生信息管理系统(Python)
一个适合python新手的小项目,涉及增删改查及文件的基本操作#学生信息管理系统import osfilename = 'student.txt'def menu(): print('====================学生信息管理系统=======================') print('-----------------------功能菜单---------------------------') print('\t\t\t\t1.录入学生信息')
2020-10-02 22:31:38
540
原创 拓扑排序(mooc笔记)
拓扑排序拓扑排序是对有向无环图的顶点的一种排序,一个最典型的的例子就是学校排课,在学习一门课程时有时需要用到另一门课程的知识,因此需要安排好课程学习的先后顺序我们可以用有向边(V, W)表明课程V必须在课程W选修前修完,由此建立出一张有向图,称其为AOV网络拓扑排序的经典做法就是利用一个队列。首先,对每一个顶点计算它的入度。然后,将所有入度为0的顶点放入队列中。当队列不为空时,删除一个顶点V,并将与V邻接的所有顶点的入度减1.只要一个顶点的入度降为0,就把该顶点放入队列中。此时,拓扑排序就是顶点出
2020-07-22 01:04:52
381
原创 KMP串的模式匹配(mooc笔记)
什么是串?线性存储的一组数据(默认是字符)串的模式匹配即在串中寻找给定子串,要实现这点一个简单的方法是调用相关的库函数,比如c语言的strstr函数,它的实现方式是逐个字符匹配,例如在string = "abcabd"中匹配pattern = “abd”,遇到’a’开始匹配,当匹配到’c’的时候发现匹配不上,就退到第二个字符开始,所以这种匹配方法的时间复杂度为O(nm),其中n为string的长度,m为pattern的长度大师改进(KMP算法)时间复杂度:T = O(n + m)特点:利用了已经匹
2020-07-10 21:13:30
134
原创 LeetCode-设计循环队列(c语言)
队列是典型的 FIFO 数据结构。插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾。 删除(delete)操作也被称为出队(dequeue)。 你只能移除第一个元素。队列应支持两种操作:入队和出队。入队会向队列追加一个新元素,而出队会删除第一个元素。 所以我们需要一个索引来指出起点。一般的队列会出现空间浪费的情况,因此,更有效的方法是使用循环队列。 具体来说,...
2020-05-07 17:52:19
289
原创 二叉树的遍历与基本操作(mooc笔记)
二叉树结点的定义:typedef struct TNode* BinTree;typedef BinTree Position;typedef int ElementType;struct TNode{ ElementType Data; BinTree Left; BinTree Right;};二叉树的遍历:1.前序遍历访问顺序:根节点->...
2020-04-11 10:25:15
269
1
原创 最大子序列和问题(mooc笔记)
对于这个问题我们给出三种算法:算法1:T(N) = O(N^2)一种笨办法,两个for循环,起点从下标0开始,每遍历一次就加1再遍历,一直加到N,这样就得到了最后的结果,思路不难但是不算好。代码如下:int MaxSubSequenceSum(int A[],int N){ int ThisSum,MaxSum; MaxSum = 0; for(int i...
2020-03-31 22:51:49
331
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人