vegeone
0%

前言

关于TCP连接的三次握手和断开的四次挥手,现在已经是三刷了。之前在学习过程中不是非常理解,只是知道了这个过程,但是由于往往解释有些官方或抽象,记不住也不理解。现在在理解后准备将自己的理解发表一下,希望能帮到有相同境遇的人。

TCP的连接

偏官方的描述

  1. 客户端(Client)向服务端(Server)发送一个SYN报文,序号()为随机数
  2. 服务端收到后,向客户端发送SYN+ACK的应答报文,,同时发送一个随机序号
  3. 客户端收到后再向服务端发送Ack报文,
阅读全文 »

基本介绍

这是能用AI技术生成图片的开源软件,只要给定一组描述文本,AI就会开始绘图(准确的说是「算图」或「生图」);亦能模仿现有的图片,生成另一张图片。甚至给它一部分涂黑的图片,AI也能按照你的意愿将图片填上适当的内容。除此之外还支持自行训练模型加强生图效果。

环境搭建

我最先使用的是下面介绍①的版本,但是缺少很多插件,用着不是很方便,于是使用了介绍②的版本。

阅读全文 »

知识背景

如何将自己的文件分享给其他人?

直链

实现

把该文件放在自己的服务器当中,其他人去对应网址下载软件。

举例

音乐软件缓存歌曲,小说网站下载小说,应用官网下载软件

缺点

  1. 所有人都去一个服务器下载,抢占网络带宽,导致每个人下载速度很慢
  2. 十分受分享方、服务器的影响,如果分享方或服务器受到影响就无法正常分享文件

BT

优化

不是全都从服务器下载,而是从已下载的人手中获取相对应的文件。

再优化方案,可以每个人都只下载某一部分文件,然后互相交换获取各自所需要的部分。(即p2p)

实现

制作一个种子文件,记录文件信息、分块大小,以及tracker服务器信息(用于获取谁有下载过该文件)。

缺点

  1. 还是无法摆脱服务器
  2. BT的资源分享上传全凭自愿,有些下载了某个文件的人不愿意将他的下载部分贡献出来

磁力

优化与实现

摆脱了服务器的限制。

让每个人都成为tracker服务器。在寻找“谁有下载过该文件”的信息时,会先进入到一个DHT网络,然后在这个网络里寻找tracker。(类似树上DFS)

举例

迅雷

PT

实现

将使用者限制在一个小圈子中,强制每个人只有上传了资源才能进行下载。上传数据量和下载数据量实现对等。

并查集的理解

作为一种数据结构,其核心的是修改与查询,并查集实现的是1.将两组的内容合并以及2.查询两个元素是否在同一组内

并查集的结构往往是以树的形式呈现,所谓的同一组就是是否在同一棵树下,将两组的内容合并就是将一颗的根节点嫁接到另一根树的根节点下面,查询两个元素是否在同一组内就是看两个结点是否在同一棵树下。

阅读全文 »

lambda表达式的理解

lambda表达式的具体定义可以去网上找,我对它的理解就是将一个函数以更简洁的方式,以表达式的形式内嵌在某个函数中。

lambda表达式的应用场景

lambda表达式最常用的是在sort函数中,把cmp函数以lambda表达式直接写在内部,代码如下:

1
2
3
sort(a.begin(),a.end(),[&](int x,int y){//此排序采用降序排序
return x>y;
});

等价于

1
2
3
4
bool cmp(int x,int y){
return x>y;
}
sort(a.begin(),a.end(),cmp);
阅读全文 »

题意

给定一串字符串,求其中有多少长度>=3子串,且该子串中某个字符只出现一次。

思路

最终答案的求取可以通过遍历以i位置为所要求的只出现一次的字符所对应的子串数量来求取。

然后显然我们不可能直接对于每个字符c,都暴力的去找左边有多少个相邻的连续的连续的字符与c不同,以及右边有多少个相邻的连续的连续的字符与c不同。于是,我们需要通过预处理,来记录每个字符左右两边分别有多少个相邻的、连续的、与此字符不同的字符,最终的答案也可以理解为左边挑,右边取,然后相乘即可。假设左边的个数为l,右边的个数为r。那么对于该字符,它的贡献为:

由于还有一个限制是长度>=3,所以对某一边没有符合要求的字符时,需要另一边减去只取一个字符的情况,即:

阅读全文 »

BFS

BFS介绍

BFS,即宽度优先搜索,经常用于图上遍历等。相比于dfs,bfs是横向的搜索,是一层一层找的。

BFS通过队列进行依次处理,对于每个结点的子节点,将它通过排队的形式排在这一层的后面而非直接遍历,对于一颗BFS树,它的BFS序便是一层一层的向下拓展。

同时BFS由于是层层遍历,先访问到的一定是距离初始点最短的。

bfs的常规遍历顺序

阅读全文 »

DFS

DFS介绍

DFS,即深度优先搜索,经常用于暴力以及图上遍历等。相比于bfs,dfs是纵向的搜索,是一次性找到底的。从根找到底,然后退回来换条路继续走到底,直到走完。

DFS可以理解为是递归+回溯。对于一棵DFS树,其搜索的方式是从根结点开始,沿着一条边一直走到底,层层递归,每次进入一个子节点就可以理解为一个新的以此子节点为根的DFS树,称之为递归。当访问到叶子结点时,又需要将叶子结点的信息返回并总结到该叶子节点的父亲节点,称之为回溯。

DFS大部分分为树上DFS与图上DFS,但其实两者是相通的,图上DFS可以将上下左右四个方向的遍历结果转化为该位置的四个儿子结点,此时还需要一个vis数组用来记录该儿子结点是否在别的分支出现过,尽管从一个点到另一个点会有多条路径,但如果不是要求最短路径的情况下,往往只需要记录一次即可。

dfs的常规遍历顺序

阅读全文 »