- 博客(46)
- 收藏
- 关注
原创 答疑篇——不是三次握手行吗?握手的时候可以传输数据吗?
为什么不能两次握手或者四次握手:(等同于小于三次,或者大于三次握手行不行)我们首先得明确三次握手的目的(上上次的文章中有写道):如果只有两次,没有第三次,那么服务端就不知道客户端的接收能力是否正常,所以就从这个出发点去思考。假设两次握手完成了,在传输数据的时候客户端还没有收到(网络拥堵晚到了,但是迟早会收到),可是服务器端并没有察觉,因为客户端没有给服务端任何的反馈,(俺不知道你的接收能力呀)服务端就会疯狂的重新发送,这样就造成了大量的资源浪费而四次握手当然完全也可以,都能知道对方的发送..
2021-11-27 01:57:38
2436
3
原创 都握手了,怎么能少得了挥手嘞
四次挥手只有一个目的:让双方都知道对方想要断开连接并且把该传输的数据都传输完假设是由有客户端发起的断开请求:第一次挥手:客户端给服务器端发送一个FIN标志位和seq,就像是在告诉服务器,"我想跟你断开连接,但是如果你有数据还想跟我发送的话可以发,或者你也想断开的话,你告诉我一声”,第一次挥手之后,客户端处于FIN_WAIT1状态第二次挥手:第二次就是回应客户端,“我收到你的FIN了,我知道你要分手,你等我把数据发完咱们就分手吧”,并回复ACK,acknum,seq,(这些东西..
2021-11-24 23:39:38
303
3
原创 这就是三次握手~
三次握手只有一个目的:就是想让双方都知道对方的发送能力和接收能力是否正常,我先很通俗的解释一下,用甲乙两方举个例子吧~第一次甲向乙握手成功:乙方知道甲方的发送能力没问题第二次乙向甲握手成功:“你能向我握手了,我就知道你肯定收到我的前一次握手请求了”,所有甲方知道乙方接收能力,发送能力均正常第三次握手: 乙方知道甲方的接收能力正常具体是这样的:第一次握手:发送请求连接报文,就是一个SYN标志位=1,还要发送一个seq序号,这个seq序号是随机的,是有随机算法的:IS...
2021-11-23 20:08:47
2820
8
原创 复盘LRU算法
纯手写实现自己输入测试用例:#include<stdio.h>#include<stdlib.h>#include<vector>#include<iostream>#include<algorithm>#include<list>#include<unordered_map>using namespace std;//Least Recently Usedclass LRU {private:
2021-11-15 13:03:11
730
原创 多路IO复用epoll模型
epoll相对于select的优点:1.首先监听的文件描述符不在受限于1024个而且是Lniux下独有的2.当用户量比较活跃的时候效率比较高、3.不在反复的轮询监听遍历所有的文件描述符4.不用来回的在用户态和内核态之间转换/**********************************************************/#include<stdio.h>#include<stdlib.h>#include<unis..
2021-11-14 00:38:34
135
原创 多路IO复用——select函数
int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);参数1:监听的文件描述符的最大数+1参数2:监听的读位图集合参数3:监听的写位图集合参数4:监听的文件错误位图集合参数5:设置一个监听时间,到了时间还没有发生监听事件就select返回0,否则返回监听到的文件描述符个数总和参数2,3,4为传入传出参数,如果位图集合上相应位上的描述...
2021-11-07 01:21:23
497
2
原创 面试题 05.02. 二进制数转字符串
class Solution {public:/*第一次做将小数部分转10进制的题,算很是孤陋寡闻了,不过又算是进步了懂了之后很简单了每次用小数部分*2,取整数部分,直到小数部分为0例如0.6251.将0.625*2=1.25>=1 补12.将0.25*2=0.5<1 补03.将0.5*2=1.0>=1 补1*/ string printBin(double num) { string res="0."; while(num!=..
2021-11-01 23:42:30
58
原创 久违的八大排序~
重新写了一遍这几个排序,每一次写都会有新的收获,怎么这么聪明呢当初他们是怎么想到的hhh重点是学习并领悟其中的思想,而不要囚禁在排序上~#include<iostream>#include<stdlib.h>#include<vector>#include<string.h>#include<stack>#include<algorithm>using namespace std;//冒泡void bubbleSo
2021-11-01 18:38:55
76
原创 手撕树~非递归三种遍历
#include<iostream>#include<stdlib.h>#include<vector>#include<string.h>#include<stack>#include<algorithm>using namespace std;struct TreeNode { int val; TreeNode* lchild; TreeNode* rchild; TreeNode(int val) {.
2021-10-30 20:10:42
110
原创 面试题 04.12. 求和路径
这是不含回溯的求和路径,一定要注意的是题目告知路径不一定是从根节点开始或者叶子节点结束,方向向下就行,因为我没有读清题意,怎么也没有ac,一直当作是有回溯处理,做了好久我很难过。。。大家一定要注意省题,正常的递归就ok啦链接——求和路径/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *
2021-10-27 16:45:17
64
原创 LRU的缓存机制(最近最少使用)
class LRUCache { /*为什么使用了哈希链表这种数据结构:首先用哈希表来查找是因为哈希的查找效率是O(1),但是哈希表是无序的 又想对它实现O(1)的增删改查,所以用双向链表,让哈希表中数据与链表中数据的形成一一对应的映射关系*/private: //最大容量 int cap; //双向链表<key,val> list<pair<int,int>>cache; //哈希表<key,指向<..
2021-10-23 01:34:00
104
原创 拒绝浮躁
最近因为生活上的琐事和杂乱的学校课程让我变的浮躁了不少,所谓这种浮躁的感觉就是让我漂在了一个上不去下不来的处境,现在想想挺后怕这种浮躁的状态,这让我无法静下心来学习,通过各种借口去放松自己,欺骗自己说:要不今天歇一歇?是不是最近对自己太苛刻了,反而没了效率。所以就去工作室和朋友们练练舞弹弹琴和朋友出去吃饭吹nb吧。我真tm太傻逼,这种纯粹欺骗自己的行为真的让我陷入了一个“世外桃源”。可是贪玩之后带来的负罪感打击也并不是那么轻巧,甚至可以说是痛苦。10月20号晚我觉得我还有救!今晚不知羞耻的跟我的老师兼大哥
2021-10-21 01:29:20
110
1
原创 线程间通信——利用信号量模拟经典pc问题
//利用信号量模拟pc问题,可以看作用两个计数器来记录仓库空余空间,和已使用空间;//用数组来模拟仓库,仓库为空时阻塞消费,仓库满时停止生产;上一篇文章用的链表模拟仓库没有仓库满的情况所以就只考虑了仓库为空时阻塞停止消费/**********************************************************/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include.
2021-10-14 20:56:04
92
原创 线程间通信——利用条件变量模拟经典pc问题
//线程间通信模仿是生产者消费者模型——供不应求:生产者每秒生产一个,消费者一直在消费,仓库为空时等待生产者生产。/**********************************************************/#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<fcntl.h>#include<pthread.h>#include...
2021-10-13 14:32:03
98
原创 利用信号捕捉回收子进程
waitpid返回值:成功回收子进程:返回>0的子进程ID非阻塞回收但是当前没有子进程 返回0没有子进程:返回-1方法1:#include<stdio.h>#include<unistd.h>#include<fcntl.h>#include<sys/wait.h>#include<sys/types.h>#include<stdlib.h>#include<signal.h>void ca.
2021-10-07 17:49:40
367
原创 手撕链表~~
链表的创建以及实现增删改查功能,利用了哑节点把头节点“大众化”//创建结构体struct Node {int val;Node* next;Node(int val) {this->val = val;this->next = nullptr;}};//全局变量Node* head;Node* tail;Node* dummyhead;//用数组传参创建链表Node* createList(vector<int>&...
2021-10-06 21:02:36
124
原创 Lniux下的进程间通信——mmap
映射只能按页映射,也就是off_t offset这个参数必须是4096的整数倍的原因,但是可用的映射空间大小也就是size_t length,超过length小于页的大小不会出问题,能自动扩容可用的映射空间,但是这样是不好的,因为这块扩容的可用映射空间是公共区,谁都可以用。当超过页的大小就直接报错了。用mmap进行父子进程中通信:/**********************************************************/#include<stdi...
2021-10-03 16:17:47
67
原创 算法系列——数组5
滑动窗口的两题~有点难度3. 无重复字符的最长子串classSolution{public:intlengthOfLongestSubstring(strings){//特殊值的判断if(!s.size())return0;intres=INT_MIN;intstart=0;unordered_set<char>set;//利用哈希表来判断是否出现了...
2021-10-02 17:20:11
75
原创 汇编语言——实验一查看CPU和内存,用机器指令和汇编指令编程
a在内存中写汇编指令d查看内存中的内容(机器码)u将机器指令翻译成汇编指令r修改ipt执行一条指令观察结果
2021-09-30 21:33:28
181
原创 算法系列——数组4
本节第二题第一次在数组中涉及到滑动窗口的概念,也是双指针的一种变形模式977. 有序数组的平方classSolution{public:vector<int>sortedSquares(vector<int>&nums){/*排序if(!nums.size())return{};intslow=0;for(intfast=0;...
2021-09-30 19:59:57
80
原创 算法系列——数组3
下面两题是对双指针的加深理解26. 删除有序数组中的重复项classSolution{public://做数组和链表的题一定要模拟一下过程,动手画画intremoveDuplicates(vector<int>&nums){//特殊值的判断if(!nums.size())return0;intslow=0;for(intfast=0;fast<nu...
2021-09-29 21:17:11
77
原创 算法系列——数组2
下面这三道题是对二分查找理解的加强34. 在排序数组中查找元素的第一个和最后一个位置classSolution{public://寻找右边界intfindRight(vector<int>&nums,inttarget){intL=0;intR=nums.size()-1;intresRight=-1;while(L<=R){//L<=R是有意义的,L>...
2021-09-28 18:58:59
43
原创 算法系列——数组1
704. 二分查找classSolution{public:/*二分查找的难点在于区间的控制,此题用的区间是前闭后闭[L,R]前闭后闭的二分查找模板如下:*/intsearch(vector<int>&nums,inttarget){intL=0;intR=nums.size()-1;while(L<=R){//此处有“=”,那么L=R时是有...
2021-09-26 22:35:04
49
原创 算法系列——动态规划11
classSolution{public:intminDistance(stringword1,stringword2){/*dp[i][j]数组:以word1[i-1]结尾的字符串转化为word2[j-1]结尾的字符串所需的最小操作数如果两个字符相等:就不需要任何操作dp[i][j]=dp[i-1]dp[j-1];如果两个字符不相等:1:替换:dp[i][j]=dp...
2021-09-23 21:18:20
39
原创 算法系列——动态规划10
392. 判断子序列classSolution{public:/*dp[i][j]:以string[i-1]结尾的字符串和以string[j-1]结尾的字符串相等字符的个数""ahbgdc""0000000a0111111b0012222...
2021-09-22 22:31:56
51
原创 算法系列——动态规划9
1035. 不相交的线classSolution{public:intmaxUncrossedLines(vector<int>&nums1,vector<int>&nums2){/*dp[i][j]:以nums[i-1]结尾的数组与nums[j-1]结尾的数组元素相等且不相交的线的条数""...
2021-09-19 21:13:24
78
原创 网络是怎样连接的有感2
第二章——探索操作系统中网络控制软件(协议栈)和网络硬件(网卡)在有感1最后简单的讲了准备好http消息和IP地址后要委托操作系统协议栈来传达消息,今天来具体讲一下,里面的的内容其实原比我想象的严谨且复杂的,分为6个小节来理解一下:(1)创建套接字(2)连接服务器(3)收发数据(4)从服务器断开并删除套接字(5)IP与以太网的包收发操作(6)UPD协议的收发操作上图中上层会向下层逐层委派工作应用程序调用Socket库中的解析器,向DNS服务器查询IP地址,在有感
2021-09-17 20:57:49
224
原创 算法系列——动态规划8
718. 最长重复子数组classSolution{public:intfindLength(vector<int>&nums1,vector<int>&nums2){/*dp[i][j]以数字nums1[i-1]结尾的数组与以nums2[j-1]结尾的数组的最长连续公共子数组的长度为什么不是以nums[i]和nums[j]结尾的呢,我想应该也是可以的,只是状态不太容易想到...
2021-09-14 23:02:02
96
原创 算法系列——动态规划7
递增子序列问题300. 最长递增子序列classSolution{public:intlengthOfLIS(vector<int>&nums){//dp[i]表示以nums[i]结尾时的最长递增子序列长度//初始化dp数组都为1,至少也有本身,长度为1//看题目中的示例1:/*index01234567...
2021-09-13 12:17:37
61
原创 网络是怎样连接的有感1
第一章——探索浏览器内部总共分为四个小节讲解:(1):生成http请求消息(2):向DNS服务器查询Web服务器的IP地址(3):全世界DNS服务器大接力(4):委托协议栈发送消息1.1网址:我们口中的网址URL:统一资源定位符,有各种各样的URL,用于访问不同的服务器,比如Web服务器就要用"Http"(超文本传送协议),访问FTP服务器就要用“FTP”(文件传送协议),尽管URL写法很多,但是他们都有一个共同点,即“http:”“ftp:”这些文字都表示浏览器应当使
2021-09-11 21:04:35
5038
原创 算法系列——动态规划6
搞定打家劫舍198. 打家劫舍classSolution{public:/*dp[i]:考虑i个以内的房屋被偷窃的最大金额如果偷i号房间,那么金额就是nums[i]+dp[i-2]如果不偷i号房间,就可能偷i-1号房间,只是可能偷,那么金额是dp[i-1]nums1231idnex0123dp1243dp[i]...
2021-09-09 20:37:23
40
原创 算法系列——动态规划5
搞定股票问题,主要在于有无股票时的状态分析,分析来当前状来自哪个状态,在下面的五个题中都有详细的对应状态的分析121. 买卖股票的最佳时机classSolution{public:intmaxProfit(vector<int>&prices){/*最大利润dp[i][2],下标i应该代表的是第i天,第i天两个状态:有股票手里的钱数,没有股票手里的钱数dp数组:有股份或...
2021-09-07 21:13:04
51
原创 算法系列——动态规划4
今天来讲一下01背包问题,收获满满,感触颇深~用上图举例0-1背包问题1/*dp[i][j]:在[0,i]个物品中任选,放入容量为j的背包中的最大价值有两种情况:1.不装(当前背包的容量装不下)2.不装if(j<weight[i])dp[i][j]=dp[i-1][j];elsedp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]);因为是最大价值,在能装下的情况下不装与装...
2021-09-05 20:31:24
142
原创 算法系列——动态规划3
343. 整数拆分classSolution{public:/*dp[i]:将i拆分后的正整数相乘得到的最大值初始化应该是初始化dp[2]=1;因为初始化dp[0],dp[1]没有意义index012345678910dp##1246912182736dp[i]只能来自于1.j...
2021-09-05 16:07:16
42
原创 算法系列——动态规划2
62. 不同路径classSolution{public:/*dp的二维问题,由题可知当前位置只能来自于上或左dp[i][j]:从(0,0)到达i行j列的位置有多少种不同的路径dp[i][j]=dp[i-1][j]+dp[i][j-1];*/intuniquePaths(intm,intn){//初始化时应该把第一行和第一列都赋值为1;vector<vector<...
2021-09-04 16:55:19
128
原创 算法系列——动态规划1
509. 斐波那契数classSolution{public:/*0123581321....要算出dp[i]只需要dp[i-1],dp[i-2],可进行空间上的优化只需要定义一个两个空间的数组dp[2]:反复的进行更新*/intfib(intn){/*if(n<=1)returnn;vector<int>dp(n+1);dp[0]=...
2021-09-04 16:53:51
150
原创 算法系列——二叉树9
701. 二叉搜索树中的插入操作classSolution{public:/*二叉搜索树的插入并不需要重新调整,只需要在末尾插入就行遍历的是一条路径,插入成功后需要即使的返回递归函数:在以root为根的树中插入val节点,返回插入之后的树*/TreeNode*help(TreeNode*root,intval){if(!root){TreeNode*node=newTreeNod...
2021-09-03 17:14:37
436
原创 算法系列——二叉树8
236. 二叉树的最近公共祖先classSolution{public:/*定义递归函数:在以root为根节点的树中找到节点p,q的公共祖先节点并返回此过程是暗含回溯的,不管有没有找到p,q都要返回值,从下向上返回值,第一时间想到自底向上的后序遍历确定递归结束条件,当找到p,q的时候要返回,没找到即找到叶子节点的的时候也要返回*/TreeNode*lowestCommonAncestor(TreeNode*root,TreeNo...
2021-09-03 17:11:49
56
原创 算法系列——二叉树7
530. 二叉搜索树最小绝对差classSolution{public:/*找最小差值,因为是二叉平衡树,利用左小右大的性质,中序遍历,最小差值一定在相邻的两个节点之间递归函数返回值应该是void因为要遍历整颗树,找到最小值*/TreeNode*pre;intres=INT_MAX;voidhelp(TreeNode*root){if(!root)return;help(ro...
2021-09-03 17:10:24
54
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人