自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Linux进阶】SO_REUSEPORT实现UDP组播

组播报文的目的地址使用D类IP地址, D类地址不能出现在IP报文的源IP地址字段。单播数据传输过程中,一个数据包传输的路径是从源地址路由到目的地址,利用“逐跳”的原理在IP网络中传输。

2023-03-20 11:22:07 959 1

原创 【Linux进阶】端口复用与SO_REUSEADDR/SO_REUSEPORT

端口复用真正的用处主要在于服务器编程:当服务器需要重启时,经常会碰到端口尚未完全关闭的情况,这时如果不设置端口复用,则无法完成绑定,因为端口还处于被别的套接口绑定的状态之中。

2023-03-20 10:47:07 1155

原创 动态规划——股票问题全解

股票问题是一类动态问题,我们需要对其状态进行判定分析来得出答案但其实,我们只需要抓住两个点,在这两种状态下分析问题会简单清晰许多下面将会对各个问题进行分析讲解,来解释什么是持有和不持有状态,并在分析后得到题目的解答

2023-02-16 18:56:45 1080

原创 go语言初识——函数、方法、defer的使用

在Go语言中,函数是第一类对象,我们可以将函数保持到变量中。函数主要有具名和匿名之分,包级函数一般都是具名函数,具名函数是匿名函数的一种特例,当匿名函数引用了外部作用域中的变量时就成了闭包函数,闭包函数是函数式编程语言的核心

2023-01-18 00:44:04 490

原创 go语言初识——数据类型

Go是2009年开源的编程语言,Go语言具有以下特性:语法简洁、并发编程、编译迅速、数组安全、丰富的内置类型、错误处理、匿名函数和闭包、反射、函数多返回值、自动垃圾回收

2023-01-18 00:21:39 350

原创 【C++】类成员重载、覆盖(重写)和隐藏(重定义)的区别

重载是指在同一范围定义中的同名成员函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数成员是否是虚函数无关

2022-12-31 16:08:35 554

原创 高效的事件处理模式——Reactor、Proactor

阻塞IO、IO复用和信号驱动IO都是同步IO模型。因为在这三种IO模型中,IO的读写操作,都是在IO事件发生之后,由应用程序来完成的。

2022-12-31 15:16:35 563

原创 多线程生产者消费者——分别使用条件变量、信号量实现

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。

2022-12-31 14:58:37 481

原创 【设计模式】适配器模式

根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;∶适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。也就是说:当客户类调用适配器的方法时,在适配器类的内部将调用适配者类的方法,而这个过程对客户类是透明的,客户类并不直接访问适配者类。即使用之前的类,之前的方法名,但调用了新的功能。适配器中构建适配者,通过适配者调用方法。

2022-12-31 00:58:18 298

原创 【设计模式】责任链模式

职责链模式(Chain of Responsibility):使多个对象都有机会处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。应用场景: 为完成同一个请求,如果存在多个请求处理器以及未知请求处理器个数或者请求处理器可动态配置的情况下,可以考虑使用责任链模式。避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

2022-12-31 00:34:40 111

原创 【设计模式】状态模式

在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程,编译器、网络协议、和计算与语言的研究。做产品的时候,我们总能遇到一些比较复杂的逻辑问题,而普通的流程图,或时序图对于对象和状态的解读缺乏直观的描述。, FSM),又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态模式简单来说就是使用不同的状态,来描述一个在有限状态中转化的问题。同时使用不同状态下不同的响应方式,来对有限问题做出解决。使用状态的转换对单词的描述。

2022-12-31 00:28:06 718

原创 【设计模式】工厂方法模式

工厂方法模式让一个类的实例化延迟到其子类。工厂方法模式又简称为工厂模式(Factory Pattern),又可称作虚拟构造器模式(Virtual Constructor Pattern)或多态工厂模式(Polymorphic Factory Pattern)。工厂方法模式。

2022-12-31 00:21:37 464

原创 【设计模式】简单工厂模式

首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为具体产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;简单工厂模式提供了专门的工厂类用于创建对象,将对象的创建和对象的使用分离开,它作为一种最简单的工厂模式在软件开发中得到了较为广泛的应用。,而仅仅“消费”产品,简单工厂模式实现了对象创建和使用的分离。

2022-12-31 00:08:30 722

原创 【设计模式】观察者模式

观察者模式的学习,并使用C++完成对实际场景的模拟

2022-12-30 21:21:01 297

原创 【设计模式】单例模式

单例模式的学习,并使用C++实现单例模式,懒汉+饿汉

2022-12-30 19:24:07 646

原创 【C++】一篇文章搞懂继承权限问题

这篇文章抓住三类权限之中的三种作用范围,对应类内、类外和子类中。抓住这三个范围去理解更加轻松。

2022-08-29 04:09:25 671

原创 【Linux进阶】系统调用之文件操作

文件描述符(file descriptor)就是内核为了高效管理这些已经被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符来实现。同时还规定系统刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误。...

2022-07-26 20:45:38 742

原创 【Linux进阶】进程之异常——孤儿进程与僵死进程

孤儿进程一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1,也被称为守护进程)所收养,并由init进程对它们完成状态收集工作。僵死进程一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵死进程。...

2022-07-26 04:26:16 558

原创 【Linux进阶】进程之fork——进程复制

一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。...

2022-07-25 17:29:44 1556

原创 【Linux进阶】系统调用之lstat——获取文件属性

函数头文件:函数功能:获取文件属性,比如文件权限,文件属主,文件大小等属性。函数原型:int lstat(const char *pathname, struct stat *statbuf);函数参数:第一个参数为传入参数,pathname为绝对路径或相对路径。第二个参数为传出参数,它将文件所具有的属性信息存放在该结构体指针所指的结构体中。接收该属性信息时,需要提前定义一个结构体变量struct stat st,或者结构体指针struct stat* pst = &st。这里推荐使用结构体变量,更为

2022-06-04 01:59:51 4289

原创 【C++】面向对象

目录前言一、面向过程与面向对象1.面向过程——步骤化2.面向对象——行为化二、对象的属性三、对象的关系前言当软件的规模超过一定的尺度以后,采用结构化程序设计,其开发和维护就越来越难控制。其根本的原因就在于,面向过程的结构化思想与现实世界往往都不一致,结构化程序设计的思想往往很难贯彻到底。在结构化程序设计中,采用的是“自顶向下,逐步细化”的思想。具体操作方法是模块化,是按功能来分的,所以也称为功能块(函数)。在模块化思想中已经出现的封装的概念,即是将数据封装..

2022-05-29 19:36:15 205

原创 【C++】引用与指针

目录一、引用与指针的区别二、在汇编层面理解二者区别虽然在编写C++程序时,我们可以简单将引用理解为变量的别名来使用,但作为C++程序员,需要了解其在底层的运作模式,以提高我们对底层的理解。一、引用与指针的区别以下总结9种区别,引用的规则加粗表示。1.从语法规则上讲,指针变量存储某个实例(变量或对象)的地址; 引用是某个实例的别名。2.程序为指针变量分配内存区域; 而不为引用分配内存区域。3.解引用是指针使用时要在前加“* ”; 引用可以直接使用。4.指针变量的值可以发..

2022-04-30 13:51:23 948

原创 【C++】引用基础

引用的定义类型&引用变量名称=变量名称;这就是引用变量的定义。&和类型结合称之为引用符号,不是取地址的符,代表别名的意思。一、引用的特点1.定义引用必须初始化。2.没有空引用3.没有引用的引用,即二级引用二、const与引用引用即是变量的别名,不能对引用扩张其读写能力。三、引用作为形参代替指针对比如下两种交换函数的实现方式:不难看出,指针传递比起引用传递来说,更加复杂,且需要考虑空指针的情况。而对引用传递来说,并不存在空引用的情...

2022-04-30 11:39:15 1088

原创 【C++】const与指针

目录一、C与C++中const的区别二、const与指针的关系1.const int* (int const*)2.int* const3.const int* const三、常变量与指针四、同类型指针的赋值兼容规则在C++的学习中,指针与const的应用是重中之重,我们需要分辨两者组合的多种情况与效果,以下为他们的相关讲解。一、C与C++中const的区别在进行const与指针首先需要了解C++中的const的性质下面我们编写一段代码,分别使用.c与.cpp..

2022-04-29 23:29:19 1467

原创 【Linux基础】常用命令

目录一、基础命令1.pwd2 cd3 lsls -lls -als -i4 man5 touch6 mkdir7 rmdir8 rm9 cp10 mv10.1剪切(移动)文件10.2 文件重命名11find12 grep13 管道|14 wc15 sudo16 关机和重启16.1 关机16.1 重启一、基础命令1.pwd显示当前位置的绝对路径,示例如下:2 cd切换目录,cd 后边...

2022-04-13 15:31:24 796

原创 【Linux基础】文件类型及文件权限

目录文件信息一、文件类型含义解释:二、文件权限修改文件权限1.文字设定法2.数字设定法总结文件信息首先,我们使用命令:ls -l 查看我们当前目录下文件的详细信息。文件相关信息的含义解释如下:一、文件类型Linux上有一句话:一切皆文件既然一切都可以看做文件,那么文件分为几种类型:普通文件 “-”目录文件 “d” (directory)管道文件 “p” (piping)链接文件 “l” (link)设备文件 (块设...

2022-04-13 00:43:26 1128

原创 【Linux基础】常用目录介绍

前言我们都知道Windows将储存空间分为各种盘符,如,C,D,E...但Linux与其有些差异,Linux只有一个根目录,倒立的属性结构,所有文件都是从根目录开始向下存储,如下图所示:终端展示目录:在此我们将介绍一些常用目录。/bin 存放常用的命令(二进制可执行程序)(重点)/boot 存放系统内核及启动相关的文件,类似于window里面的C盘,很重要,一般不会让别的人 去挤压它的存储空间(重点)/dev 存放我们的设备文件(重点)/etc...

2022-04-12 22:46:42 1612

原创 【C语言数据结构】链队列

目录前言一、链队列1.链队列头文件及函数声明2.初始化3.结点申请4.结点释放5.入队6.获取队头元素5.出栈6.清空与销毁1.清空2.销毁8.循环队列源文件及整体函数实现总结前言队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。链队列,实际本身是一个链表,但是因为链表...

2022-03-25 22:14:57 3114

原创 【C语言数据结构】循环队列

目录前言一、循环队列1.循环队列头文件及函数声明2.初始化3.入队4.获取队头元素5.出栈6.清空与销毁1.清空2.销毁8.循环队列源文件及整体函数实现总结前言队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。循环队列,实际本身是一个顺序表,但是因为顺序表进行删除非尾部...

2022-03-25 21:49:34 1824

原创 【C语言数据结构】栈(顺序栈+链栈)

目录文章目录前言一、顺序栈1.顺序栈头文件及函数声明2.初始化3.扩容4.入栈5.获取栈顶元素6.出栈7.清空与销毁1.清空​​​​​​​2.销毁8.顺序栈源文件及整体函数实现二、链栈1.链栈头文件及函数声明2.初始化3.结点申请4.入栈5.获取栈顶元素6.出栈7.清空与销毁1.清空2.销毁8.顺序栈源文件及整体函数实现总结前言栈(stack)又名堆栈,它是一种运算受限的...

2022-03-25 16:14:00 2310

原创 【八大排序】快速排序

目录目录前言一、排序规则划分规则二、代码实现总结前言快速排序(Quicksort),是对冒泡排序算法的一种改进。快速排序算法通过多次比较和交换来实现排序。特点:数据越乱排序速度越快,越有序排序速度越慢。时间复杂度最好O(nlogn) 最坏情况O(n^2) 平均时间复杂度O(nlogn) 空间复杂度O(nlogn) 稳定性:不稳定一、排序规则将数组内第一个元素作为我们的基准值,然后以基准值进行划分,划分出两部分,小于基准值都在基准值左边,大于...

2022-03-24 23:06:59 114

原创 【字符串匹配】KMP算法

目录前言一、匹配逻辑失配情况1.前面匹配过的位置不存在重复串2.前面匹配过的位置存在重复串二、代码实现前言KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。kmp算法为bf算法的优化,

2022-03-24 18:21:08 263

原创 【字符串匹配】BF算法

目录前言一、算法逻辑二、代码实现总结前言BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。bf算法进行字符串完全的遍历,所以其的时间复杂度较大,为(O(n * m)),但逻辑简单,代码实现方便。一、算法逻辑主串和子串从

2022-03-24 16:54:07 2154

原创 【八大排序】堆排序

系列文章目录八大排序(一):直接插入排序八大排序(二):Shell排序八大排序(三):冒泡排序八大排序(四):选择排序八大排序(五):二路归并排序八大排序(六):基数排序目录系列文章目录文章目录前言1.概念提醒完全二叉树大顶堆(小顶堆)2.堆的数组表示及调整规则数组表示调整规则二、代码实现1. 调整函数2.从尾部向头部堆的调整总结前言堆排序(英语:Heapsort)是指利用堆这种数据结构所设计的一种排序算法。..

2022-03-20 22:25:05 403

原创 【八大排序】基数排序(桶排序)

目录前言一、排序规则二、代码实现总结前言基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。将所有值按照个位,十位,百位......

2022-03-17 20:24:47 218

原创 【八大排序】二路归并排序(非递归 + 递归)

目录前言两两融合规则二、代码实现1.非递归实现2.递归实现总结前言归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。这些子问题解决的方法都是类似的,解决掉这些小的问题之后,归并子问题的结果,就得到了“大”问题的解。时间复杂度:..

2022-03-17 12:03:55 7470

原创 【八大排序】选择排序

目录文章目录前言一、排序分析二、代码实现总结前言选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序与冒泡排序都是将数据交换至正确的位置上,但冒泡排序在每一趟排序中进行未知次数交换,而选择排序是找到目标值之后将其与正确位置的值进行...

2022-03-14 00:08:39 359

原创 【八大排序】冒泡排序

目录文章目录前言一、排序规则二、代码实现总结前言冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡...

2022-03-13 23:13:39 707

原创 【八大排序】Shell排序

目录前言一、分组规则二、代码实现总结前言本文将介绍八大排序之一,Shell排序,Shell排序实际为直接插入排序的优化,使其时间复杂度降低。“shell排序,又名希尔排序,被称作缩小增量排序,是1959年首次提出的。主要思想:假设待排序原素序列涵盖n个原素,取一个整数increment(小于n)作间隔,把所有的元素分为increment个子序列,全部距离是increment的元素,放在同一个子序列中,在每一个子序列中分别实施直接插入排序”,Shell排序的执行时间依赖于增量序..

2022-03-11 23:08:27 1173

原创 【八大排序】直接插入排序

目录前言一、过程分析二、代码实现总结前言直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。其基本思想为:将所有数据分为两部分,一部分认为是有序的,另一部分认为是无序的,依次从无序序列中取值,向有序序列中放,再次保证完全有序,直到将待排序序列中所有值取尽。稳定性: 没有跳跃交换 稳定时间复杂度: O( n ^ 2 ) ...

2022-03-11 21:40:58 339

空空如也

空空如也

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

TA关注的人

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