自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++_多态(深入理解虚函数表)

多态多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票怎么构成多态并没有构成多态,形参p对象,全部调用了Person类的成员函数。多态与重写这时候就需要使用虚函数来构成多态。梳理一下,多态的条件:继承类中,需要对虚函数进行重写。基类的指针或者引用都去调用这个虚函数而重写的条件3. 父子类中的函数都是虚函数。4. 函数名参数返回值都要相

2021-05-13 20:40:38 4719 24

原创 进程间通信(管道与共享内存)

目录进程间通信目的进程通信的发展管道匿名管道管道读写规则1. 写端不关闭文件描述符,不写入,(管道为空)读取条件不就绪,读端就可能就会长时间阻塞2. 读端不关闭文件描述符,不读,(管道满了)写条件不就绪,写端就会被阻塞3. 写端关闭文件描述符,读端读取完之后,读到文件结尾4. 读端关闭文件描述符,写端可能会被杀掉站在内核理解管道管道特点命名管道进程间通信目的数据传输:一个进程需要将他的数据发送给另一个进程资源共享:多个进程需要共享同样的资源通知事件:一个进程需要向一个或一组进程发送消息,通知他们发

2021-04-12 20:58:18 2490 3

原创 Linux操作系统(fork函数,task_struct内容,僵尸进程,孤儿进程,sysytemd与init)

这里写目录标题认识fork认识fork通过man fork可以看出这个函数创建了一个子进程调用fork函数,查看实际表现出来的现象 #include<stdio.h> 2 #include<unistd.h> 3 4 int main() 5 { 6 printf("输出一遍\n"); 7 fork(); 8 sleep(1); 9 printf("输出两遍pid:%d,ppid:%d\n",getpid(),getppid

2021-02-15 16:29:10 6637 15

原创 Linux操作系统基础(了解操作系统,操作系统的管理,进程详解)

我们常见的计算机,大部分都遵守冯诺依曼体系。输入设备:键盘,鼠标,摄像头,麦克风,网卡,硬盘等存储器:内存(掉电易失性存储介质)中央处理器:运算器:控制器:输出设备:显示器,声卡,喇叭,硬盘...

2021-02-12 19:10:35 3540 5

原创 赛马问题及其变形

25个马,五条跑道,不能计时,只能通过比赛比较出差异。最少需要几场才能求出最快的3匹马假设5个跑道A-C,每一组马对应编号1-5。先来看怎么比出最快的第一匹马,每一组比一次,决出每一组最快的马。每一组最快的马在比一次,决出最快的一匹马。一共5+1=6次。那么怎么求出最快的3匹呢,假设决出来是A1最快,那么此时需要比较A2和B1.。所以top3需要,5+1+1=7次。...

2021-09-18 18:58:56 244

原创 九球称重和得到 4 升的水

有 9 个球,其中 8 个球质量相同,有 1 个球比较重。要求用 2 次天平,找出比较重的那个球。将这些球均分成 3 个一组,共 3 组,选出 2 组称重,如果 1 组比较重,那么重球在比较重的那 1 组;如果 1 组重量相等,那么重球在另外 1 组。对比较重的那 1 组的 3 个球再分成 3 组,重复上面的步骤。有两个杯子,容量分别为 5 升和 3 升,水的供应不断。问怎么用这两个杯子得到 4 升的水。先将3升倒满,放进5升中。在将3升倒满放入5升中,此时3升杯子还剩一升水倒掉5升.

2021-08-24 19:50:17 253 1

原创 轮流拿书问题

100本书,两个人轮流拿,每次拿1~5本,你先拿,有没有啥策略可以保证你可以拿到最后一本?最后只要剩下6本,这样无论他怎么拿,我都能拿到最后几本 。所以现在分配前面94本,对方每次拿N本,N取值范围为1-5,然后我每次拿6-N本。这样保证每次取得总和是6本。94%6=4.所以我只需要最开始拿3本就可以。...

2021-08-24 18:56:13 898

原创 兔子试毒问题

有1000瓶药水,其中有一瓶是毒药,只要喝上一滴,一天之后必死。先提供一批兔子,找出毒药。时间优先直接1000个兔子,每一瓶尝试一下。空间优先也就是使用最少的兔子。二分法,最开始500,500一组。让一个兔子尝试其中一组,假如死了就换一只兔子,假如安全就可以让这只兔子继续尝试。这样可以排除掉一半。这样1000->500->250->125->63->32->16->8->4->2->1。尝试了10次,即使最坏情况我们只用了10个兔子,但是也

2021-08-21 22:43:33 424

原创 五种IO模型与多路转接

IO=等待+数据拷贝,读IO=等读事件就绪+内核数据拷贝至用户空间。写IO=写事件就绪,用户空间拷贝至内核空间。那么怎么将IO变的高效呢?本质就是尽可能的减少等的比重。五种IO模型举一个钓鱼的例子,钓鱼=等待+将鱼钓上去张三:一直死盯着鱼竿,有鱼上钩然后然后钓上来。李四:李四一会看一下鱼竿,发现没有异动,在这个间隔的期间他可以看书。当再次看的时候有鱼上钩就会吊起。王五:买了一个铃铛挂在杆上,他看都不看鱼竿一眼,没鱼上钩的时候,一直在看书,有鱼上钩的时候,铃铛响的时候再去钓上来。赵六:我有10

2021-08-17 11:42:40 238

原创 子序列与子串问题

最长公共子序列class Solution {public: int longestCommonSubsequence(string text1, string text2) { vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0)); for(int i=1;i<=text1.size();i++) {

2021-08-16 17:56:56 287

原创 其他的协议以及整体总结

之前学了,HTTP/HTTPS。TCP/UDP,IP,MAC。辅助协议有DNS(应用层)底层为TCP。DHCP(应用层) 底层为UDP。ARP协议(数据链路层)IP转换为MAC地址。基于TCP的应用层协议Http:超文本传输Https:超文本加密传输FTP:数据连接SSH:加密登录Telnet:远程登录DNS(与其他域名服务器交互时):域名解析基于UDP的应用层协议NFS:网络文件系统TFTP:简单文件传输DHCP:动态主机配置BOOTP:启动协议DNS(服务器与客户端交

2021-08-16 06:05:44 220

原创 网络层与数据链路层

TCP解决了,数据的可靠和效率。IP负责转发和路由。HTTP负责,构建与解析request和response。调用recv和send时触发TCP协议。TCP解决了,可靠性和效率,即什么时候发,发多少的策略。注意他没有发。IP负责,数据转发和路由选择。主机: 配有IP地址, 但是不进行路由控制的设备; 路由器: 即配有IP地址, 又能进行路由控制; 节点: 主机和路由器的统称ip协议格式ip怎么交给上层那个协议?ip有个8位协议,可以向上交付。怎么分离有效载荷和数据?他既有总长度也有4位首

2021-08-15 22:29:00 843

原创 输入一个URL发生了什么

目录孤单小弟 HTTP真实地址查询DNS可靠传输TCP远程定位IP两点传输MAC最终孤单小弟 HTTP一个URL的组成首先浏览器需要对URL进行解析,从而生成发送给web服务器的请求信息。URL是就是请求服务器的文件资源。假如不带文件路径呢?通常服务器会在根目录下放置一个默认的Index.html,返回他即可。浏览器解析出URL,确定了对方的web服务器和文件名。生成请求。一个孤单的HTTP数据包背起了行囊。真实地址查询DNS通常输入的服务器域名是字符串,因为直接输入IP难以记忆。

2021-07-31 22:40:15 204 1

原创 传输层(TCP与UDP)

UDP协议特点无链接,知道对端ip和端口号直接进行传输,不需要建立链接不可靠,假如因为某种原因发送失败也不会返回应用层任何信息面向数据报,有明显的分界,不能灵活控制读写数据的次数和数量面向数据报:应用层交给UDP的思数据,UDP原样发送,既不拆分也不合并。假设发送端,sendto100个字节的数据,那么接收端也必须调用recvfrom一次接收100个字节,而不是循环接收10次一次10个字节协议格式16位UDP总长度,表示整个数据报的最大长度如果校验和出错,就会直接丢弃。怎么将

2021-07-27 22:39:20 206

原创 设计高并发内存池释放流程

目录线程缓存释放中心缓存释放页缓存释放疑问及解答线程缓存释放挂得越来越多,等于MAX_SIZE,慢启动所导致的MAX_SIZE大小。说明都回来了,便开始归还到中心缓存中心缓存释放归还到中心缓存怎么找到,分割出去的Span呢,在这个桶下,同一大小的Span有多个。以下图为例,在申请的时候,页缓存释放疑问及解答...

2021-07-16 23:05:30 113

原创 设计高并发内存池申请流程

实现线程缓存分析完整体架构我们来从最底层实现。取下一个对象之前提到这里使用头四个字节来存下一个对象的。适用于32位以及64位头插与头删将对象头插与头删这样就可以实现从自由链表中放对象,拿对象。和STL空间配置器结构类似,多个不同大小的对象,所以用一个对象数组。假如我们最大也是128个字节,以8为间隔,那么数组长度就是16对象映射到桶现在来一个对象,怎么算他在那个桶呢?TLS技术测试公共头文件#pragma once#include <iostream&

2021-07-16 22:07:11 163 2

原创 高并发内存池整体架构

目录提要分析线程缓存中心缓存页缓存提要在之前分析的定长内存池和哈希映射的自由链表内存池为什么没解决呢?对于2和3分析线程缓存线程缓存,每个线程独有,当小于MAX_BYTES我们定义为64k,线程从这里申请内存,不需要加锁因为每个线程独享一个cache,这也是这个并发线程池高效的地方。中心缓存中心缓存所有线程共享一个,线程缓存按需从中心缓存获取自己的对象。中心缓存周期性回收自己在线程缓存中的独享,避免一个线程占用太多对象,其他线程吃紧。达到内存分配在多个线程更加均衡的按需调度。所以中心

2021-07-16 19:56:21 158 2

原创 简单内存池与定长内存池

目录内存碎片最简单的内存池申请释放定长内存池哈希映射的freelist池内存碎片最简单的内存池申请释放定长内存池哈希映射的freelist池内碎片对比内碎片与外碎片

2021-07-16 18:40:05 178 1

原创 动态规划练习

乘积最大子数组普通解法class Solution {public: int maxProduct(vector<int>& nums) { int n=nums.size(); vector<int> maxdp(n,0); vector<int> mindp(n,0); maxdp[0]=nums[0]; maxdp[0]=nums[0]; for(int

2021-07-02 11:27:42 133

原创 分割回文串,编辑距离,不同子序列

目录分割回文串普通解法优化时间编辑距离普通解法不同子序列普通解法优化空间分割回文串普通解法class Solution {private: //O(n^3)差点超时 bool isPal(const string& s,int left,int right) { while(left<right) { if(s[left]!=s[right]) return false;

2021-06-30 10:30:21 163 3

原创 0-1背包问题

有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.问最多能装入背包的总价值是多大?举个用例,画图分析普通情况class Solution {public: int backPackII(int m, vector<int> &A, vector<int> &V) { int n=A.size(); vector<vector<int>> dp

2021-06-30 09:59:04 125

原创 动态规划(Dynamic Programming)

Dynamic Programming动态规划是分治思想的延伸,就像之前的递归一样,大问题分解成小问题。但是递归有个不好的地方,对于复杂问题时间,空间复杂度十分的高,结果也不会保存。比如:快速排序,没有三数取中优化的话,会导致栈溢出。所以动态规划一般都是采用非递归,而且结果可以保存,这就是他们本质的区别。动态规划特点:把原来的问题分解成几个相似的子问题所有的子问题只需解决一次储存子问题的解动态规划的本质,是对问题状态的定义和状态转移方程的定义(状态以及状态之间的递推关系)所以动规问题

2021-06-30 09:44:49 294 6

原创 回溯(Flash back)学习

回溯是一种通过穷举所有可能情况来找到所有解的思想。如果一个候选解最后被发现并不是可行解,回溯思想会舍弃它,并在前面的一些步骤做出一些修改,并重新尝试找到可行解。回溯一般会结合在搜索算法中电话号码组合Map建立号码与字符串映射。在代码中,DFS里,curStr+e即一个回溯的过程。例如当前是cur是空串,e依次被映射为abc,先从a开始,继续调用DFS,由于index++,所以e依次被映射到def,所以curStr现在是a,就开始和def两两组合,符合条件入结果数组。执行完后回溯,curStr成为b,

2021-06-23 17:34:45 244 1

原创 广度优先搜索(Breadth First Search) 学习

目录员工重要性N叉树的层序遍历腐烂的橘子单词接龙最小基因变化打开转盘锁借助队列其先进先出的特点,将要搜索的放在队尾,他是一种地毯式搜索,所以第一次找到目标,一定是最短路径员工重要性/*// Definition for Employee.class Employee {public: int id; int importance; vector<int> subordinates;};*/class Solution {public: in

2021-06-23 16:34:26 159

原创 深度优先搜索(Depth First Search)学习

不撞"边界"不回头。代表性的便是,二叉树的前序,中序,后序遍历方法。员工重要程度编号代表遍历顺序,由深到浅。/*// Definition for Employee.class Employee {public: int id; int importance; vector<int> subordinates;};*/class Solution {public://也可以不用每次传哈希表,把它当做一个私有成员变量 int DFS(un

2021-06-23 14:44:49 295

原创 手写AVL树(详解插入时的4种旋转)

二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N)。所以科学家对二叉搜索树采取平衡处理,实现出AVL树。当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。当这棵树是AVL树的时候,它的左右子树都是AVL树且左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)如果一棵二叉搜索树的高度是平衡的,它就是AVL树。如果它有n

2021-06-03 22:09:01 369 3

原创 HTTP与HTTPS(详谈TLS秘钥协商过程)

接收到response错误码,我们经常看到的页面是一个404错误页面,而状态码是给页面的参考值。

2021-06-02 19:43:51 975 8

原创 STL容器_map与set

序列式容器与关联式容器之前学的vector、list、deque都是序列式容器,在逻辑结构上是线性表。(栈和队列是容器适配器)而今天所学习的map与set是一棵搜索树,它叫做树型结构关联式容器,之后会学习的哈希表他是一种哈希结构关联式容器。关联式容器:关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高树型结构的关联式容器主要有四种:map、set、multimap、multiset。这四种容器的共同点

2021-05-31 11:09:50 197 1

原创 自顶向下理解网络协议(应用层_HTTP协议)

客户端主动发起请求,服务器被动接收信息。而客户端是发起链接,建立链接的过程叫做三次握手。三次握手客户端询问服务器是否可以和你建立链接。向服务器发送携带SYN标志位的数据报。服务器回应客户端,可以建立链接,什么时候建立呢?向客户端发送携带SYN+ACK报文客户端回应服务器,就现在向服务器发送ACK报文然后链接被建立,操作系统需要维护链接,还要创建对应的数据结构...

2021-05-26 22:58:06 1073 15

原创 网络套接字(Udp与Tcp应用)

在网络通信中,凡是我们所写的代码,采用的接口都是系统调用接口,编写的程序都叫用户层程序,我们接下来的工作就是在用户层自定义协议。在网络模型中就是应用层,那么就是要使用传输层的接口(但是有原始套接字可以绕过传输层)认识套接字IP在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址。有了IP地址能够把消息发送到对方的机器上,但是跨网络传输还需要有一个其他的标识来区分出, 这个数据要给对方的哪个程序进行解析。即IP在公网当中全网标识一台主机,发送的时候,不仅需要目的IP,通信也要

2021-05-24 09:22:28 1271 11

原创 二叉搜索树(KV模型,二叉搜索树删除节点)

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树每个子树均满足这个特征。他可以用来搜索,在我们以前怎么搜索呢,之前的数据结构不仅能存储数据,也能查找数据。最优搜索便是二分查找,但是二分查找前提必须有序,最快的一个排序也是n*logn,并且二分查找必须要在Vector中,头插,中间插,头删,中间删的挪动数据的复杂度也很高。他是一种

2021-05-19 19:08:09 486 2

原创 网络基础架构(从数据传输理解网络)

网络与系统关系将数据放到网络里,把数据从网络拿出来,全部依赖于网卡。网络背景独立模式:早年开始为独立模式,由于每个人业务不同,多人共享时需要人手动操作。网络互联:在发展时,通过一个服务器,每个人将数据上传到一个服务器中,然后实现共享。局域网(LAN):后来由于计算机数量越来越多,通过交换机将路由器全部连接在一起广域网(WAN):将每个大局域网中,远隔千里的计算机连接起来在学习网络的同时一定不能忽略硬件设备。认识协议其实我们所学的网络和计算机体系结构中的网络,唯一区别就是。线

2021-05-09 22:25:23 6149 13

原创 C++_继承(菱形继承与虚基表)

什么是继承继承是什么:继承是面向对象程序设计、使得代码可以复用的重要手段,它允许程序员在保持原有特性的基础上进行扩展,增加功能,这样产生的新类,称之为派生类继承的目的:让子类继承和复用父类定义的成员和方法、继承下来的变量是独立的、各自拥有各自的内存空间。继承方式和访问限定符可见在派生类中,子类的访问方式是,MIN(继承方式,基类访问方式)实际基类的private成员在派生类不可见,只是语法上无法访问,假如你调用基类的方法还是可以用的。但是调用继承的方法可以用使用关键字c

2021-05-08 12:38:58 545 3

原创 Linux多线程_(线程池,单例模式,读者写者问题,自旋锁)

目录线程池是什么为什么怎么样线程池线程池是什么一种线程使用模式。可以避免大面积请求引起的服务器宕机。为什么线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。怎么样线程池的应用场景:需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务

2021-05-05 11:23:09 306

原创 Linux多线程_(线程同步,基于阻塞队列的生产者消费者模型)

目录线程同步的概念为什么要有线程同步条件变量初始化销毁等待条件满足唤醒等待生产者消费者模型线程同步的概念在保证数据安全的情况下,让多个执行流,按照特定顺序对临界资源进行访问,叫做同步。为什么要有线程同步线程互斥是为了,让访问临界资源不会出错。假如有一个竞争力强的线程一直执行任务,那么其他线程竞争不过他,虽然这个过程中也没有出错,但是效率变低,而线程同步则是当一个进程结束工作,通知下一个进程来执行,这样协同工作可以更高效的完成任务。而这种通知事件,就是用条件变量完成的。struct cond{

2021-05-04 10:54:48 276 2

原创 Linux多线程_(Posix信号量实现环形队列生产者消费者模型)

是什么信号量也叫做信号灯,本质是一个计数器。因为互不影响,所以多个线程可以同时进入。但是我们害怕控制不了进程的个数。所以引入信号量,相当于一个监测机制。count-- pcount++ v为什么怎么用...

2021-05-04 10:36:44 533 3

原创 Linux多线程_(进程与线程,线程的生命周期认识线程,线程互斥)

所有的一整块叫进程,每一个task_struct是一条执行流。进程:承担分配资源实体的基本单位。线程:调度的基本单位。线程是进程内部一条执行流。线程在进程的地址空间运行。

2021-05-01 15:15:15 1226 9

原创 List的模拟实现(erase的迭代器失效)

vector和string的迭代器是原生指针,无论是解引用还是++,都可以得到自己想要的值。链表的迭代器不能是原生指针了,链表的解引用是想要链表的值,++是想到下一个节点,那么假如是原生指针的话解引用是一个结构体,++是下一个结构体。等等,所以我们要通过重载运算符来模拟我们想要的行为。所以迭代器也被成为一种设计模式。对于不同的类,不需要知道你的内部实现,就可以对你进行访问和修改。而对于赋值重载,需要实现深拷贝吗,不需要,我就是想要你那个节点的值。析构函数,不需要自己实现,因为迭代器是访问数据,修改数据

2021-04-24 16:08:45 268 2

原创 模拟实现vector(insert与erase迭代器失效)

目录1. 迭代器2. 构造函数2.1 无参构造2.2 迭代器构造2.3 拷贝构造2.4 赋值重载3. 析构函数4. 有效元素的个数5. 容量大小6. 重载[]7. 检查容量8. 扩容9. resize10. 插入11. erase插入与删除迭代器失效总结vector实现代码这是STL源码剖析中对于vector逻辑结构的一张图。和之前的顺序表不一样,成员变量我们采用的是一个个指针,start指向数组的首元素,finish指向末尾元素的下一个。endofstage指向数组容量的下一个。扩容Linux下是两

2021-04-24 14:51:21 347 2

原创 非类型模板参数与模板特化

目录1. 非类型模板参数2. 模板的特化2.1 函数模板的特化2.2 类模板的特化2.3 全特化与半特化1. 非类型模板参数之前由于一个类,我们想让里面的参数类型不同,引入了模板,不用重复写冗余的代码。现在有一个静态顺序表,其大小示固定的,假如想让他变化,碰见了和之前类似的问题。其实也可以用模板解决,size_t N=100,他是一个非类型的常量,确实,不是常量他也不可能做数组的大小。注意:不过通常不用静态的顺序表,栈只有8M。注意:非类型模板参数是一个常量浮点数、类对象以及字符串是

2021-04-23 11:10:35 285 1

课程设计:基于Java的超级玛丽游戏的设计与实现.zip

项目源码,视频,素材,说明文档

2021-01-31

空空如也

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

TA关注的人

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