自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 briefly describe the classic sorting algorithm

briefly describe the classic sorting algorithm。

2024-01-21 16:52:17 1003 1

原创 负载均衡式在线oj

负载均衡的在线oj系统。

2023-06-12 23:53:45 129

原创 MySQL篇【5】——约束

在数据库的实际操作中难免会有一些操作不规范的地方,比方说在一张学生成绩表中,成绩的最高值为100,那么如果在这张表中如果出现了超过100分的成绩那显然是不合理的,因次需要添加约束来避免这些错误。

2022-12-09 18:17:00 533

原创 Linux多线程

如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。调用该函数的线程将挂起等待,直到id为thread的线程终止。返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其他线程得到这个返回指针时线程函数已经退出了。

2022-11-26 16:17:17 215

原创 生产者消费者模型

在多线程编程中阻塞队列是一种常用于实现生产者消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)。来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。

2022-11-26 15:52:08 600

原创 线程池介绍(普通与单例版本)

线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能保证内核的充分利用。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。某些类,之应该具有一个对象(实例),就称之为单例。在很多服务器开发场景中,经常需要让服务器加载很多的数据到内存中,此时往往要用一个单例的类来管理这些数据。懒汉方式的核心思想是“延时加载”,从而优化服务器的启动速度。

2022-11-26 15:47:55 124 1

原创 Linux信号

信号是进程之间事件异步通知的一种方式,属于软中断。SIGINT的默认处理动作是终止进程并且Core Dump首先解释一下什么是Core Dump。当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-cortem Debug(事后调试)。一个进程允许产生多大的core取决于进程的Resource Limit(这个信息保

2022-11-17 20:38:49 318

原创 站内搜索引擎

正排索引:从文档ID找到文档内容目标文档分词(目的:方便建立倒排索引和查找)倒排索引:根据文档内容,分词整理出不重复的关键字,对应联系到文档ID的方案模拟一次查找到过程:用户输入:苹果->倒排索引中查找->提取出文档ID(1,2)->根据正排索引找到文档内容->title+content(description)+url文档结果进行摘要->构建响应结果boost官网链接: https://www.boost.org/进入官网点击download下载最新版文档下载完成后进入项目目录,使用命令rz -

2022-10-17 10:55:02 905

原创 MySQL篇【4】——数据类型

与C/C++等编程语言不同的是,数据库对数据类型的要求非常严格,数据库需要严格把控数据的准确性。

2022-10-12 10:43:58 401

原创 MySQL篇【3】——表的操作

在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等。还有需求,添加字段,删除字段等等。6. 将name列修改为xingming。

2022-10-08 18:52:58 92

原创 MySQL篇【2】——库的操作

可以知道当前有哪些用户连接到MySQL,如果查出某个用户不是正常登陆的,很有可能数据库被人入侵了,以后发现数据库比较慢时,可以用这个指令来查看数据库连接情况。

2022-09-28 10:25:36 992

原创 MySQL篇【1】——基本使用

创建数据库表实际上就是在数据库路径下存入文件,打开刚刚的helloworld文件夹我们可以看到student表被建立。存储引擎:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。事实上我们实际本地连接时不需要指定服务器IP和端口,直接输入以下命令连接即可。其中mysqld指的是mysql服务,而mysql指的是mysql客户端。分别输入下面两行命令查看mysqld和mysql的路径。输入以下命令进入数据存储路径,

2022-09-27 19:30:46 522

原创 传输层协议——UDP和TCP

三次握手成功后,会在双方操作系统内为维护连接创建对应的数据结构,双方维护连接是有时间和空间成本的。

2022-09-18 12:37:37 934 1

原创 网络基础——HTTP协议及HTTPS

HTTP(超文本传输协议)是一种非常好用的应用层协议。

2022-09-14 19:19:21 966

原创 位图,布隆过滤器的原理和实现

比方说现在有40亿个未排序的无符号整数,请问如何判断一个数是否存在于这40亿个数中?这个问题就很适合用位图来解决,题目中说这些数据都是无符号整数而无符号整数最大能取到0xffffffff(约43亿),并且题目只要求我们判断该数据是否存在,因此我们只需要用一个比特位来标识该数值是否存在即可如上图,插入了1, 3, 7三个数据,我们只要把第1, 3, 7个比特位赋值1即可。

2022-09-03 19:36:43 235

原创 Linux多线程篇【5】——线程池

设计模式可以看作是一种经验,根据一些经典的场景,给定了一些特定的解决方案,这些解决方案就是设计模式。

2022-09-03 19:05:27 280

原创 数据结构篇【5】——哈希表开散列实现(哈希桶)及封装

在上一篇文章中我们解决哈希冲突的方法是闭散列,在本篇介绍另一种方法——开散列。在闭散列中如果我们碰到哈希冲突的时候我们采用的办法是向后查找,并占用另一个空余的位置,这种方法不好的地方就在于在不断的占用中哈希表的位置看起来好像没什么逻辑,而且容易产生“堆积”问题,导致查找元素的效率较低,另外我们始终要保证已经占用的位置不多于哈希表总大小的70%,因此还会造成较大的空间浪费。开散列又叫链地址发(开链法、哈希桶),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶

2022-06-28 20:08:23 430 1

原创 数据结构篇【4】——哈希(散列)线性探测实现

构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。最理想的情况是可以不经过任何比较,一次直接从表中得到要搜索的元素。对于两个数据元素的关键字ki和kj(i != j),有ki != kj,但有Hash(ki) == Hash(kj),即:不同关键字通过相同哈希函数计算出相同的哈希地址,这种现象称为哈希冲突或哈希碰撞。把具有不同关键码而具有相同哈希地址的数据元素称为“同义词”。引起哈希冲突的一个原因可能是:哈希

2022-06-27 14:08:52 1414

原创 Linux多进程篇【4】——POSIX信号量

既然说信号量可以看作是一个计数器,那么我们先来模拟看看信号量应该是怎样工作的。

2022-06-19 09:19:32 190

原创 Linux多进程篇【3】——同步

在使用互斥时我们会发现一个问题,如果一个线程频繁地使用互斥锁来占用临界资源,会严重影响别的线程的效率,而同步就是在保证数据安全的情况下让多线程的执行具有一定的顺序性,以此提高运行效率。创建条件变量跟创建互斥锁类似,在全局定义一个pthread_cond_t类型的变量即可。静态初始化销毁等待条件满足唤醒等待案例在这个例子共创建了两类进程,第一类是一个控制进程(master),第二类是三个工作进程(worker),master每秒释放一次一个信号让其中一个worker工作从运行情况中我

2022-06-14 20:41:35 461

原创 Linux多线程篇【2】——互斥锁

在任意时刻只允许一个执行流访问某段代码就可以叫作互斥。在本篇将介绍互斥锁(mutex)让我们以抢票模型来开始互斥锁的学习,对于抢票这件事有两个原则,一是大家都会尽量抢更多的票,二是一旦票没了就不能再抢了。所以接下来以这段代码为例,看看这样的抢票方式会不会引起问题我创建了五个进程,分别让他们进行抢票,其中每次对tickets进行–就代表一次抢票的完成,当票数小于等于0时抢票应该结束,那么运行结果是什么呢?我们发现问题在于当票数小于0时仍有线程在进行抢票操作,这显然是不符合逻辑的,那么原因是什么呢?我

2022-06-12 18:13:39 520

原创 Linux多线程篇【1】——线程控制

我们一般将一个进程内的所有线程称为一个线程组,而组id就是pid即进程id线程的优点1.创建一个新线程的代价比创建一个进程小得多2.与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多3.线程占用的资源更少4.计算密集型应用为了能在多处理器系统上运行,将计算分解到多个线程中实现()5.I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。计算密集型:加密,大数据运算等,主要使用的CPU资源I/O密集型:网络下载,云盘,ssh,在线直播等,主要使用内存

2022-06-07 16:01:11 331

原创 map&set的封装

map和set都是用红黑树来实现的,不同点在于map中存储了key和value而set中只存储了key值,但是总的来看他们的结构是非常类似的,因此我们可以像一个办法让红黑树代码可以同时被map和set使用。主要思路上一篇中我们给红黑树节点的模板是:template<class T>struct RBTreeNode我们仅用一个T类模板来存储数据,也就是说,我们在map中T代表的是pair<key, value>,而在set中代表的则是key值。存储方式很好处理,但是在插入

2022-05-30 15:24:35 76 1

原创 红黑树原理

目录红黑树红黑树的性质节点结构插入规则红黑树与上一篇文章说的AVL树类似,红黑树也是一种可以平衡高度的搜索树,不同点在于红黑树通过控制节点的颜色来调节搜索树的高度。红黑树的性质1.每个节点不是红色就是黑色2.根节点是黑色的3.不能有连续的红色节点4.对于每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。5.每个叶子节点都是黑色的(这里的叶子节点指的是空节点)当满足这些性质时,就可以保证红黑树中最长路径高度不超过最短路径的两倍。我们可以想象在红黑树中每条路径黑色节点

2022-05-30 14:51:38 173 1

原创 模拟实现AVL树插入操作

目录avl树结构插入旋转左旋转左单旋代码右旋转右旋转代码右左双旋右左双旋代码左右双旋左右双旋代码insert代码avl树本文展示的是通过平衡因子控制高度的avl树。平衡因子(balance factor简称bf)等于右子树高度-左子树高度,我们要控制树中的所有平衡因子都小于等于1。结构树中节点的成员如下template<class K, class V>// k为键值struct AVLTreeNode{// 本树使用三叉链可方便操作 AVLTreeNode<K, V&

2022-05-21 17:17:48 414

原创 Linux进程间通信——信号量

信号量信号量也是一种进程间通信,他与管道,共享内存,消息队列不同,它们都是以传输数据为目的的,但信号量不是,他是通过共享资源,来达到多个进程的同步和互斥。信号量的本质是一个计数器,可以衡量临界资源中的资源数目我们来想象一个场景:我们想去看一场足球比赛,所以提前去买了球票,那么在我还没落座之前,这个位置是否是我的呢?当然是的,因为我已经提前预定了这个位置。我们可以把球场看成一个临界资源,而买票就是对临界资源的预定机制。而一个球场最不应该出现的情况是什么呢?卖的票比座位多,信号量就是为阻止过多执行流访问临

2022-05-17 11:59:25 139

原创 Linux进程间通信——共享内存

目录System V共享内存共享内存函数接口shmgetshmatshmdtSystem V共享内存System V 标准的进程间通信方式是在OS层面专门为进程间通信设计的一个方案,通过系统调用的方式给用户提供功能。在同一个主机内的进程间通信方案叫作system V方案。共享内存区是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说进程不再通过执行进入内核的系统调用来传递彼此的数据。共享内存函数接口shmget功能:用来创建共享内存int

2022-05-17 11:36:06 137

原创 Linux进程间通信——命名管道

目录mkfifo命名管道命名管道与匿名管道的区别命名管道实现进程间通信示例client.cserver.c如何让Makefile编译多个文件mkfifo现在先通过这段命令来创建一个FIFO文件mkfifo fifo接着我们会发现目录下出现了这个文件开始的"p"代表"fifo"是一个管道文件,接下来我们创建两个进程,一个向fifo写数据,另一个从fifo读数据命名管道进程间的通信根本就是要让不同的进程看到同一份资源,而匿名管道利用的是子进程继承父进程资源的特性,让他们看到同一份资源。那么

2022-05-10 12:23:23 879

原创 Linux进程间通信——匿名管道

目录通信介绍目的进程间通信发展进程间通信分类管道匿名管道匿名管道的特点匿名管道读写的4种情况通信介绍进程之间可能会存在特定的协同工作的场景,为此一个进程要把自己的数据交付给另一个进程,让其进行处理,而进程是具有独立性的,一个进程看不到另一个进程的资源,因此交互数据成本一定很高。为了完成进程间的通信,首先得先有一份各进程都能看到公共资源,而这里的资源指的就是内存,且它属于操作系统(因为当它属于操作系统时才能让各个进程都能看到),换言之进程间通信的前提本质是由OS参与,提供有一份所有进程能看到的公共资源(可

2022-05-10 10:56:16 733

原创 C++的内存管理方式

目录C语言中动态内存管理方式malloc/calloc/realloc/freeC++内存管理方式new/delete操作内置类型new和delete操作自定义类型operator new与operator delete函数C语言中动态内存管理方式malloc/calloc/realloc/freevoid Test1(){ int* p1 = (int*)malloc(sizeof(int) * 10); int* p2 = (int*)calloc(4, sizeof(int) * 10);

2022-04-28 10:54:37 238

原创 C++多态

概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生不同的状态。举个例子:当普通人去买票时,是全价购票,学生买票,是半价购票,军人买票则是优先买票。多态的定义及实现多态的构成条件多态是在不同继承关系的类对象去调用同意函数,产生了不同行为。继承中构成多态还有两个条件:1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的函数进行重写class Person{public: virtual void BuyTick

2022-04-23 13:12:25 606

原创 C++的IO流

C语言的输入与输出C语言中我们用到最频繁的输入输出方式就是scanf和printf。scanf从标准输入设备(键盘)读取数据,并将值存放在变量中,printf将指定的字符输出到标准输出设备(屏幕)。C语言借助了相应的缓冲区来进行输入与输出。对输入输出缓冲区的理解:可以屏蔽低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分,可以很容易写出可移植的程序。可以使用这部分的内容实现”行“读取的行为,对于计算机而言没有”行“这个概念,有了这部分,就可以定义”行“,然后解析

2022-04-18 14:31:01 197 1

原创 C++继承的使用

定义继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。...

2022-04-17 13:14:08 1731 1

原创 WY16 不要二

二货小易有一个W*H的网格盒子,网格的行编号为0H-1,网格的列编号为0W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根小易想知道最多可以放多少块蛋糕在网格盒子里。输入描述:每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)输出描述:输出一个最多可以放的蛋糕数#include <i

2022-03-27 14:45:49 83

原创 JZ31统计回文

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。例如:A = “aba”,B = “b”。这里有4种把B插入A的办法:在A的第一个字母之前: “baba” 不是回文在第一个字母‘a’

2022-03-27 12:53:00 71

原创 栈的压入弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。0<=pushV.length == popV.length <=1000-1000<=pushV[i]<=1000pushV 的所有数字均不相同class Solution {public: bo

2022-03-27 11:38:02 296

原创 最小栈minStack

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。实现 MinStack 类:MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int getMin() 获取堆栈中的最小元素。示例 1:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],

2022-03-27 10:44:20 400

原创 进程终止与等待

进程的退出场景有三个1.代码运行完毕,结果正确2.代码运行完毕,结果不正确3.代码异常终止(程序崩溃)问题:main函数为什么要return 0?main函数的返回值是进程的退出码,退出码传给其父进程。echo $? // 输出最近一次进程退出时对应的进程码退出码的意义是可以帮助我们判断程序运行完时结果是正确还是错误,一般0代表结果正确,!0代表结果错误,而程序崩溃后退出码会变得没有意义。1.main函数return代表程序退出,非main函数叫函数返回2.可以使用exit(int v

2022-03-26 08:00:00 422 6

原创 Linux常用命令

目录lswhichaliaspwdcdtouchmkdirrmdirrmmancpmvcatmorelessheadtail如何显示中间几行datelsls + 文件名,默认显示该文件下的内容,与在文件名后加/效果一致若想看目录本身属性,可用ls -d命令。ls -n可以显示用户id和组idwhich查看特定命令所在路径,eg:which ls,我们由此可以联想到Linux中的命令本质上也是程序。alias当我们想查看ls命令的路径时,我们会看到alias,它的意思是别名,即ls是ls -

2022-02-01 15:58:01 1546 5

原创 算法基础-并查集

这是笔者的第一篇算法博文,我的主要思路和题目来源是acwing的y神,其中夹杂部分鄙人的思考思路并查集主要实现两个功能1.将两个集合合并2.询问两个元素是否在一个集合中题目链接:https://www.acwing.com/problem/content/838/现在假设一共只有10个数,分别是1~10,我想让1,2合并,2,3合并,3,4合并,4,5合并,6-8同上合并,9,10合并,那么我会先创建1个容纳10个元素的数组让数组的第x位置存储x(下标从1开始),以此代表起始时每个数各自在

2021-11-19 21:10:04 492 3

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除