<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cprimesplus的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cprimesplus</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cprimesplus]]></copyright><item><title><![CDATA[《Redis设计与实现》思维导图]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/141105717</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/141105717</guid><author>cprimesplus</author><pubDate>Sun, 11 Aug 2024 14:48:37 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[C++实现LRU缓存结构]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/115557335</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/115557335</guid><author>cprimesplus</author><pubDate>Fri, 09 Apr 2021 19:12:17 +0800</pubDate><description><![CDATA[题目描述

分析
代码
class Solution {
public:
    /**
     * lru design
     * @param operators int整型vector&lt;vector&lt;&gt;&gt; the ops
     * @param k int整型 the k
     * @return int整型vector
     */
    unordered_map&lt;int, int&gt; mp;
    unordered_map&lt;int, ]]></description><category></category></item><item><title><![CDATA[server端进程池的实现（并发服务器）]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/113934885</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/113934885</guid><author>cprimesplus</author><pubDate>Mon, 22 Feb 2021 14:00:41 +0800</pubDate><description><![CDATA[什么是进程池
在这里引用另一个博主 青城山小和尚 的关于线程池的图，进程池与线程池类似。
假设一种情况，当多个客户端的请求同时到达服务器，如果采用单线程/进程的方式，服务端就会依次处理每个客户的请求，此时其他客户将进入等待状态，直到服务端响应完请求，才会接着处理下一个任务。这会导致客户端时间过长，性能低下。
考虑并发的情况，可以采用多进程/线程的方式解决上述问题。也就是说，服务端的主线程只是用来监听客户请求，fork出的子进程用来处理请求，多进程并发处理，使得效率更高。
静态进程池套接字实现
设置固定进程池]]></description><category></category></item><item><title><![CDATA[socket——流式套接字编程实例及注意事项]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/113918117</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/113918117</guid><author>cprimesplus</author><pubDate>Sun, 21 Feb 2021 18:33:38 +0800</pubDate><description><![CDATA[流式套接字基本操作步骤
C端（主动端）

获取socket
给socket取得地址（可省）
发送连接
收发消息
关闭

S端（被动端）

获取socket
给socket取得地址
将socket设置为监听模式
接受连接
收发消息
关闭


...]]></description><category></category></item><item><title><![CDATA[套接字选项—设置多播/组播和广播]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/113915389</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/113915389</guid><author>cprimesplus</author><pubDate>Sun, 21 Feb 2021 11:15:45 +0800</pubDate><description><![CDATA[函数
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

【注】
以上几种消息发送方式均需注册套接字选项，不能直接向诸如"255.255.255.255"的广播地址发送消息。
以组播为例，D类IP地址用于多点广播]]></description><category></category></item><item><title><![CDATA[socket——报式套接字编程实例及注意事项]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/113881036</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/113881036</guid><author>cprimesplus</author><pubDate>Sat, 20 Feb 2021 13:05:12 +0800</pubDate><description><![CDATA[数据报格式定义
注：

需要使用__attribute__((packed))取消字节对齐，避免不同端字节对齐方式差异引起的问题。
数据报以结构体为单位，流式套接字以字节流为单位进行传输。

#ifndef _DGRAM__
#define _DGRAM__

#define NAME_SIZE 128

struct dgram_t {
    char name[NAME_SIZE];
    int chinese;
    int math;
}__attribute__((packed));


]]></description><category></category></item><item><title><![CDATA[客户端不需要绑定端口号的原因]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/113871507</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/113871507</guid><author>cprimesplus</author><pubDate>Fri, 19 Feb 2021 20:43:35 +0800</pubDate><description><![CDATA[因为服务器是时时在监听有没有客户端的连接，如果服务器不绑定IP和端口的话,客户端上线的时候怎么连到服务器呢,所以服务器要绑定IP和端口面客户端就不需要了,客户端上线是主动向服务器发出请求的,因为服务器已经绑定了IP和端口,所以客户端上线的就向这个IP和端口发出请求。
这时因为客户开始发数据了(发上线请求),系统就给客户端分配一个随机端口,这个端口和客户端的IP会随着上线请求一起发给服务器,服务收到上线请求后就可以从中获起发此请求的客户的IP和端口,接下来服务器就可以利用获起的IP和端口给客户端回应消息了.总]]></description><category></category></item><item><title><![CDATA[令牌桶算法——多线程实现]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/113816349</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/113816349</guid><author>cprimesplus</author><pubDate>Mon, 15 Feb 2021 15:20:45 +0800</pubDate><description><![CDATA[相关注意事项都写在了注释当中
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;
#include &lt;signal.h&gt;
#include &lt;unistd.h&gt;
#include &lt;errno.h&gt;
#include &lt;sys/time.h&gt;
#include &lt;pthread.h&gt;

#include "mytbf.h"
// typedef v]]></description><category></category></item><item><title><![CDATA[令牌桶算法——信号量实现]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/113701515</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/113701515</guid><author>cprimesplus</author><pubDate>Fri, 05 Feb 2021 18:10:58 +0800</pubDate><description><![CDATA[头文件定义mytbf.h
#ifndef MYTBF_H__
#define MYTBF_H__

#define MYTBF_MAX 1024
typedef void mytbf_t;

mytbf_t *mytbf_init(int cps, int burst);

int mytbf_fetchtoken(mytbf_t *, int);

int mytbf_returntoken(mytbf_t *, int);

int mytbf_destroy(mytbf_t *);

#endif

]]></description><category></category></item><item><title><![CDATA[王道数据结构2.2.1]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/107330987</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/107330987</guid><author>cprimesplus</author><pubDate>Tue, 14 Jul 2020 09:34:54 +0800</pubDate><description><![CDATA[题目要求
设计一个递归算法，删除不带头结点的单链表L中所有值为x的结点。
代码
void del_x(LinkList &amp;L, ElemType x)
{
	LinkList p;
	if(L == NULL)
		return;
	if(L-&gt;data == x) {
		p = L;
		L = L-&gt;next;  
		free(p);  // *
		del_x(L, x);
	}
	else {
		del_x(L-&gt;next, x);
	}
}

疑点解析
1.返回的头]]></description><category></category></item><item><title><![CDATA[Linux下socket多人聊天室]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/106732290</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/106732290</guid><author>cprimesplus</author><pubDate>Tue, 23 Jun 2020 13:42:14 +0800</pubDate><description><![CDATA[前言
由于疫情原因，在家上了一学期的课，本次作业是作为“Linux程序设计”的期末考核而布置的，代替了原本的考试，对于我这种比较喜欢动手的菜鸡来说，很舒服。
一、聊天室的实验内容
本作业实现一个基于Linux的模拟即时通信系统，要求实现以下功能：
1、模拟即时通信系统可以实现多人同时在线聊天功能；
2、在线聊天用户登录本系统需输入用户名和密码；
3、本系统需能够查询历史聊天记录；
4、本系统运行后，需启动一个守护进程，该守护进程记录本系统启动和关闭的时间，每个用户登录和退出时间；（日志）
5、需创建本系统的]]></description><category></category></item><item><title><![CDATA[编译原理——词法分析器的C语言实现]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105769402</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105769402</guid><author>cprimesplus</author><pubDate>Sat, 13 Jun 2020 14:50:02 +0800</pubDate><description><![CDATA[/*
*author:  cuiyanran 
*date:    2020-4-26 15:08
*version: 1.0
*IDE:     Dev-C++
*/ 
#include &lt;iostream&gt;
#include &lt;cstdio&gt;
#include &lt;cstring&gt;
#include &lt;windows.h&gt;
#include &lt...]]></description><category></category></item><item><title><![CDATA[编译原理【4】文法转换（消除左递归）]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105993956</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105993956</guid><author>cprimesplus</author><pubDate>Fri, 08 May 2020 13:48:06 +0800</pubDate><description><![CDATA[并不是所有文法都适合自顶向下分析，下面列举两个自顶向下分析中遇到的问题：
1.同一非终结符的多个候选式前缀相同时，会导致回溯现象从而效率低下。

为什么要消除左递归？
如果是类似于A→AαA\rightarrow A\alphaA→Aα的左递归文法，由于对当前句型的分析按照最左推导执行，因此将会使得递归下降分析器陷入无限循环。故需要消除。（参考下图，最后会生成以A开头，后面跟着无限个α的句子）

...]]></description><category></category></item><item><title><![CDATA[编译原理【3】语法分析概述]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105991187</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105991187</guid><author>cprimesplus</author><pubDate>Fri, 08 May 2020 11:56:03 +0800</pubDate><description><![CDATA[推导需要完成的两个选择：选择替换当前句型的哪个非终结符，以及用哪个候选式去替换。


最左推导与最右规约
（由于自顶向下的分析器自左向右扫描串，因此采用最左推导方式）
最左推导：替换每个句型最左端的非终结符

最右推导与最左规约（规范推导与规范规约）
正好与上面描述的相反。


最左推导与最右推导的唯一性：
由于最左推导和最右推导总是选择一端的非终结符进行替换，因此最左推导和最右推导的结果都是唯一...]]></description><category></category></item><item><title><![CDATA[Windows下文件读取填坑记录——跳过文件换行符]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105758782</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105758782</guid><author>cprimesplus</author><pubDate>Sat, 25 Apr 2020 22:59:55 +0800</pubDate><description><![CDATA[前言
今天写编译原理词法分析，涉及对.txt文件的读取操作，我在文件中放入了一个简单的C程序，如下：
在测试读取文件的时候，因为要跳过空格、换行以及缩进，所以我写了以下函数：
void skipSpace()
{
	char ch = prgrm_content[index];
	while((ch == '\n') || (ch == ' ') || (ch == '\t')){
		index...]]></description><category></category></item><item><title><![CDATA[编译原理【2】词法分析]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105725549</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105725549</guid><author>cprimesplus</author><pubDate>Fri, 24 Apr 2020 11:03:27 +0800</pubDate><description><![CDATA[基本表示


其中正闭包就是一个字母表中所有次幂（从1开始）构成的集合，也就是克林闭包少了0次幂（空集ϵ\epsilonϵ）的形式。

终结符与非终结符

终结符：文法所定义语言的基本符号，也称token，例如VT={apple,boy,eat,little}V_T=\{apple,boy,eat,little\}VT​={apple,boy,eat,little}
非终结符（语法变量）：用来表示...]]></description><category></category></item><item><title><![CDATA[编译原理【1】概述：词法分析、语法分析、语义分析]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105724168</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105724168</guid><author>cprimesplus</author><pubDate>Fri, 24 Apr 2020 10:29:14 +0800</pubDate><description><![CDATA[什么是编译？
编译就是将高级语言程序转换成汇编语言程序/及其语言程序的过程。

编译，说白了就是翻译，对比精细的人工英译汉的步骤：

词法分析：分析词性：每个词属于名词？形容词？动词？介词…
语法分析：分析各种介词短语、名词短语、动词短语…
语义分析：以上两个步骤的意义就是为语义分析做铺垫，通过将语法展开成下图树的形式，可以最终根据根节点分析出整个句子的意思是什么。

编译的步骤也和人工翻译是一样...]]></description><category></category></item><item><title><![CDATA[python+selenium实现疫情期间全自动打卡]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105574627</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105574627</guid><author>cprimesplus</author><pubDate>Fri, 17 Apr 2020 11:52:13 +0800</pubDate><description><![CDATA[文章目录前言问题分析网页源码分析与代码实现一、加载火狐驱动二、输入账号密码并提交三、进入打卡界面并点击左侧菜单栏iframe内元素的定位动态id/class的定位四、表格填写五、提交表格全部代码
前言
因为疫情缘故，学校搞了个每日限时打卡的系统，要求学生在每天0-9点完成当日体温和在京状况的打卡。就这样手动打卡了两个多月，北京还是迟迟不开学，目测开学已经要到5月底了。打卡期间忘过无数次，每次都被班...]]></description><category></category></item><item><title><![CDATA[使用python处理题库表格并转化为word形式]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/105474618</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/105474618</guid><author>cprimesplus</author><pubDate>Sun, 12 Apr 2020 20:24:55 +0800</pubDate><description><![CDATA[前言
亲人工作考试，公司给的题库好像是直接从数据库导出的表格Excel形式，在移动端上非常难看，需要不断左右上下滑动，看不了多少题眼就瞎了，遂主动请缨编写python脚本解决之。
原本给的题库在手机上横屏显示是这样的↓↓↓（想象一下是在手机上）无比恶心

我的工作
公司给出的格式是.xlsx的（Excel表格的默认格式），盲猜是直接从答题数据库导出的，表名和属性名应该是稍微做了从英文到中文的改变，...]]></description><category></category></item><item><title><![CDATA[2020美赛数模代码留存]]></title><link>https://blog.youkuaiyun.com/cprimesplus/article/details/104774359</link><guid>https://blog.youkuaiyun.com/cprimesplus/article/details/104774359</guid><author>cprimesplus</author><pubDate>Tue, 10 Mar 2020 15:24:38 +0800</pubDate><description><![CDATA[前言
上午八点半提交了论文，虽然模型建得不怎么好，但好在我编写的代码提取特征and画图还算奏效，现在写下来留存一下，以后可能还会用到。
由于比赛以代码效率为主，因此在下面的一些代码中总是将提取的属性列单独存储到一个临时文件，再由队友手动把那几列更新到文件。
代码主要有以下模块
1.日期处理
2.句子分词、去符号、去停用词、词性筛除
3.实现TF-IDF模型提取关键词
4.统计月度数据
5.使用长短...]]></description><category></category></item></channel></rss>