http和https的区别 秋招面试过程中,蘑菇街面试时,面试官问我http和https的区别,当时听到这个问题的时候,其实有点心虚的,因为自己对于这两个协议的具体区别只是基于表面,对于https还是比较陌生的,就按照自己的理解和这两个协议的联系简单说了一下他们之间的区别,后来面试官又问我有没有考虑过通过http协议如何实现https协议,这就触及到我的知识盲点了,所以当时这个问题我就没答上来。这几天也对这个问题进行了一些思...
CSDN-markdown编辑器使用详细 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma...
自动化测试的优缺点 1、自动化测试的优点(1)对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行,可以极大提高测试效率,缩短回归测试时间。(2)可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。(3)可以执行一些手工测试困难或者不可执行的测试,例如模拟大量用户场景的压力测试(4)...
自动化测试概念篇 自动化测试测试领域是非常重要的一种测试手段,当然自动化测试也比普通的手工测试要求更高,需要我们有更高的专业技能,编写测试脚本等。1、什么是自动化测试?所谓自动化测试,顾名思义,自动完成测试工作,通常需要借助测试工具或者自己造轮子模拟之前人工测试过程并完成结果验证以完成整个测试过程,自动化测试听上去感觉很美,很便捷,其实每一个自动化测试的case都是从手工做起的,所以手工测试是自动化测试的基...
进程和线程的区别与联系 1、进程与线程的区别(1)进程是资源分配的最小单位,线程是程序执行的最小单位资源开销问题:(2)进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。安全行比较:(3)由于进...
【引用】详解及指针和引用的区别 1、基本概念 引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。2、特性(1)&在此不是求地址运算,而是起标识作用。(2)类型标识符是指目标变量的类型。(3)声明引用时,必须同时对其进行初始化。(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。(5)声明一个引用,不是新...
求和为sum的连续正序数列 题目描述: 输入一个正数sum,打印出所有和为sum的连续正数序列(至少含有两个数)样例展示: 输入sum=15; 打印出:1+2+3+4+5 、 4+5+6 、 7+8解题思路:用两个数字small和big分别表示序列的最大值和最小值,首先将small初始化为1,big初始化为2.如果从small到big的和大于sum,我们就从序列中去掉较小的值(...
测试学习----冒烟测试 一、什么是冒烟测试?冒烟测试,是对软件的基本功能进行测试,测试对象是每一个新编译的需要正式测试的软件版本,目的是确认软件的基本功能正常,保证软件系统能正常跑起来,可以进行后续的正常测试工作的进行,如果最基本的测试都有问题了,就直接打回开发部了,所以正式交付的测试版本,必须先通过冒烟测试的考验 冒烟测试只是一个测试活动,并不是一个测试阶段。也就是说冒烟测试贯穿于测试的人一个阶段。单元测试...
判断是否为平衡二叉树 题目描述: 给定一棵二叉树,判断是否为平衡二叉树解题思路: 在解决这道题时,我们首先要知道什么是平衡二叉树平衡二叉树的性质:左右子树高度差小于等于1只有根节点的树是平衡二叉树,空树也是平衡二叉树 代码实现: 每个节点只遍历一次的方法 如果我们用后序遍历的方式遍历二叉树的每个结点,在遍历一个结点之前我们就已经遍历了它的左右子树。只要在遍历每个结点的时候我们记...
编写测试用例的方法 在编写测试用例的过程中,我们也有许多编写方法,下面是一部分总结:1、等价类划分法顾名思义,等价类划分法就是将所有测试用例划分为几个互不相交的子集,他们的并集就是全集,再从每个子集中选取若干具有代表性的值作为测试用例。 概念: 依据需求将输入(特殊情况下会考虑输出)划分成若干个等价类,从等价类中选出一个测试用例,如果这个测试用例通过,则认为所代表的等价类测试通过思想: ...
测试---基础篇 一、软件测试的生命周期在了解软件之前,我们应该了解一次完整的软件测试应该经历哪些步骤,软件测试的生命周期如下: 需求分析——>测试计划——>测试设计、测试开发——>测试执行——>测试评估1、需求阶段测试人员了解需求,对需求进行分解,得出测试需求2、计划阶段测试人员根据具体的测试需求编写出测试计划、测试方案3、设计阶段测试人员适当的了解设计,对于...
读入一个字符串str,输出字符串str中的连续最长的数字串 读入一个字符串str,输出字符串str中的连续最长的数字串 输入描述: 测试输入包含1个测试用例,一个字符串str,长度不超过255。输出描述: 在一行内输出str中里连续最长的数字串。输入例子: abcd12345ed125ss123456789输出例子: 123456789这是一个与字符串操作有关的题 解题思路:首先遍历字符串,...
关于构造函数的那点事 在C++中,类模块有一个很重要的成员函数—-构造函数什么是构造函数?构造函数(constructor)是一种特殊的方法 。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 。特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数的功能主要用于在类的对象创建时定义初始化的状态。...
如何编写简单的Makefile文件 一、什么是Makefile1.GNU make是一个命令工具,是一个用来控制软件构建过程的自动化管理工具。Make工具通过称为Makefile的文件完成并自动维护编译工作。3、makefile定义了一系列的规则来指定,一个工程中的哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。总之,makefile为我们带来了极大地好处—–“自动化编译”,一旦...
复杂链表的复制 在学习链表的相关知识时,碰到了这样一道题,是关于复杂链表的复制问题的,每个节点不仅有指向下一个节点的next指针,还要一个随机指针random,这个随机指针可能会指向任何一个节点,那么对于这道题最好的解决方法是什么呢: 解题思路: 所以我们可以实现三个函数来解决这个问题,具体代码如下:RandomListNode* Clone(RandomListNode* pHead) ...
struct和class的区别 C++被称为“C with class”,可见在C++中class是多么重要,与class类似的一个结构就是struct了,struct最早是在C语言中出现的,在C++中对struct的功能也进行了扩展,下面就来说一说struct和class的区别吧:1、默认的继承权限struct默认是公有继承(public),class默认是私有继承(private)2、关于默认访问权限clas...
STL六大组件 一、STL介绍1、STL(Standard Template Library),即标准模板库,是一个高效的C++程序库。2、包含了诸多在计算机科学领域里常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性3、从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming) 在这种思想里,大部分基本算...
TCP和UDP的区别 tcp和udp都是传输层的通信协议,但他们的通信机制和应用场景又有所不同,那么到底有哪些区别呢?针对这个问题,做了一下总结:1、基于连接VS无连接tcp是面向连接的协议,而udp是无连接协议;意思就是说当一个客户端和一个服务器端通过tcp发送数据进行通信之前,必须先建立连接,他们通过tcp发送数据,tcp建立连接的过程就是tcp握手的过程。tcp是无连接的,所以发送数据之前不需要建立连接;...
快速排序总结 快速排序,从字面意思就可以看出这是一种效率比较高的排序算法,现在对该算法做一下总结: 快速排序是由冒泡排序改进而得的,它的基本思想是:在待排序的n个记录中任取一个记录(通常取第一个记录),把该记录放入适当位置后,数据序列被此记录划分成两部分。所有关键字比该记录关键字小的记录放置在前一部分,所有比它大的记录放置在后一部分,并把该记录排在这两部分的中间(称为该记录归位),这个过程称作...
面向过程编程思想和面向对象编程思想 一、面向过程编程思想百度百科这样解释: “面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。 面向过程其实是最为实际的一种思考方式,就算是面向对象的方法也是含有面向过程的思想。可以说面向过程是一种基础的方法。它考虑的是实际地实现。一般的面向过程是从上往下步步求精,所以面向过程最重要的是模块化的思想方法。 个人理解: 通俗地讲,我们在编写代码时,我们看到是一...
STL容器之【vector】的使用 一、vector1、基本介绍在C++中,vector是一个十分有用的序列式容器,它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。2、用法介绍为了使用vector,必须包含头文件。另,vector属于std命名空间,因此需要通过命名限定,可以有如下三种方式,后两种方式更好,因为未引入的无关的内容。(1) usin...
内联函数、宏和普通函数的区别 1、内联函数和宏的区别宏定义不是函数,但是使用起来像函数。预处理器用复制宏代码的方式代替函数的调用,省去了函数压栈退栈过程,提高了效率。内联函数本质上是一个函数,内联函数一般用于函数体的代码比较简单的函数,不能包含复杂的控制语句,while、switch,并且内联函数本身不能直接调用自身。如果内联函数的函数体过大,编译器会自动的把这个内联函数变成普通函数。宏定义是在预编译的时候把所有的宏...
sizeof和strlen的区别 在我们平时写代码的过程中,我们会经常用到sizeof和strlen,那么他们到底有什么区别呢,我简单总结了以下几点: (1)sizeof是运算符,strlen是函数 (2)sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以”\0”结尾的。 (3)strlen 测量的是字符的实际长度,以’\0’ 结束。而sizeof 测量的是字符的分配大小。 (4)strl...
fork()函数的底层实现原理 在之前的博客 进程控制【创建、等待、终止和替换】 - CSDN博客 https://blog.csdn.net/qq_37964547/article/details/79720027中只是简单的讲到了fork函数,但并没有深入,今天在复习知识的时候,就把fork函数重新学习了一遍,做了一下总结。 在Linux中,fork函数是非常重要的函数,他从一个已存在的进程中创建一个新进程;新进程...
建立TCP 服务器的系统调用 建立TCP服务器连接的过程中主要通过以下系统调用序列来获取某些函数,这些系统调用主要包括:socket(),bind(),listen(),accept(),send()和recv()。 如下图所示, TCP应用程序进行的普通调用序列: TCP调用的各个层: (1)套接字层接收进行的任何 TCP 系统调用。套接字层验证 TCP 应用程序传递的参数的正确性。这是一个独立于协议 的层,...
C++中四种强制类型转换 C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast 下面介绍的四种强制类型转换如图:
类型萃取 一、类型萃取1、基本概念类型萃取是使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他。3、应用场景比如我们实现顺序表,在对顺序表进行扩容时,就靠重新开辟内存、拷贝对象.拷贝对象时,就有两种情况:一种是内置类型,比如int char…;还有一种是自定义类型,Data类、...
设计模式----单例模式 一、单例模式一般情况下,我们建立的一些类是属于工具性质的,基本不用存储太多的跟自身有关的数据,在这种情况下,每次都去new一个对象,即增加了开销,也使得代码更加臃肿。其实,我们只需要一个实例对象就可以。如果采用全局或者静态变量的方式,会影响封装性,难以保证别的代码不会对全局变量造成影响。 考虑到这些需要,我们将默认的构造函数声明为私有的,这样就不会被外部所new了,甚至可以将析构函数也声明为...
shell的几种常用工具 最近在学习shell脚本语言,在学习的过程中了解了关于shell的几种常用工具,就总结了一下。1、sort功能:顾名思义,sort是对文本进行排序操作的。原则:sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较, 后将他们按升序输出。man手册解释: 常用选项介绍: 选项 说明 -r 将文本文件降...
设计一个简单的内存池 一、为什么要使用内存池呢?在了解内存池之前,我们先来了解一下什么是内存碎片:内存碎片通常情况下,我们在使用new、malloc进行空间申请时,系统都是在对上进行空间开辟的,尽管开辟出来内存的地址是连续的一块内存空间,但每次开辟的内存块的地址并不是连续的,这样的话当我么开辟的次数变多以后,堆上就剩余许多小块的空间导致在我们需要一块比较大的空间时会开辟失败。这是我们最常听到的一种内存碎片,...
柔性数组 1、如何在一个结构体中动态存放动态字符串在了解柔性数组之前,我们先考虑这个问题,通常我们要想在结构体中存放一个动态长度字符串主要有以下两种方法: (1)在结构体中定义一个指针,让该指针指向字符串的动态地址空间 (2)定义一个结构体指针,将结构体和字符串链接在一起 以上两种方法都可以实现,但各自有缺点:第一种方法:会造成结构体和字符串分离,此时字符串其实在代码段放着,这样操作起来会比...
static关键字的作用【C语言、C++、linux中的作用剖析】 一、C语言中static关键字的作用在C语言中,static关键字主要有以下作用:1、static修饰变量会延长局部变量的生命周期当static修饰变量的时候,变量会被存储在静态区,存储出在静态区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化,直到程序运行结束以后才进行变量释放。2、static修饰的全局变量或者函数具有隐藏特性我们都知道,当同时编译多个文...
一组数中,只有两个数出现了一次,剩下的数都是成对出现,找出这两个数 今天在做题的时候,碰到这样一道题:一个数组中除了两个数字之外,其余数字均出现了两次,如{1,2,3,4,5,3,2,1}。查找这两个只出现一次的数字,要求时间复杂度为o(n),空间复杂度为o(1)。 解题思路: 在解这道题时,首先要了解与(&),或(|),异或(^)的基本用法: (1)0&0=0;0&1=1;1&1=1; (2) 0|0=0;0|1=1;1|...
关于迭代器失效的几种情况 之前就做题的时候就经常碰到与迭代器失效有关的问题,但是一直对这个问题也没有深究,处于似懂非懂的状态,今天就对迭代器失效这部分知识做一个总结。迭代器迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeo...
数组相关问题 题目描述: Given a number represented as an array of digits, plus one to the number. 给你一个用数组表示的数,求加一之后的结果,结果还是用数组表示 解题思路:当前位不等于9,只用把数字+1当前位等于9,看下一位,直到找到不为9的数字,将当前位+1,再把后面所有数字设为0如果最高位也从9变成0,就return一...
求两个数的和,不允许用四则运算符 四则运算不能算的情况下,肯定只能借助位运算,所以应该考虑位运算假设两个数的二进制位00001 和 10001,两个数相加的过程就是 第一步:先把二进制的各位相加但不进位,10001; 第二步:记下进位,00001 第三步:把前两步的结果相加,得到10010分析上述三个过程发现 第一步实际上就是两个数的异或结果 第二步进位就是两个数&的结果再左移一位: 第三步是两数相加,和...
关于全排列组合问题 1、给定一个数字字符串,返回数字可能表示的所有可能的字母组合。数字与字母的对应关系和手机按键对应。解题思路:建立数字到字符的映射字典将输入的数字字符串转换为对应字符串列表用枚举回溯法求解 代码实现:class Solution { public: vector letterCombinations(string digits) { vector ...
用shell脚本实现彩色进度条 一、进度条原理进度条的的动态增长是利用人的视觉短暂停留效果的,不断从输出缓冲区刷新出相同的内容,在肉眼看来进度条在不断的增长。1、显示问题:因为不需要多行显示,只需刷新当前进度 ,那么输出时只需要回车‘\r’,不需要换行‘’2、关于缓冲区:linux下的每一个进程会维护一个print/scanf的缓冲区,对于缓冲区而言,缓冲区有一个概念叫做缓冲方式,就是说达到一定的...
已排序的整数数组相关查找返回索引问题 对于数组的应用大家一定不会陌生,今天要介绍的就是两种有关数组中对于指定元素的查找问题.1、给定一个排序的整数数组,找到给定目标值的起始位置和结束位置。题目要求:算法的运行时复杂度必须是O(log n)的顺序。如果在数组中找不到目标,返回[-1,-1 ]。示例:输入数组a[ ]={1,2,3,3,4,4,5};target=3;返回结果{2,3};解题思路: ...
grep工具以及正则表达式 一、grep简介1、基本概念grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。(1)Unix的grep家族包括grep、egrep和fgrep;egrep和fgrep的命令只跟grep有很小不...
二级空间配置器 一、二级空间配置器在前面文章中我们介绍了一级空间配置器的概念和实现,一级空间配置器的实现相对比较简单,直接封装了malloc()和free()函数,同时增加了处理机制et_malloc_handler() 。 一级空间配置器主要处理大于128字节的大块内存分配问题,当字节数小于128字节,我们就需要用到二级空间配置器进行空间申请; STL默认是使用二级空间配置器。1、二级空间配置器的配置...
栈的面试题---对栈进行升序排列 1、题目描述请编写一个程序,按升序对栈进行排序,要求最多只能使用一个额外的栈存放临时数据,但不得将元素复制到别的数据结构中。 vector数组numbers中的第一个元素就是栈顶元素,升序排列,即栈顶元素最大2、解题思路看到这个题,因为可以申请一个栈用来存放临时数据,所以我们可以这样想: 由于栈先进后出的特性,先将原来栈中的数据存放到临时数据栈中,并且保证临时栈中的数据是降序排列的...
IO多路转接---epoll服务器实现 一、基本概念1、epoll初识按照man手册的说法:epoll是为了处理大量句柄而改进了的poll 他是在2.5.44内核中被引进的,几乎具备了之前所说的select、poll的一切优点,被公认为是linux2.6下性能最好的多路I/O就绪通知方法。2、epoll的相关系统调用(1)epoll_create;函数原型: **参数说明:**size大小不是后备存储...
poll方法的基本概念 一、select函数简单回顾在上篇博客中,我们详细了解了关于select接口的用法,在学习poll函数之前,我们先对select函数的内容做一个简单的回顾: select优点: 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 select缺点: (1)每次调用 select(),都需要把 fd 集合从用户态拷贝到内核态,这个开销在 fd 很多时会很大,同时每次调用 sel...
I/O多路转接之select 一、基础概念1、select使用Select就可以完成非阻塞(所谓非阻塞方式non-block,就是进程或线程执行此函数时不必非要等待事件的发生,一旦执行肯定返回,以返回值的不同来反映函数的执行情况,如果事件发生则与阻塞方式相同,若事件没有发生则返回一个代码来告知事件未发生,而进程或线程继续执行,所以效率较高)方式工作的程序,它能够监视我们需要监视的文件描述符的变化情况–读写或是异常。 ...
基础函数(fcntl、dup、dup2) 1、fcntl函数—改变已经打开文件的属性函数原型: 该函数有五种功能: (1)复制一个现有的描述符(cmd=F_DUPFD),新的文件描述符作为函数的返回值。 (2) 获得/设置文件描述符标记(cmd=FGETFD 或 FSETFD). (3)获得/设置文件状态标记(cmd=FGETFL 或 FSETFL). (4)获得/设置异步I/O所有权(cmd=FGETOWN 或 (FSET...
搜索二叉树与双向链表的相互转换 一、将一颗搜索二叉树转换成有序的双向链表1、问题描述输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。2、解题思路首先,让我们来回顾一下搜索二叉树的结构一些相关特点: (1)在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针; (2)左子树结点的值总是小于父结点的值,右...
高级IO--五种IO模型 一、IO1、IO介绍I就是input输入,O就是output输出,一起就是基本输入输出设备;I/O也就是输入输出地址。每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息。I/O地址绝对不能重复,如果两个设备的I/O地址有冲突,系统硬件就不能正常工作。2、IO模型对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区...
求连续子数组的最大和笔记 输入一个整数数组,要求求出该数组的连续子数组的最大和。 例如输入数组array[]={-1,0,2,1,-1};结果输出的最大和为3; 方法一 在看到这个题的时候,我们首先想到的应该是求出该数组的所有连续子数组的和,并对所有的和进行比较,这种方法易于理解,对于一个n个元素的数组,共有n(n+2)/2个子序列,这种方法实现起来时间复杂度为O(n^2)。所以我们可以换种思路解决该问题。 方法二...
网络层协议---ICMP协议 一、网际控制报文协议ICMP1、为什么会引入ICMP协议在上篇博客中讲过,IP协议提供的是不可靠无连接的数据传输服务,它具有传输数据到达目的主机的能力,但并不保证数据被准确送达,那么需要保证数据送达的工作应该由其他的模块来完成。其中一个重要的模块就是ICMP(网络控制报文)协议。 例如: 当传送IP数据包发生错误:比如主机不可达,路由不可达等等,ICMP协议将会把错误信息封包,然后传送...
网络层--IP协议总结 一、网络层1、基本概念(1)网络层是一个承上启下的层,上面是传输层、应用层,下面是数据链路层、物理层。 (2)网络层的主要作用是实现终端节点之间的通信,这种端点之间的通信业称为点对点通信(end to end)。 (3) 网络层把实际上异构的网络通过IP协议变成一个统一的逻辑网络。 简单来讲网络层的作用就是在复杂的网络环境中为两个要进行通信的主机确定合适的数据报传输路径。...
STL 一级空间配置器 一、STL介绍STL(Standard Template Library,标准模板库),从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。 首先呢,让我们一起来理解一下STL的六大组件:1、STL六大组件简单介绍(1)容器(Container):作为STL的最主要组成部分--容器,分为序列式容器和关联式...
将string字符串中的空格替换 在网络编程中,如果URL参数中含有特殊的字符,比如空格,“+”等,往往会被当做特殊意义理解,所以这些特殊字符不能随便使用,但是如果URL参数中确实需要这样的字符,那么就需要对这些字符进行转义,方可继续执行。 例如:将字符串中的每个空格替换成“%20”;“we are happy” 经过替换后变成了“we%20are%20happy”. 下面用两种方法解决这个问题:1、直接调用strin...
TCP/IP协议---TCP协议基础知识总结 一、TCP协议1、基本概念TCP全称为 “传输控制协议(Transmission Control Protocol”), TCP协议是网络模型中传输层协议,为应用层程序提供可靠的数据传输,因此协议也相对复杂一些;2、TCP协议主要特点(1)支持面向连接的传输服务应用程序在使用TCP协议所能提供的服务传送数据之前,必须在源端口与目的端口之间建立一条TCP传输连接。TC...
TCP/IP协议---UDP协议总结 一、TCP/IP协议栈首先我们来了解一下什么是协议1、协议网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。它的三要素是:语法、语义、时序。 为了使数据在网络上从源到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议(protocol),它最终体现为在网络上传输的数据包的格式。2、T...
HTTP协议基础知识总结 一、HTTP协议1、基本概念HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。2、HTTP协议的基本特点...
最小生成树的Kruskal算法 给定一个无向图,如果它任意两个顶点都联通并且是一棵树,那么我们就称之为生成树(Spanning Tree),如果是带权值的无向图,所有权值之和最小的树就称之为最小生成树。1、最小生成树的基本准则若连通图由n个顶点组成,则其生成树必含n个顶点和n-1条边。因此构造最小生成树的准则有三条: 1. 只能使用图中的边来构造最小生成树 2. 只能使用恰好n-1条边来连接图中的n个顶点 3....
TCP服务器的单进程、多进程实现 一、socket编程在理解TCP服务器时,我们必须了解socket编程,在上篇博客中,我们知道在TCP/IP协议中,“IP地址+TCP端口号/UDP端口号”唯一标识网络通讯中的唯一一个进程,我们把“IP地址+端口号”就成为socket。在TCP协议中,建立连接的两个进程各自有一个socket来标识,那么这两个socket组成 的socketpair就唯一标识一个连接。socket本身有“插...
图的深度优先遍历和广度优先遍历 在前面那篇文章中,只写了关于连通图的广度优先遍历算法和深度优先遍历算法,没有考虑到非连通图的情况 :https://blog.csdn.net/qq_37964547/article/details/80100975 那么现在对之前的代码进行优化,我们可以先来理一下思路:1、图的广度优先遍历算法所谓广度,就是一层一层的,向下遍历,层层堵截,BFS(){ 输入起始点;...
mysql中的数据类型总结 一、数据类型二、数值类型三、越界检验 在mysql中,整形可以指定为有符号和无符号的,默认是有符号的; 所以插入数值128时出现了越界错误。 我们可以通过UNSIGNED来说明某个字段是无符号的。 示例如下: 四、关于UNSIGNED首先我们来看一个例子,先建立一个表: 现在若执行a-b会有什么结果呢?会得到-1吗?我们来验证一下: 结果出错了...
mysql数据库和表的基本操作 最近在学习关于数据库方面的一些知识,就整理了一下数据库的一些基本用法:一、数据库的基本操作1、查看数据库命令:show databases; 2、创建数据库语法示例: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] …] 其中大写字母为关键...
堆的简单操作实现 1、堆的基本概念关键码的集合按完全二叉树的顺序存储方式存储在一维数组中,并满足:对于所有节点它的父节点关键码都大于子节点(或都小于它的子节点),这样的堆称为最大堆(或最小堆)。2、堆的特性(1)父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。(2)每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。(3) 当父结点的键值总是大于或等于任何一个子节点的键值...
栈的实现及其应用 一、栈1、什么是栈栈(Stack)是一种线性存储结构,它具有如下特点: (1)栈中的数据元素遵守”先进后出”(First In Last Out)的原则,简称FILO结构。 (2)限定只能在栈顶进行插入和删除操作。2、栈的基本操作栈主要有以下几种基本操作: (1)push(): 向栈内压入一个成员; (2)pop(): 从栈顶弹出一个成员; (3)empty(): 如果栈...
网络编程套接字socket简单用法 一、IP地址1、什么是IP地址IP地址是指计算机在网络上的地址,一台计算机可以有多个IP地址(看网卡上配置了多少个地址),通过IP地址,一台计算机可以找到远在千里之外的另一台计算机,并将信息投递给它。IP地址对应IP协议,IP协议工作在OSI七层模型中的网络层。2、IP报文结构(IPv4)我们先来看看IP报文结构图: (1)版本字段:长度为4位,表示所使用的网络层IP...
数据结构【图】 一、图的基本概念1、图的定义图是由顶点集合及顶点间的关系组成的一组数据结构,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。 我们称之为顶点(Vertex),顶点集合有穷非空。在图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。2、图的分类图按照边的有无方向分为无向图和有向图。无向图由顶点和边组成,有向图由顶...
数据结构【并查集】解决朋友圈问题 首先我们先来看一个栗子: 朋友圈问题: 1、已知,有n个人和m对好友关系(存于一个集合r中) 2、如果两个人是直接的或者间接的好友(好友的好友的好友。。。),那么他们属于一个集合,就是一个朋友圈里的。 3、写出程序,求这n个人中一共有多少个朋友圈。 例如: n=5,m=3; r={{1,2},{2,3},{4,5}}; 因为集合{1,2}和集合{2,3}中有共同的朋友2,所以1,2...
网络基础认识以及OSI七层模型和TCP/IP四层模型 一、计算机网络1、什么是计算机网络计算机网络是“以相互共享资源的方式互联起来的自治计算机系统的集合”,联网计算机之间的通讯必须遵循共同的网络协议。2、计算机网络的分类按照覆盖的地理范围来分: (1)广域网:广域网是一种公共数据网络,其可以将远隔千里的计算机连在一起。 (2)局域网:局域网一般属于单位所有,用于将有限范围内的各种计算机、终端和外部设备连接起来。 (3)城...
读写锁与读者写者模型 一、读写锁基本概念读写锁与互斥量的功能类似,对临界区的共享资源进行保护!互斥量一次只让一个线程进入临界区,读写锁比它有更高的并行性。 读写锁有以下特点: 1、如果一个线程用读锁锁定了临界区,那么其他线程也可以用读锁来进入临界区,这样就可以多个线程并行操作。但这个时候,如果再进行写锁加锁就会发生阻塞,写锁请求阻塞后,后面如果继续有读锁来请求,这些后来的读锁都会被阻塞!这样避免了读锁长期占用...
死锁的相关知识总结 一、死锁首先一个例子让我们理解死锁假设有两个进程A和B,他们要求同时访问数据资源D和E,进程A先请求得到D资源,进程B先请求数据资源E并且申请成功,后来进程A又申请数据资源E,因为它已经被分配给了进程B而阻塞,进程B又申请数据资源D,因它被分配给了进程A而阻塞;双方都希望对方能释放自己所需要的资源,但他们因不能获得自己所需资源而继续运行,从而无法释放自己占有的资源,并且一直处于这样的僵持状态,这种状
进程间关系和守护进程 一、进程间关系在了解进程间关系之前,我们先了解几个相关的概念:1、进程组给一个示例如下,我们来了解一下进程组: 命令用法解释: &:表示将进程放到后台运行 组长进程:2651 进程组ID:2651 进程ID:2651 2652 2653 ps 选项: a:不仅列出当前用户的进程,也列出所有其他用户的进程 x:不仅列出控制...
生产者与消费者模型 一、生产与消费者模型1、基本概念模型生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,模型图如下所示: 2、必须具有的条件(1) 三种关系:三种关系分别指的是:消费者和消费者,生产者和生产者,生产者和消费者;其中消费者和消费者,生产者和生产者之间都属于竞争关系,生产者和消费者之间的关系相当于是一种食物链之间的依赖关系。 ...
线程的同步与互斥 一、线程同步在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问题,写入数据会被多次的覆盖,这时会出现程序混乱的问题,无法得到原来需要的数据,所以就要使线程同步。 线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操...
布隆过滤器的简单实现 一、布隆过滤器1、基本概念它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中。2、基本思想如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路. 但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。不过世界上还有一种叫作散列表(又叫...
【位图】的实现和应用 一、位图所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,但数据状态又不是很多的情况。通常是用来判断某个数据存不存在的。 在这里我们可以借助vector作为位图底层实现载体,具体实现方式如下:#pragma once#include<vector>#include<iostream>using namespace std;class Bit...
Linux下线程相关知识总结 一、线程概念1、什么是线程(1)线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。 (2)线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。...
交换排序--冒泡排序&快排 利用交换元素的位置进行排序的方法称作交换排序。常用的交换排序的方法有冒泡排序和快速排序。快速排序是一种分区交换排序方法。一、冒泡排序它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 算法步骤: 冒泡排序算法的运作如下:(从后往前) (1)比较相邻的元素。如果第一个比第二个大...
排序算法---选择排序&归并排序 一、选择排序基本思想:每一趟(第i趟,i=0,1,…,n-2)在后面n-i个待排序的数据元素集合中选出关键码最小的数据元素,作为有序元素序列的第i个元素。待到第n-2趟做完,待排序元素集合中只剩下1个元素,排序结束。1、直接选择排序算法步骤: 1、在元素集合array[i]–array[n-1]中选择关键码最小的数据元素; 2、若它不是这组元素中的第一个元素,则将它与这组元素中的第...
排序算法---插入排序&希尔排序 一、直接插入排序直接插入排序是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列。 在讲解直接插入排序之前,先让我们脑补一下我们打牌的过程。先拿一张5在手里, 摸到一张4,比5小,插到5前面, 摸到一张6,比5大,插到5后面, 摸到一张8,比6大,插到6后面, 这就是一个关于直接...
Linux信号基本概念及信号的用法 一、信号1、基本概念(1)这里讲的信号与信号量不同,信号是进程给操作系统或进程的某种信息,让操作系统或者其他进程做出某种反应。 (2)信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。 (3...
popen函数和system函数详解 1、popen函数我们先用man指令查一下popen函数: 函数说明: (1)popen()会调用fork()产生子进程,然后从子进程中调用/bin/sh -c来执行参数command的指令。 (2)参数type可使用“r”代表读取,“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准输出设备或标准输入设备,然后返回一个文件指针。随后进程便可利用此文件指针来读取...
进程控制【创建、等待、终止和替换】 一、进程1、基本概念狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。2、进程–PCB(1)每个进...
简易shell的编写 在正式编写简易shell之前,让我们先了解一下关于shell的知识一、背景知识1、什么是shell(1)在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解析器)。 (2)同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许...
静态库与动态库实现 一、什么是库本质上来说,库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件;对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库。二、静态库1、概念静态库即静态链接库(Windows 下的 .lib,Linux 和 Mac 下的 .a)。之所以叫做静态,是因...
open/read/write/close等文件系统调用接口以及fd与FILE的比较 在Linux系统下,文件是一个很重要的概念,接下来就介绍一下其相关的接口函数一、熟悉open/read/write/close等文件相关系统调用接口1、open函数 注释: (1)函数说明:用来打开一个已经存在的文件或者创建一个普通文件 (2)参数解释: pathname:要打开或创建的目标文件 flags:打开文件时,可以传入多个参数选项,用下面的一个或多个进行“或”运...
环境变量 之【export命令、getenv函数、setenv函数、unsetenv函数使用】 1、getenv函数 注释: (1)函数说明:获取环境变量的值 (2)参数说明:name为环境变量的名字 (3)返回值:执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL2、setenv函数在Linux操作系统下使用man命令查看setenv: 注释: (1)函数说明:用来改变或增加环境变量的内容 (2)参数解释: name:环境变量名...
模拟实现僵尸进程&孤儿进程 一、僵尸进程&孤儿进程1、僵尸进程当进程退出并且⽗父进程(使⽤用wait()系统调⽤用)没有读取到⼦子进程退出的返回代码时就会产⽣生僵尸进程;僵尸进程会在以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。2、孤儿进程一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们...
进程的调度算法 一、调度算法的概念操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源。这就是调度。目的是控制资源使用者的数量,选取资源使用者许可占用资源或占用资源。二、几种常见的调度算法1、基于时间片轮转调度算法(RR)(1)时间片轮转法。给每个进程固定的执行时间,根据进程到达的先后顺序让进...
进程间通信【信号量】 一、相关背景知识为了更加深入理解信号量我们还需了解一下几个概念1、原子操作(atomic operation)原子操作意为不可被中断的一个或一系列操作,也可以理解为就是一件事情要么做了,要么没做。而原子操作的实现,一般是依靠硬件来实现的。2、同步与互斥同步:进程同步指的是多个进程需要相互配合共同完成一项任务,在访问资源的时候,以某种特定顺序的方式去访问资源 互斥:一个资源每...
进程间通信【共享内存】 一、共享内存(1)共享内存(shared memory)是Unix下的多进程之间的通信方法,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。 (2)共享内存区是最快的IPC形式,一旦这样的内存映射到共享它的进程的地址空间,这下进程间的数据传递不再涉及到内核 (3)共享内存的生命周期也是随内核的,必须对其进行显示删除 (4)特别注意的是:共享内存是没有...
进程间通信【消息队列】 一、消息队列(1)消息队列提供了一个从一个进程像另外一个进程发送一块数据的方法 (2)每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 (4)消息队列的生命周期是随内核的二、相关的数据结构和函数1、IPC对象数据结构(/usr/include/linux/ipc.h)内核为每一个IPC对象维护一个数据结构,其结构体内容如下:struct ipc_pe...
进程间通信【管道】 一、概念1、基本概念管道是一种最基本的IPC机制,作用于两个进程之间,完成数据传递;管道是Unix中最古老的进程间通信的形式。2、管道的特点(1)只能用于具有共同祖先的进程(具有亲缘关系的进程)之间通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后,父子进程之间就可应用该管道 (2)管道的进程间通信是基于字节流的 (3)管道是基于文件形式的,自带同步互斥机制,...
二叉树相关面试题 一、什么是二叉树在计算机科学中,二叉树是每个节点最多有两个子树的树结构,通常子树被称为左子树和右子树,左右子树又是一个二叉树,其次序不能任意颠倒。二、二叉树的相关操作1、二叉树结点的定义二叉树的存储结构一般采用二叉链表的方式,每一个结点都有一个数据域_data和指向左右子树的两个指针域,通过这两个指针域就可以建立二叉树中的上下层关系。下面就是二叉树结点的定义:templ...
C++实现AVL树 一、AVL树概念在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。二、导致AVL树不平衡的几种情况(1)LL:插入一个新节点到根节点的左子树(Left)的左子树(Left),导致根节点的平衡因...
二叉搜索树 一、二叉搜索树的概念二叉搜索树,又称二叉排序树、二叉查找树,它或者是一棵空树;或者是具有下列性质的二叉树:若左子树不空,则左子树上所有结点的值均小于它的根结点的值;若右子树不空,则右子树上所有结点的值均大于它的根结点的值;左、右子树也分别为二叉排序树。如下图所示就是一个二叉搜索树的示例结构 二、二叉搜索树的简单操作1、二叉搜索树的节点结构struct BSTNode...
Linux 的一些基础指令 1、ls指令功能:列出当前目录下的所有子目录和文件用法格式:ls[选项][目录或文件]示例展示:该指令还有一些常用的用法:ls -a 列出目录下的所有文件(包括以 . 开头的隐含文件)ls -d 将目录像文件一样显示ls -l 列出文件的详细信息ls -t 目录以时间排序2、pwd 指令功能:显示用户当前所在的目录语法格式:pwd示例展示:3、cd指令功能:改变当前...
模板和泛型编程 在创建完成抽象操作的函数时,如:拷贝,反转和排序,你必须定义多个版本以便能处理每一种数据类型。以比较两个数的大小为例:#include<iostream>using namespace std;int MAX(int a, int b){ return a > b ? a:b;}double MAX(double a, double b){ ret...
带虚函数的菱形虚拟继承 菱形虚拟继承是单继承和多继承的结合,将类中的函数定义为虚函数。结合实例看看它的实现过程:class Animal{public: virtual void Funtest1() { cout << "Animal::Funtest1()" << endl; } virtual void Funtest2() { cout << "Anima...
【C++多态】与虚函数简单总结 多态的概念 所谓多态,其含义就是“多种形式”或“多种状态”。我们把具有继承关系的多个类型称为多态类型,因为我们能使用这些类型的“多种形式”而无须在意他们的差异。在面向对象语言中,接口的多种不同的实现方式即为多态,多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。多态的分类1)静态多态(早绑定):编译...
【C++继承】之虚拟继承、作用域 一、C++中虚拟继承1、虚拟继承的概念 C++使用虚拟继承,解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一份拷贝,同一个函数名也就只有一个映射。2、解决的问题 解决了数据成员的二义性问题,避免了数据指向不一致问题,同时也节省了内存空间。例如下面这个简单的例子:#i...