自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

凌桓丶的博客

沙漠尽头必是绿洲

  • 博客(27)
  • 收藏
  • 关注

原创 趣谈设计模式 | 策略模式(Strategy):你还在使用冗长的if-else吗?

文章目录案例:指挥官AI策略模式配合工厂模式总结完整代码与文档案例:指挥官AI案例可能不符合实际逻辑,仅用于表述设计模式的思想,勿介意假设我们开发了一款类似全面战争的即时战略游戏,为了能够增加玩家的对抗体验,我们决定设计一个指挥官AI,与以往的无脑人机不同,指挥官会根据战况以及玩家的操作,来指定克制玩家的计策。例如当玩家派出骑兵时,指挥官就会派出枪兵,当玩家退回城中防守时,指挥官就会派出破城槌来攻城。于是我们初步的设计如下,我们使用If-else这样的条件判断,根据玩家的不同行为来做出不同的操作

2020-10-31 15:06:59 1132

原创 趣谈设计模式 | 工厂模式(Factory):利用工厂来创建对象

文章目录案例:外设店铺简单工厂工厂方法抽象工厂总结要点三类工厂模式的特点三种工厂模式的适用场景完整代码与文档工厂模式模式是创建型模式中较为常用的一个,它并不是一个模式,而是三种功能相近的设计模式的统称,它们分别是简单工厂模式、工厂方法模式、抽象工厂模式,下面我将结合案例来一一讲解它们的特点案例:外设店铺假设我们经营着一家外设店铺,我们主要售卖雷蛇和罗技这两个型号的鼠标,为了方便用户购买,我们设计了一个网上购物的平台,用户在网上下单后我们会去根据需求来生成鼠标,再经过测试、包装、注册信息后,就将合格的

2020-10-30 10:01:49 1267 3

原创 趣谈设计模式 | 观察者模式(Observer) :消息的发布与订阅

文章目录案例:文章推送观察者模式观察者模式的运作流程观察者模式解决的问题观察者模式大显身手总结要点应用场景生产者-消费者模型 VS 观察者模式完整代码案例:文章推送为了方便举例,我提出以下场景。假设我是一个科幻小说爱好者,我维护着一个叫做ScienceFictionPusher的公众号,定期向豆瓣、知乎等平台推送那些我觉得有趣的科幻小说,于是为了方便管理,我的推送程序是这样的逻辑class ScienceFictionPusher {public: //推送内容 void newP

2020-10-29 11:06:21 1615 5

原创 Shell程序设计 | 文本处理工具 :正则表达式、grep、sed、awk

文章目录正则表达式grepsedawk其它工具cutsortfinduniq常见面试题要想使用这些流式处理工具,那么就必须得了解正则表达式,由于正则表达式内容较多,一篇博客肯定写不完,所以这里只是简单的讲一下正则表达式的常用语法。正则表达式元字符选项说明\转义字符.匹配任意一个字符*匹配其前面的字符0次或者n次^匹配开头$匹配结尾[a-z]匹配方括号中的任意一个字符拓展元字符选项说明+匹配前面的正则表达式至

2020-10-27 12:24:44 1516 2

原创 Shell程序设计 | 基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数

Shell脚本的基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数

2020-10-26 10:52:39 770 4

原创 并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

并发编程中常见的锁机制:乐观锁、悲观锁、CAS、自旋锁、互斥锁、读写锁

2020-10-24 21:28:19 1054 2

原创 哲学家进餐问题的三种解决方法(C++11)

文章目录哲学家进餐问题方法一:当两边的叉子都可用时才拿方法二:限制就餐的哲学家数量方法三:奇数先左后右,偶数先右后左哲学家进餐问题方法一:当两边的叉子都可用时才拿方法二:限制就餐的哲学家数量方法三:奇数先左后右,偶数先右后左...

2020-10-24 13:45:07 10311

原创 MySQL 备份与主从复制

文章目录备份主从复制主从复制的作用备份根据备份方法的不同,备份可划分为以下几种类型热备(Hot Backup) :热备指的是在数据库运行的时候直接备份,并且对正在运行的数据库毫无影响,这种方法在MySQL官方手册中又被称为在线备份冷备(Cold Backup) :冷备指的是在数据库停止的时候进行备份,这种方法十分简单,就是直接复制相关的数据库物理文件,这种方法在MySQL官方手册中被称为离线备份。温备(Warm Backup) :温备与热备相同有一点相同,即两者都是在数据库运行时进行备份,但是

2020-10-23 21:05:59 519 2

原创 AC自动机:如何实现敏感词过滤?

文章目录

2020-10-22 20:15:50 2849 5

原创 字符串匹配算法(三):KMP(KnuthMorrisPratt)算法

单模式字符串匹配算法KMP算法的原理以及实现

2020-10-20 15:43:41 541 1

原创 字符串匹配算法(二):BM(BoyerMoore)算法、坏字符规则,好后缀规则

BM算法的全程叫做Boyer-Moore,是一种非常高效的字符串匹配算法,有实验统计,它的性能是著名的KMP 算法的 3 到 4 倍。下面就讨论一下BM算法的原理以及如何实现

2020-10-19 20:06:07 2994

原创 字符串匹配算法(一):BF(BruteForce)算法和RK(RabinKarp)算法

字符串匹配算法中的BF和RK算法

2020-10-18 15:05:23 707

原创 什么是基数排序?

文章目录什么是基数排序稳定的计数排序基数排序的实现什么是基数排序稳定的计数排序数据结构与算法 | 计数排序计数排序的基本思路在这里就不多进行介绍了,如果不了解的可以看看我以前写的博客。void countSort(vector<int>& arr){ int max = arr[0], min = arr[0]; //找出最大值和最小值,缩减范围 for(int i = 1; i < arr.size(); i++) {

2020-10-17 19:58:43 12965 6

原创 Trie(字典树) : 如何实现搜索引擎的关键词提示功能?

文章目录搜索中的关键词提示Trie树的介绍Trie树的实现Trie树的优缺点搜索中的关键词提示当我们在搜索引擎中进行搜索时,有时仅仅输入了搜索内容的一部分,搜索引擎就会提示我们可能的一些选择,这样我们就不再需要将查询词完整的输入,大大节约了我们的时间。而实现这一功能的基石,正是Trie树Trie树的介绍Trie树又叫做字典树、前缀树。顾名思义,它是一个用于处理多模式字符串匹配的多叉树,用来在一组字符串中快速的找到某个字符串。其本质就是共享字符串的公共前缀,即利用字符串之间的公共前缀,将重复的

2020-10-16 19:35:43 1199

原创 MySQL 锁与MVCC :数据库的锁、MVCC、当前读、快照读、锁算法、死锁

文章目录lock与latch锁的类型MVCC一致性非锁定读(快照读)一致性锁定读(当前读)锁算法死锁锁升级lock与latch在了解数据库锁之前,首先就要区分开lock和latch。在数据库中,lock和latch虽然都是锁,却有着截然不同的含义。latch通常被我们称为闩锁(轻量级锁),因为其要求锁定的时间必须非常短。在InnoDB中,latch可以分为mutex(互斥锁)和rwlock(读写锁),它的作用是用来保证并发线程操作临界资源的正确性,并且通常没有死锁检测机制。lock的操作对象则是事

2020-10-14 19:53:00 1124 2

原创 MySQL 事务 :ACID、并发带来的问题、事务的隔离级别、事务的实现

文章目录存储引擎MyISAMInnoDB索引概念使用方法事务概念使用方法存储引擎MyISAMInnoDB索引概念使用方法事务概念使用方法

2020-10-14 19:31:24 571 1

原创 MySQL 索引 :哈希索引、B+树索引、最左前缀匹配规则、全文索引

文章目录索引什么是索引使用场景常见的索引哈希索引自适应哈希索引B+树索引全文索引索引的使用索引什么是索引在数据库中,表、数据、索引之间的关系就类似于书籍、书籍内容、书籍目录。倘若不使用索引,则MySQL必须遍历整个表,直到找到数据,而表越大,查询的时间则越长,则数据库的效率也就越低。而索引就类似于书籍的目录,可以帮助我们快速的定位、检索到需要的数据行,对提高数据库的性能有着很大的帮助。在MySQL中,索引是一种特殊的文件,其中包含着对数据表里所有记录的引用指针。各类索引有各自的数据结构实现。使

2020-10-13 16:41:44 1002 1

原创 Linux中进程间传递文件描述符的方法

在进行fork调用后,由于子进程会拷贝父进程的资源,所以父进程中打开的文件描述符在子进程中仍然保持着打开,我们很容易的就将父进程的描述符传递给了子进程。但是除了这种情况下,如果想将某个父进程在子进程创建后才打开的描述符传递给子进程,又或者是想将子进程的描述符传递给父进程时,就遇到了问题。在Linux中,虽然文件描述符是一个整型值,但是它的传递并非只是传递这个值而已。因为这个整型值其实是文件描述符表fd_array[]的下标由于不同进程的文件描述符表不同,所以要传递一个文件描述符,就是要在接收进程中的文

2020-10-12 20:08:21 4207 3

原创 Linux网络编程 | 零拷贝 :sendfile、mmap、splice、tee

文章目录传统文件传输的问题Linux中实现零拷贝的方法传统文件传输的问题在网络编程中,如果我们想要提供文件传输的功能,最简单的方法就是用read将数据从磁盘上的文件中读取出来,再将其用write写入到socket中,通过网络协议发送给客户端。ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);但是就是这两个简单的操作,却带来了大量的性能丢失例如我们

2020-10-11 10:35:48 1675 2

原创 Linux网络编程 | 高性能定时器 :时间轮、时间堆

文章目录时间轮时间堆时间轮时间堆

2020-10-10 16:29:40 1087 2

原创 Linux网络编程 | 定时事件 :Linux常见定时方法、定时器链表、空闲断开

文章目录Linux常见定时方法定时器链表空闲断开Linux常见定时方法 Socket超时选项 I/O复用超时参数 SIGALRM信号 ****定时器链表#ifndef __TIMER_LIST_H__#define __TIMER_LIST_H__#include<time.h>#include<stdio.h>#include<sys/socket.h>#include<sys/types.h>#include<ne

2020-10-09 10:36:12 1179

原创 Linux网络编程 | 信号 :信号函数、信号集、统一事件源 、网络编程相关信号

文章目录信号函数信号集统一事件源网络编程相关信号Linux 进程信号:信号的概念、生命周期、产生流程、阻塞在半年前我写过一篇博客介绍了Linux中信号的概念以及处理流程,这次再来深入的讲一讲信号的具体使用方法以及在网络编程中的具体应用。信号函数要想为一个信号设置处理函数,可以使用以下两个系统调用。 signal signal函数的使用非常简单,只需要直接指定信号类型以及处理的方法即可#include <signal.h>typedef void (*sighandler_

2020-10-08 10:47:42 722

原创 Linux网络编程 | 并发模式:半同步/半异步模式、领导者/追随者模式

文章目录同步与异步半同步/半异步模式变体:半同步/半反应堆模式改进:更高效的半同步/半异步模式领导者/追随者模式组件 :句柄集、线程集、事件处理器并发模式是指I/O处理单元和多个逻辑单元之间协调完成任务的方法。服务器主要有两种并发编程模式:半同步/半异步模式(half-sync/half-async)模式和领导者/追随者(Leader/Followers)模式同步与异步首先在这里要指出,这里的"同步"和“异步”与I/O模型中的”同步I/O“与“异步I/O”是两个完全不同的概念,不能将其混淆。在I

2020-10-07 10:48:48 1168

原创 Linux网络编程 | 事件处理模式:Reactor模式、Proactor模式

文章目录Reactor模式Proactor模式同步I/O模型模拟Proactor模式两者的优缺点ReactorProactor随着网络设计模式的兴起,Reactor和Proactor事件处理模式应运而生。同步I/O模型通常用于实现Proactor模式,异步I/O模型通常用于实现Proactor模式。Reactor模式Reactor模式要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件就绪,如果有则将该就绪事件通知给工作线程(逻辑单元)。除此之外主线程不会进行其他实质性的工作,读写数据、接收

2020-10-06 11:05:21 1058 4

原创 Linux下守护进程(daemon)的实现

Linux下守护进程(daemon)的实现

2020-10-05 14:33:03 1088

原创 高级数据结构与算法 | 回溯算法(Back Tracking Method)

文章目录回溯电话号码的字母组合二进制手表组合总数全排列活字印刷N皇后N皇后II回溯回溯是一种通过穷举所有可能情况来找到所有解的算法。如果一个候选解最后被发现并不是可行解,回溯算法会舍弃它,并在前面的一些步骤做出一些修改,并重新尝试找到可行解。当探索到某一步时,发现原先选择并不优或 达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。也可以称为剪枝点,所谓的剪枝,指的是把不会找到目标,或者不必要的路径裁剪掉。从上面看出,回溯其实就是选优搜索

2020-10-04 21:31:15 651

原创 高级数据结构与算法 | 深度遍历搜索(DFS)与广度遍历搜索(BFS)

文章目录深度优先搜索(DFS)员工的重要性图像渲染岛屿的周长被围绕的区域岛屿数量岛屿的最大面积广度优先搜索(BFS)N叉树的层序遍历腐烂的橘子单词接龙最小基因变化打开转盘锁深度优先搜索(DFS)深度优先搜索的核心思想就是一条道走到黑,其实就和二叉树的前、中、后序遍历一样,都会先一直沿着一个方向走,当走不通了再往回找其他的路。//模板DFS(当前这一步的处理逻辑) { 1. 判断边界,是否已经一条道走到黑了:向上回退 2. 尝试当下的每一种可能 3. 确定一种可能之后,继续下一步 Dfs(

2020-10-02 23:05:37 761

空空如也

空空如也

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

TA关注的人

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