自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 比malloc更快的内存池-高并发内存池

高并发内存池的设计与实现1.概述1.1 池化技术池 是一种常见的工程中的模块。池的核心概念就是:将程序中经常需要使用的核心资源先申请出来,放到池内,需要的时候直接取出,从而提高资源的使用效率,也可以保证本程序占有的资源数量。 经常使用的池化技术包括,内存池,线程池和各种连接池。1.1.2 内存池内存池是一种动态管理内存的池化技术,原先我们使用new、delete或malloc、free的时候都会频繁从系统申请内存和释放内存,不仅效率低还会产生内存碎片。内存池则是在我们需要申请内存之前,先直接向系统

2020-08-25 10:24:00 833

原创 非常巧妙用来解决集合问题的数据结构--并查集

并查集并查集应用并查集原理并查集实现1.并查集应用在很多笔试题目中,经常需要将n个不同元素划分成不相交的集合,通过一定的条件和关系让一些集合合并。在此过程中经常需要判断该元素是否属于某个集合,或查询该集合中元素的个数。适用于解决这类问题的数据结构类型称为并查集。题目1:.547. 朋友圈题目2:990. 等式方程的可满足性2.并查集原理通过数组下标标识元素本身,数组内容标识其集合上层节点。举个例子在班里有三波人是互相熟悉的,他们都有分别都有一个老大。现在给这些人进行编号{0,

2020-08-15 23:54:56 367

原创 【死磕动态规划系列】1139. 最大的以 1 为边界的正方形

问题描述给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量。如果不存在,则返回 0。示例 1:输入:grid = [[1,1,1],[1,0,1],[1,1,1]]输出:9示例 2:输入:grid = [[1,1,0,0]]输出:1提示:1 <= grid.length <= 1001 <= grid[0].length <= 100grid[i][j] 为 0 或 1

2020-07-27 13:34:41 240

原创 项目实战:p2p文件下载器

项目简介由于我在宿舍有一台笔记本一台台式电脑,两个电脑经常需要互传一些文件,但是每次插拔U盘就显得很不优雅了,遂打算自己开发一个用于面对面传输的软件。项目环境win10操作系统、VS2019、HTTP第三方库httplib、boost使用技术网络传输、HTTP/TCP协议、多线程、分块传输、STL项目结构图具体实现介绍项目使用介绍项目启动后,会自动启动服务端和客户端程序,用户通过客户端可以获取连接自己局域网的主机列表,选择指定主机获取其存储文件,再通过文件名下载具体文件。项目文件结构

2020-07-08 17:14:08 1935

原创 我终于搞清楚了什么是网络拥塞控制(慢启动,拥塞避免,快速重传,快速恢复)

拥塞控制概述拥塞控制是TCP协议的一个重要的任务,拥塞控制的目的是提高网络利用率,降低丢包率,并保证网络资源对每条数据流的公平性。拥塞控制的四个部分:慢启动、拥塞避免、快重传和快速恢复。拥塞控制算法在Linux下有多种实现,比如reeno算法、vegas算法和cubic算法等。它们或部分或全部实现了上述四个部分。你可以在/proc/sys/ipv4/tcp_congestion_control中查看目前使用的拥塞控制算法。拥塞控制最根本就是控制发送端向网络一次连续读写的数据量,我们称为SWND(Sen

2020-06-01 01:59:11 3013

原创 sunday匹配算法实现strStr()

背景sunday匹配算法是Daniel M.Sunday于1990年提出的字符串模式匹配。并且以其名字命名。主要思想sunday算法的主要思想是当父串和子串不匹配时,父串的滑动窗口移动尽可能多的字符,提高匹配效率。原理1.设置一个滑动窗口,窗口大小等于子串长度。2.通过比较滑动窗口和子串,匹配是否相等。3.若不相等,滑动窗口向后移动。4.循环步骤2,3直到匹配或滑动窗口无法后移为止。提高效率的地方在于滑动窗口向后移动的多少,为了保证尽可能多的移动并且保证不出现遗漏,要设置一个偏移表,查找每

2020-05-19 13:54:11 224

原创 头文件和库文件区别,动态库和静态库的区别,动静态库的生成

文章目录一、什么是头文件?什么是库文件?有什么区别?先说总结目标文件二、什么是静态库?什么是动态库?有什么区别?三、为什么只用在程序头部写上包含的头文件,头文件中并没有实现内容就可以使用声明的函数呢?动静态库区别1.可执行文件大小不一样2.占用磁盘大小不一样3.拓展性与兼容性不一样4.依赖不一样5.复杂性不一样6.加载速度不一样四、如何生成动静态库文件静态库的生成库文件的搜索路径动态库的生成总结参考一、什么是头文件?什么是库文件?有什么区别?先说总结头文件是包含函数声明,宏定义,类的声明的文件。在

2020-05-18 15:24:53 3023

原创 一种高效查找树-radix的实现

radix的实现1.引言2.介绍3.实现如何插入数据1.引言我们知道,unoredered_map是一种查找时间复杂度o(1)的数据结构,经常用在数据查找相关的地方,但是在使用unordered_map进行数据查找时,hash冲突是一件令人很头疼的事情,因为hash冲突导致unordered_map的查找效率降低。radix就是一种适用于基于二进制表示的键值的查找树,在数据量增大的时候不会影响...

2020-04-17 07:26:56 1321

原创 简单模拟实现unordered_set和unordered_map以及其底层hashtable

理解底层结构unordered_map和unordered_set底层采用的是哈希桶的数据结构,说白了就是一个指针数组。每个数组单位称为一个桶,这个桶就是一个结点单链表。通过哈希散列函数映射到数组中的具体某个位置后,将数据形成一个新的桶结点插入进单链表。模拟实现hashtable就是实现一个维护指针数组的类。namespace HASH_BUCKET{ template<class...

2020-04-09 17:27:07 340

原创 合并石子

题目内容设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到4 5 2, 又合并 1,2堆,...

2020-04-02 20:12:59 559

原创 linux 进程通信:管道、共享内存、消息队列

3333

2020-01-15 14:20:51 199

原创 Linux:如何操作、理解磁盘中的文件和相关文件知识(文件系统、软/硬链接)

1.标准库的IO接口要对磁盘上的文件进行操作,我们首先要学习标准库IO接口是怎么使用的。下面简单介绍一些常用的接口。函数 fopen 打开文件名为 path 指向的字符串的文件,将一个流与它关联。FILE *fopen(const char *path, const char mode);mode参数指向一个字符串,设置打开方式函数 fclose:关闭一个文件fread :读取一个文件...

2020-01-14 09:27:48 208

原创 Linux:理解进程?看这就行了

一、理解冯诺伊曼现代计算机体系现代计算机的硬件体系是由冯诺依曼提出来的。冯诺依曼提出了数据采用二进制存储,并且存放位置由地址确定。输入设备:为了输入程序和数据。输出设备:为了显示输出结果。存储器:记忆程序和数据。控制器:控制程序的执行。运算器:完成数据加工处理。二、理解操作系统1.操作系统存在的意义光有了硬件也不行,直接对硬件进行操作难度太大。所以大佬们写了一个操作系统。操...

2020-01-13 11:41:27 156

原创 理解*(T**)&xxx

结论* (T**)&xxx可以让一个地址赋值到当前指针指向变量的前4/8个字节上(取决于平台)演示#include <stdio.h>#include <iostream>using namespace std;int main(){ double *p = new double(1); int a = 2; *(int**)p = &a...

2019-12-09 20:51:43 679

原创 Linux:多线程-线程池

下 发放阿凡地方sf

2019-12-02 21:13:38 128

原创 Linux:多线程-信号量

信号量可以说是自动进行判断的条件变量,并添加了资源计数器的功能。本质:计数器+等待队列+等待和唤醒的自动判断实现原理:通过计数器对资源进行计数,在访问临界资源前先访问信号量,通过计数器来判断是否有资源能够被访问。若计数器<=0,则使线程等待,并将计数器减一;若计数器>0,则进行资源访问,并将计数器减一。若有其他线程生产了资源,若计数器>0,则计数器加一;若计数器<=0...

2019-12-02 19:28:31 176

原创 Linux:多线程-实现生产者与消费者模型

本篇目录理解优点特点实现使用信号量实现使用条间变量和互斥锁实现理解生产者消费者模型就像生活中的中介公司,他提供了一个生产者(卖方)和消费者(买方)的平台。让生产者不需要操心资源的生产的快慢,让消费者不用担心资源的来源。保证了“交易”的达成。优点解耦合:消费者和生产不需要对数据进行交互可并发:不同类型线程可以同时对缓冲队列进行操作支持忙闲不均:即生产者与消费者的快慢程度不一特...

2019-12-01 22:24:44 502

原创 Linux:多线程-条件变量

条件变量条件变量在多线程编程中,提供了线程等待-唤醒的逻辑模式。通过用户自己的条件判断去设置什么时候让线程进行等待,什么时候进行唤醒。本质:线程等待队列+等待与唤醒接口信号量可以说是自动进行判断的条件变量,并添加了资源计数器的功能。本质:计数器+等待队列+等待和唤醒的自动判断实现原理:通过计数器对资源进行计数,在访问临界资源前先访问信号量,通过计数器来判断是否有资源能够被访问。若计数器...

2019-12-01 21:09:25 158

原创 Linux:多线程-互斥锁

1.互斥锁作用在Linux下,多个线程拥有同一个虚拟地址空间,若多个线程对同一块数据进行操作,可能会产生二义性。造成逻辑混乱。为了保证不发生这些,就需要线程安全。线程安全的概念:多个线程对同一个临界资源进行争抢访问,但不会造成数据二义性。线程安全的实现:就要保证同步与互斥。同步的实现:条件变量/信号量互斥的实现:互斥锁/信号量互斥锁为资源引入一个状态信息:锁定/非锁定当线程要访问一个...

2019-11-28 17:50:40 456

原创 C++:string类的实现

1、介绍string2、代码实现3、测试

2019-11-06 16:39:11 218

原创 linux 常用工具

vimlinux使用vim编译器编写代码,但是原生的vim编译器着实不太好用,不过我们可以通过配置文件使它好用起来.vimplus一个很好用的vim配置程序,安装后按 <leader+h>有帮助文档可以了解怎么使用gcc编译代码:gcc命令选项:-E:仅作预处理,不进行编译、汇编和链接-S:仅编译到汇编语言,不进行汇编和链接-c:编译、汇编到目标代码(也就是计算...

2019-10-27 21:01:12 159 1

原创 Linux基础指令和权限理解

基础指令[ ]内的内容表示可选操作,可以省略ls用于显示指定工作目录下之内容(列出目前目录所含文件和子目录)语法:ls [option] [name]参数列表:-a 显示所有文件及目录,包括以.开头的隐藏文件-l 列出文件详细信息,显示的是创建时间-A同-a ,但不列出".“和”…"-F 在列出的文件名称后加一符号;例如可执行加"*",目录加"/"。-R 若目录下有文件,则...

2019-10-22 14:55:34 179

原创 C++在类中可以访问同类对象的私有成员

今天在实现string类的拷贝构造函数时,发现可以直接使用参数对象去访问该类的私有成员。 string(const string& s)//copy拷贝构造函数 :_str(new char[strlen(s.c_str)]), _size(s._size), _capacity(s._capacity) { strcpy(_str, s._str); ...

2019-09-23 14:07:43 1404 1

原创 const简单总结

常变量: const 类型说明符 变量名常引用: const 类型说明符 &引用名常对象: 类名 const 对象名常成员函数: 类名::fun(形参) const常数组: 类型说明符 const 数组名[大小]常指针: const 类型说明符* 指针名 (常量指针),类型说明符* const 指针名(指针常量)首先提示的是:**在常变量(const 类型说明符 变...

2019-09-06 16:40:22 146

转载 引用作为返回值

(1)以引用返回函数值,定义函数时需要在函数名前加 &(2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。引用作为返回值,必须遵守以下规则:不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数...

2019-09-06 15:55:39 693

原创 归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。引用自百度百科。归并排序的优点是无论什么情况他的时间复杂度都是o(nlogn),但它的缺点就是空间复杂度为o(...

2019-07-29 15:46:31 68

原创 选择排序的三种方法和递归非递归实现

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。本文先介绍将要排序的数据分割成两个独立两部分的三种方法,我给它们起名为左右交换法、挖坑法、跟随交换法,其次介绍如何递归使用这些方法和非递归使用,最后介绍对快速排序优化的两种方...

2019-07-28 16:03:08 767

原创 插入排序、希尔排序、选择排序、冒泡排序

插入排序如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到插入排序法,插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。插入算法把要排序的数组分成两部分:第一部分为已排好序的,如果这个数组元素是无序的,那么这一部分我们可以...

2019-07-27 17:11:31 149

原创

什么是堆?堆使用数组表示的完全二叉树,并且其结点大于或小于其子节点。大于是大堆,小于是小堆。堆的操作有哪些堆的初始化我建立了一个堆结点hp,这样在后面调用堆操作函数中方便调用,这个结点中包括了堆(就是数组)的指针a,堆(就是数组)的大小capacity,以及堆(就是数组)下标size。#include<stdio.h>#include<assert.h>#...

2019-07-26 16:19:59 235

原创 142. 环形链表 II(C语言实现)

题目:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index ...

2019-07-24 22:39:06 342

原创 141.环形链表

题目:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例 1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例 2:输入:head = [1,2], pos = 0输出:tr...

2019-07-24 17:25:32 81

原创 单链表函数功能实现

#pragma once#include<assert.h>#include<stdio.h>#include<malloc.h>typedef int SDataType;typedef struct SlistNode{ SDataType data; struct SlistNode* pNext;}Node;typedef str...

2019-06-30 18:55:30 601

原创 C语言顺序表功能实现

#include<stdio.h>#include<assert.h>#include<malloc.h>typedef int DateType;typedef struct SeqList{ DateType* arr; size_t size; size_t capacity;}SeqList;void SeqListInit(Seq...

2019-06-01 23:36:11 265

原创 浅谈对指针的理解

初识指针(小白篇)1.指针是什么?计算机的内存中每一个Bit位上存储着一个0或1,C语言规定,在内存中,每八个Bit位为一个字节。所以可以这样理解,在内存中排列着一个接一个的字节,每个字节包含8个Bit位。那么问题来了,如果你想找到其中的某一个字节中存放的数据的话,应该怎么找呢?举个例子,有一排外观一摸一样的房间,每个房间里存放的东西是不尽相同的,如果我想获取特定房间的东西,那么我们在日常生...

2019-05-04 00:31:23 234

原创 c语言中你很可能从不知道的东西之整型提升

举几个例子先例1//输出什么? #include <stdio.h> int main() { char a= -1; signed char b=-1; unsigned char c=-1; printf("a=%d,b=%d,c=%d",a,b,c); return 0; }运行结果如图:...

2019-04-19 22:58:04 509

原创 写一个函数返回参数二进制中 1 的个数

1.写一个函数返回参数二进制中 1 的个数比如: 15 0000 1111 4 个 1程序原型:int count_one_bits(unsigned int value){ int count = 0; int i = 0; for (i = 0; i < 32; i++) { if (((value>>i) & 1) == 1) { co...

2019-04-11 14:31:01 183

原创 c语言操作符总结(基础)

操作符分类算数操作符移位操作符位操作符赋值操作符单目操作符关系操作符逻辑操作符条件操作符逗号操作符下标引用、函数调用和结构成员算术操作符所有符号:+、-、*、/、%要注意的:1、...

2019-04-11 14:24:45 121

原创 C语言关于递归的一些基础问题和思路

1.递归和非递归分别实现求第n个斐波那契数。思路:斐波那契数是指1、1、2、3、5、8…后面的数等于前面两个数相加,第一个数和第二个数是1。用递归的思路很简单,当传入的值是小于2的,返回1就行了。当传入的值是大于2的,再次调用本函数,求他的前一个数,和前一个数的前一个数。代码如下:int fib1(int n)//用递归{ if (n > 2) { return ...

2019-04-01 11:12:27 334

原创 c语言基础题

1.实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定输入9,输出9 * 9口诀表,输入12,输出12 * 12的乘法口诀表。#include<stdio.h>int Multiply(int n){ for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { printf("%...

2019-03-24 17:21:13 121

原创 c语言基础题

1.完成猜数字游戏。#include<stdio.h>#include<time.h>void menu() { printf("************** 1、玩***************\n"); printf("************** 0、退出*************\n"); }void game() { int ret = 0...

2019-03-19 23:09:47 139

空空如也

空空如也

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

TA关注的人

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