自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(150)
  • 问答 (1)
  • 收藏
  • 关注

原创 JavaScript数据类型

而”==“被称为宽松等于,只比较值,不比较类型,如果类型不同,会尝试进行类型转换。包括push、unshift、splice、concat、pop、shift、slice、indexOf、includes、find、reverse、sort、join、every、forEach、filter、map等。包括concat、substr、substring、trim、repeat、toLowerCase、toUpperCase、chatAt、split、match、search、replace等。

2024-04-18 20:51:26 369

原创 计算机网络-TCP断开连接阶段错误应对机制

如果在等待发送ACK期间,对方的第二个数据报文又到达了,这时就会立刻发送ACK。如果开启了延迟应答的TCP,并且没有响应数据要发送,那么就可能看到ACK和FIN报文合并的情况。第二次和第三次挥手不能合并,因为在回复第二次挥手的时候,可能还有数据没有接收完成,所以需要先回复ACK报文,等待所有的数据接收完成之后再发送FIN报文。这是因为TCP为了确保数据的可靠性,采用了超时重传的策略。:如果进程崩溃,操作系统会在回收资源的时候代为进行挥手过程,这与主机宕机是不同的,因为TCP的连接信息是由内核维护的。

2024-04-08 12:44:40 1035

原创 计算机网络-TCP连接建立阶段错误应对机制

SYN攻击是攻击者伪造IP地址发送SYN请求,服务端收到大量请求但是发送的SYN+ACK没有回应,导致半连接队列占满,后续的SYN报文就会丢弃。防范措施包括调大接收数据包的队列的大小,减少SYN+ACK重传次数,增大SYN队列大小,以及启用syncookies功能。:三次握手的目的是确保双方都具有接收和发送的能力,防止乱序报文影响,以及确保双方的初始序列号能被可靠地同步。:如果是握手阶段的报文丢失,那么由发送方进行超时重传,每次发送触发的RTO翻倍,直到达到最大重传次数断开。

2024-04-08 11:24:50 471

原创 计算机网络-TCP重传、滑动窗口、流量控制、拥塞控制

重传机制滑动窗口机制流量控制拥塞控制

2024-04-06 09:50:51 789

原创 计算机网络-TCP基础、三次挥手、四次握手过程

TCP基础TCP头格式TCP连接三次握手过程四次挥手过程

2024-04-06 09:46:59 751

原创 计算机网络-HTTP相关知识-HTTP的发展

HTTP/2.0引入了二进制分帧层,这是一个新的抽象层,位于应用层和传输层之间。在这个层次上,HTTP消息被分解为多个较小的消息和帧,然后进行交互。这种设计使得HTTP/2.0可以更有效地利用网络资源,提高传输效率。

2024-04-03 21:31:09 1195 1

原创 计算机网络-HTTP相关知识-RSA和ECDHE及优化

RSA流程 ECDHE流程 HTTPS优化

2024-04-02 15:25:35 1053

原创 计算机网络-HTTP相关知识-HTTPS基础

HTTP与HTTPS的区别:HTTPS解决的风险:密码学前提:HTTPS的机制:

2024-04-02 10:00:47 610

原创 计算机网络-HTTP相关知识-基础

HTTP基础HTTP请求方法HTTP缓存技术

2024-03-31 20:46:24 749

原创 计算机网络-从输入网址到访问网站的全过程

TCP协议的工作流程包括三次握手(建立连接)、SSL/TLS(加密报文传输,保障数据安全)、分割数据、报文生成(包括TCP头部和数据部分,数据部分又包括HTTP头部和数据)以及四次挥手(断开连接)。浏览器会逐层向上级DNS请求,如果上级DNS的缓存中没有需要的信息,就会继续向上级请求,直到找到对应的IP地址。:在局域网内,交换机根据MAC地址表查找目标MAC地址,然后将信号发送到相应的端口。:网卡驱动程序控制网卡的工作,包括添加帧头(起始标记)和帧尾(校验),将内容复制到网卡的缓存区,转化为电信号并发送。

2024-03-31 10:10:31 720 1

原创 计算机网络-TCP/IP 网络模型

真的只有图解。

2024-03-30 21:49:51 909

原创 Git相关命令(二)

第一次是选择如何 rebase ,它会从上到下从老到新列出区间内每次 commit ,一行的一个参数表示对这次 commit 做什么操作,第二个参数就是commit的版本号,其中, pick 代表包括这次 commit , squash 代表将这次 commit 合并到上面第一个 commit ,那么我们只需要将第一行改为 pick ,后面的改为 squash 即可完成合并。这是 github 的操作,而不是 git,fork 的仓库不是分支,但是可以通过 pull request 申请向原仓库合并。

2024-03-26 13:59:57 479

原创 Git相关命令(一)

Git 是一个开源的分布式版本控制系统。当然, git 不会傻傻的把你的每一个版本完整的存储下来,他仅仅会存储每次修改的位置和内容(可持久化),每一次 commit 可以理解为产生一个版本,接下来的版本控制命令都是基于这个commit的),但不能依赖于图形化界面,因为有一些操作是图形化界面做不到的。

2024-03-26 13:41:48 1049

原创 Docker的Ubuntu上的安装教程及相关命令

Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,这个容器是完全使用沙箱机制(限制容器内部对系统资源的访问),更重要的是容器性能开销极低。正是因为Docker的各种特性,我们常用Docker来部署Web开发环境以及Web应用的发布。

2024-03-25 14:18:05 1034

原创 C语言基础知识入门(六)

十五、位操作1、二进制数、位和字节(1)、二进制整数(1)、有符号整数(1)、二进制浮点数2、其他进制数(1)、八进制(1)、十六进制3、C按位运算符(1)、按位逻辑运算符(1)、用法:掩码(1)、用法:打开位(设置位)(1)、用法:关闭位(清空位)(1)、用法:切换位(1)、用法:检查位的值(1)、移位运算符4、位字段(1)、位字段示例(1)、位字段和按位运算符5、对齐特性(C11)十六、C预处理器和C库1、翻译程序的第一步.

2022-08-03 09:17:38 219 1

原创 C语言基础知识入门(五)

十三、文件输入/输出1、文件概览(1)、文件是什么(2)、文本模式和二进制模式(3)、I/O的级别(4)、标准文件2、标准I/O(1)、检查命令行参数(2)、fopen()函数(3)、getc()和putc()函数(4)、文件结尾(5)、fclose()函数(6)、指向标准文件的指针3、 一个简单的文件压缩程序4、文件I/O(1)、fprintf()和fscanf()函数(2)、fgets()和fputs()函数5、随机访问:fseek()和

2022-08-02 20:51:35 209

原创 C语言基础知识入门(四)

十、数组和指针1、数组(1)、初始化数组(2)、指定初始化器(C99)(3)、给数组元素赋值(4)、数组边界(5)、指定数组的大小2、多维数组(1)、初始化二维数组(2)、其他多维数组3、指针数组4、函数、数组和指针(1)、使用指针形参(2)、指针表示法和数组表示法5、指针操作6、保护数组中的数据(1)、对形式参数使用const(2)、const和其他内容7、指针和多维数组(1)、指向多维数组的指针(2)、指针的兼容性(3)、

2022-08-01 11:20:44 223

原创 C语言基础知识入门(三)

七、C控制语句:分支和跳转1、if语句2、if-else语句(1)、多重选择else if(2)、else与if配对(3)、多层嵌套的if语句3、逻辑运算符(1)、优先级(2)、求值顺序(3)、范围4、条件运算符:?:5、循环辅助:continue和break(1)、continue语句(2)、break语句6、多重选择:switch和break(1)、switch语句(2)、只读每行的首字符(3)、多重标签(4)、switch和if e

2022-07-31 11:43:47 153

原创 C语言基础知识入门(二)

四、字符串和格式化输入/输出1、字符串简介2、char类型数组和null字符(1)、使用字符串(2)、strlen()函数3、常量和C预处理器(1)、const限定符(2)、明示常量4、printf()和scanf()(1)、printf()函数(2)、使用printf()(3)、printf()的转换说明修饰符(4)、转换说明的意义(5)、使用scanf()(6)、printf()和scanf()的*修饰符五、运算符、表达式和语句1、基本运算符

2022-07-30 08:57:58 169 1

原创 C语言基础知识入门(一)

一、初识C语言1、C语言的起源2、使用C语言的理由(1)、优点(2)、缺点3、C语言的发展方向4、计算机工作的基本原理5、语言标准(1)、C99标准(2)、C11标准6、使用C语言的7个步骤(1)、第1步:定义程序的目标(2)、第2步:设计程序(3)、第3步:编写代码(4)、第4步:编译(5)、第5步:运行程序(6)、第6步:测试和调试程序(7)、第7步:维护和修改代码7、编程机制二、C语言概述1、简单程序的结构2、提高程序可读

2022-07-28 21:53:01 225

原创 动态规划(树形dp)

#### 四、树形dp##### (一)、基础树形$dp$是在树的$dfs$中进行$dp$, 在树形$dp$中,我们动态规划的过程大概就是先递归访问所有子树,再在根上合并,我们求解的往往是所有的在子树范围内的最优解##### (二)、例题1、子树大小(1)、题意:计算每个点的子树的大小(2)、题解:状态表示:$sz[u]$代表$u$为根的子树大小状态转移:$sz[u]=1+\sum sz[v]$,指本节点的子树大小等于子节点的所有子树大小之和加一```cppint sz

2022-07-04 10:56:44 696

原创 动态规划(区间dp)

#### 三、区间$dp$##### (一)、基础1、特点:(1)、合并:将两个或多个部分进行整合,能将问题分解为能两两合并的形式(2)、求解:对整个问题设最优值,枚举合并点,将问题分解为左右两个部分,最后合并两个部分的最优值得到原问题的最优值(3)、复杂度:大多为$O(n^3)$,因此区间$dp$的数据范围一般在$100$左右2、套路:第一层循环枚举区间长度,第二层循环枚举区间左端点,右端点也固定下来,第三层循环枚举区间的分割点状态表示:$dp[i][j]$表示区间$[i,j]

2022-07-02 19:33:52 202

原创 线代(高斯消元法、线性基)

​一、高斯消元法1、将问题转化为矩阵方程,再转化为多个n元一次方程,从而使用高斯消元法使用高斯消元法的关键在于构造增广矩阵2、需求解的未知数可能是很多类型,例如浮点型、01型(1)、异或类型解bitseta[maxn]; //a数组代表增广矩阵的系数,常数项在最后int ans[maxn], Free[maxn], cnt; //ans代表最后方程组的解,Free和cnt是自由元int Gauss(int equ, int var) //equ个...

2022-06-28 20:04:18 469

原创 数学(快速幂)

​一、快速幂通过快速幂,我们计算a^8时,不再是a*a*a*a*a*a*a*a,而是a*a,a^2*a^2,a^4*a^4,这样我们求a^b将是O(log b)的复杂度ll quick_pow(ll a, ll b){ ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans;}二、矩阵快速幂利用快速幂,可以求一个矩阵(方阵.

2022-06-28 09:13:36 98

原创 博弈论入门

一、基础1、公平组合游戏:是一个满足以下条件的游戏:由两名玩家交替行动;任意时刻每名玩家可进行的的操作规则相同;游戏中的同一个状态不可能多次抵达,游戏以玩家无法行动为结束,且游戏一定会在有限步后以非平局结束2、先手必胜状态和先手必败状态,必胜点(N)和必败点(P):(1)、如果后手有一个以上的必败点,那么前驱是必胜点(2)、如果后手全为必胜点,那么前驱为必败点由此可以进行NP分析3、博弈图:给定一个有向图,在图中唯一的起点处有一个棋子,双方轮流按照有向图的边移动棋子,当一方无法移动棋子

2022-06-27 20:43:08 908 1

原创 图论(树的直径)

一、基础树中最远的两个结点之间的距离被称为树的直径,连接这两点的路径被称为树的最长链(也称直径)二、两次遍历求直径1、从任意一个结点出发,通过bfs或者dfs对树进行一次遍历,求出与出发点距离最远的结点,记为p,这就是树的直径的一端2、从结点p出发,通过bfs和dfs对树再进行一次遍历,求出与p距离最远的结点,记为q3、那么p到q的路径就是树的一条直径,因为p一定是直径的一端,否则总能找到一条更长的链。在第二步遍历过程中,可以记录下来每个点第一次被访问时的前驱节点,最后从q回溯到p即可得到直

2022-06-23 13:25:16 209

原创 图论(最近公共祖先LCA)

一、基础1、定义:在一棵有根树上,对于一个结点z,既是x的祖先,也是y的祖先,那么z是x,y的公共祖先,如果z在x,y的所有公共祖先中深度最大的,我们称之为最近公共祖先,记z = LCA(x,y)2、暴力寻找(最坏时间复杂度O(n)):(1)、从x向上走到根节点,并且标记经过的结点,然后令y向上走到根节点,当第一次遇到已标记的点时,就找到了LCA(x,y)(2)、令x,y中较深的点先向上走到x,y等深处,然后同时向上访问,直到访问到同一结点,该结点就是LCA(x,y)二、树上倍增法求LCA

2022-06-22 18:46:51 194

原创 java继承(其它)

一、Object类1、Object类是java中所有类的始祖,在java中每个类都扩展了Object2、使用Object类型的变量可以引用任何类型的对象,进行具体操作的时候需要进行强制类型转化Object obj = new Employee();Employee e = (Employee) obj;3、Object类中的equals方法用于检测一个对象是否等于另外一个对象,如果两个对象引用相等,或者是两个对象有相同的状态,则两个对象相等4、Object类中的hashCode方法可

2022-06-22 09:31:04 179

原创 java继承(超类和子类)

1、如果继承A类来定义B类,这里使用关键字extends表示继承public class B extends A{ //...}2、超类中的方法对于子类并不一定都适用,为此我们需要提供一个新的方法来覆盖(override)超类中的这个方法3、在重写过程中,如果想在子类方法中调用超类的(同名)方法,那么我们需要用super关键字public double getSalary(){ double base = super.getSalary(); return base +

2022-05-17 21:29:22 483

原创 java对象和类(构造、包)

一、对象构造1、构造器通常使用重载的功能,通过参数类型来查找匹配的过程叫做重载解析2、如果构造器中没有显式地为字段设置初值,就会被自动赋为默认值(0、false、null)3、仅当类没有构造器时,类才会提供一个无参构造函数4、可以在类定义中为任何字段赋值,这样就可以实现一个类的所有构造器都把某个特定的实例字段设置为某一值,这个值不一定是常量,也可以调用一个方法来初始化public class Employee{ private String name = ""; private

2022-05-16 19:55:48 360

原创 java对象和类(静态、方法参数)

一、静态字段和静态方法1、如果将一个字段定义为static,那么一个类只有一个这样的字段;对于非静态的实例字段,每个对象都有自己的一个副本。静态字段属于类,不属于任何单个的对象2、对于静态常量,应用往往比静态变量多,而且静态常量往往设置为公共常量,例如:Math类中的PI、System类中的outpublic static final double PI = 3.14159;3、静态方法是不在对象上执行的方法,例如Math类中的pow,它并不使用任何Math对象,也就没有隐式参数this。

2022-05-16 18:48:04 428

原创 c++文件流、string流

一、文件输入输出1、除了继承自iostream类型的行为之外,fstream中定义的类型还增加了一些新的成员来管理与流关联的文件fstream fstrm(s);//创建一个fstream并打开名为s的文件,其中s可以是string也可以是C风格字符串指针fstream fstrm(s, mode); //和前一个构造函数类似,但按指定模式打开文件fstrm.open(s); //打开名为s的文件,并将文件与fstrm绑定fstrm.close();

2022-05-12 21:21:42 570

原创 c++IO库

一、IO类概述1、标准库定义了四个IO对象。(1)、我们可以用一个名为cin的istream类型的对象来处理输入,这个对象也叫标准输入(2)、可以用ostream类型的对象cout,称作标准输出(3)、另外两个ostream对象:cerr输出警告和错误消息,clog输出程序运行时的一般信息2、IO库类型和头文件iostream从流中读写 fstream从文件读写 sstream从string中读写 istream ifstream istringstrea

2022-05-12 19:59:06 317

原创 数论(逆元及其相关定理)

​一、定理1、裴蜀定理(贝祖定理)定理:如果aaa、bbb是整数,那么一定存在整数xxx、yyy使得ax+by=gcd(a,b)ax + by = gcd(a, b)ax+by=gcd(a,b)也就是说如果ax+by=max + by = max+by=m有解,那么mmm一定是gcd(a,b)gcd(a, b)gcd(a,b)的若干倍特别的,当mmm等于1时,ax+by=1ax + by = 1ax+by=1,那么gcd(a,b)=1gcd(a, b) = 1gcd(a,b)=1,即aaa,bbb

2022-05-10 11:09:56 1335

原创 数据结构(可持久化线段树)

一、可持久化的数据结构如果想知道数据集在任意时刻的历史状态(即能保存每次改变前的状态和改变后的状态),那么就需要使用可持久化的数据结构如果在每次操作后都直接拷贝所有数据,那么时空复杂度过大,但是我们会发现,每次进行修改(如线段树的单点修改)时,只会影响一部分节点(如一条链)的值,所以我们可以只创建发生改变的部分的副本,不拷贝其他部分二、可持久化线段树1、可持久化线段树:又称函数式线段树(意味着我们可以像函数一样访问每个n个版本的线段树),在每次单点更新时,都会产生O(logn)个新节点,也就

2022-05-08 17:01:48 1912

原创 c++访问控制和类作用域

一、访问控制1、每个类分别控制着自己成员的初始化过程,也控制着其成员对于派生类来说是否可以访问2、派生类的成员和友元(函数、类等)只能通过派生类对象来访问基类的受保护成员,派生类对于一个基类对象中的受保护成员没有任何访问权限3、类对继承而来的成员的访问权限受两个因素影响:基类中该成员的访问说明符;派生列表中的访问说明符派生访问说明符对于派生类的成员(及友元)能否访问直接基类的成员没有影响,对基类成员的访问权限只与基类中的访问说明符有关派生访问说明符的目的是控制其派生类用户(包括派生类的派

2022-05-06 19:54:50 735

原创 c++虚函数和抽象基类

一、虚函数1、只有在使用基类的引用或指针时,调用一个虚成员才会执行动态绑定2、由于直到运行才确定调用哪个版本的虚函数,故所有的虚函数都必须有定义,不论是否被用到3、一旦某个函数被声明为虚函数,则在所有的派生类中,它都是虚函数4、如果想要在派生类覆盖继承而来的虚函数,则它的函数名、形参类型必须与基类函数完全一致;对于返回类型,对于除了非指针和引用的返回类型,也应一致,如果是指针或引用类型,则规则无效,如:D由B派生而来,则基类的虚函数可以返回B*,而派生类对应函数可以返回D*,不过要求D到B的

2022-05-06 18:25:41 275

原创 c++定义基类和派生类

一、定义基类1、c++中,基类需要将它的两种成员函数区分开来:一种是希望派生类进行覆盖的函数,另一种是希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义为虚函数,当我们使用指针或者引用调用虚函数时,该调用将被动态绑定,根据对象类型选择执行版本2、基类通过在其成员函数的声明语句(不得用于类外部的函数定义)前加上virtual使得该函数执行动态绑定3、任何构造函数出外的非静态函数都可以是虚函数4、如果在基类中把一个函数声明称虚函数,那么该函数在派生类中隐式地也是虚函数5、成员

2022-05-05 20:15:06 4271

原创 c++面向对象程序设计概述

1、面向对象程序设计(OOP)的核心思想是数据抽象、继承和动态绑定通过数据抽象,可以将类的接口和实现分离;使用继承,可以定义相似的类型并其相似关系建模

2022-05-05 18:36:59 727

原创 java抽象类与接口

一、抽象类1、在 Java 中,被关键字abstract修饰的类称为抽象类,被abstract修饰的方法称为抽象方法,抽象方法只有方法声明没有方法体。2、抽象类不能被实例化,只能被继承。3、包含抽象方法的类一定是抽象类,但抽象类不一定包含抽象方法(抽象类可以包含普通方法)。4、抽象方法的权限修饰符只能为 public、protected 或 default,默认情况下为 public。5、一个类继承于一个抽象类,则子类必须实现抽象类的抽象方法,如果子类没有实现父类的抽象方法,那子类必须定

2022-05-05 11:01:14 250

空空如也

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

TA关注的人

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