- 博客(56)
- 收藏
- 关注
原创 【无重复元素全排列】
给定一个无重复元素的数组,如[1,2,3],设计程序,输出[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]。
2024-08-16 09:51:54
255
原创 【由二叉树的中序序列和前序序列(后序序列)重建二叉树】
由于前序遍历是根左右的顺序,可以由前序序列确定根结点的值,再在中序序列中确定根结点的位置,为什么要确定根结点位置呢,因为中序遍历是左根右的顺序,根结点即为左右子树的分界点,而后对左子树和右子树进行同样的操作,这就是一个递归的过程。假设条件:遍历序列中无重复元素。假设条件:遍历序列中无重复元素。
2024-08-14 14:24:00
466
原创 【TCP保持可靠性的措施】
使用窗口控制,如果数据段1001-2000丢失,后面数据每次传输,确认应答都会不停地发送序号为1001的应答,表示我要接收1001开始的数据,发送端如果收到3次相同应答,就会立刻进行重发;但还有种情况就是数据收到了,但是有的应答丢失了,这种情况不会进行重发,因为发送端知道,如果是数据段丢失,接收端会不停地发送提醒。拥塞避免:设置慢启动阈值,一般开始都设为65536.拥塞避免是指当拥塞窗口大小达到这个阈值,拥塞窗口的大小不再指数上升,而是以加法上升,即每次收到一个确认应答,拥塞窗口就+1,以此来避免拥塞;
2024-08-12 14:51:09
370
原创 【TCP协议】
应用层传输层TCP/UDP网络层链路层各种物理通信网络接口(1)TCP/IP协议的应用层应用层的协议主要有HTTP(万维网服务)、FTP(文件传输)、SMTP(电子邮件)、SSH(安全远程登录)、DNS(域名解析)、Telnet等,是用于读取来自传输层的数据或者将数据写入传输层。应用层包括所有和应用程序协同工作,并利用基础网络交换应用程序的业务数据的协议。一些特定的程序被认为运行在这个层上,该层协议所提供的服务能直接支持用户应用。(2)TCP/IP协议的传输层。
2024-08-12 12:47:39
1526
原创 【五种IO模型】
结合上述例子,阻塞IO就是当应用B发起读取申请时,在内核数据没有准备好之前,应用B会一直处于等待数据状态,直到内核把数据准备好了交给应用B才结束。按照上述思路,所谓非阻塞IO就是当应用B发起读取申请时,若内核数据没准备好会立刻告诉应用B,不会让B在这等待。
2024-08-09 15:29:21
1082
原创 【计算机网络---OSI七层模型】
OSI七层网络模型TCP/IP四层概念模型对应网络协议应用层(Application)应用层表示层(Presentation)会话层(Session)SMTP、DNS传输层(Transport)传输层TCP、UDP网络层(Network)网络层数据链路层(Data Link)数据链路层物理层(Physical)IEEE 802.1A、IEEE 802.2到IEEE 802.11第一层:物理层在OSI参考模型中,物理层是参考模型的最低层,也是OSI模型的第一层。
2024-08-08 15:55:28
2010
1
原创 【数据结构的——红黑树】
红黑树是一种自平衡的二叉查找树,是一种高效的查找树,可以在Olog2n时间内完成查找、增加和删除等操作。有了二叉搜索树,为什么需要平衡二叉树?对于二叉搜索树,如果插入的数据是随机的,那么它就是接近平衡的二叉树,平衡二叉树(AVLTree)的操作效率较高,查增删的时间复杂度都是Olog2n。但是当插入的数据有序时,二叉搜索树的结点就会只在根结点的一侧,就变成了一个链表,操作效率也因此变低,时间复杂度变为了O(n)。
2024-08-08 11:47:39
1629
2
原创 【操作系统中的结构体对齐和字节对齐】
可以通过预编命令#pragma pack(n),n=1,2,4,8,16来改变这一系数,其中的n就是指定的对齐系数。
2024-07-25 21:33:56
365
原创 【include头文件的顺序以及双引号““和尖括号<>的区别】
对于include头文件来说,如果在文件a.h中使用到了文件b.h中定义的变量而不引用b.h,则要在文件a.h中首先引用文件b.h,否则会报错“变量类型未声明”。
2024-07-25 20:30:45
409
原创 【C++11新特性】
long long 整型有两种:long long和unsigned long long。在C++11中,标准要求以long long整型可以在不同平台上有不同的长度,但至少有64位。我们在写常数字面量时,可以使用LL后缀(或是ll)表示一个long long 类型的字面量,而ULL(或是ull、Ull、uLL)则表示一个unsigned long long 类型的字面量。
2024-07-25 18:13:39
1152
原创 【C++中线程学习】
C++11之前没有引入线程的概念,如果想要实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthead.h>,或者windows下的<windows.h>。C++11提供了语言层面上的多线程,包含在头文件<thread.h>中,解决了跨平台的问题,提供了。C++11新标准中引入了5个头文件来支持多线程编程。
2024-07-24 21:33:26
1217
原创 【GoF23种设计模式+简单工厂模式】
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码,让代码更容易被他人理解并且保证代码可靠性。设计模式一般包括:模式名称、问题、目的、解决方案、效果等组成要素,其中模式名称、问题、解决方案和效果是关键要素。在学习每一个设计模式时至少应该掌握如下几点:这个设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它;它是如何解决的,掌握它的结构图,记住它的关键代码;能够想到至少两个它的应用实例,一个生活中的,一个软件中的;
2024-07-23 20:26:05
1176
原创 【7种面向对象设计原则】
如何同时提高一个软件系统的和是面向对象设计需要解决的之一。在面向对象设计中,可维护性的复用是以设计原则为基础的。每一个原则都蕴含一些面向对象设计得思想,可以从不同的角度提升一个软件系统结构的设计水平。
2024-07-23 12:38:08
1187
原创 【数据结构--排序】
就是重新排列表中的元素,使表中的元素满足按关键字有序的过程。为了查找方便,通常希望计算机中的表是按关键字有序的。排序的确切定义如下:输入:n个记录R1R2RnR1R2...Rn,对应的关键字为K1K2KnK1K2...Kn。输出:输入序列的一个重排R1′R2′Rn′R1′R2′...Rn′,使得K1′K2′K3′Kn′K1′
2024-07-22 16:55:05
940
原创 【数据结构--查找】
则查找成功,返回该元素在线性表中的位置,若已经查找到线性表另一端,但还没查找到符合条件的元素,则返回查找失败的信息。线性探测法可能使第i个散列地址的同义词存入第i+1个散列地址,这样本应存入第i+1个散列地址的元素就争夺第i+2个散列地址的元素的地址,从而造成大量元素在相邻的散列地址上堆积,大大降低了查找效率。分块查找的时间复杂度取决于块的数量以及块内元素的数量,在最坏的情况下(即目标位于最后一个块的最后一位),不仅需要查找完所有的块,也需要在最后一个块中遍历完所有的元素,因此,时间复杂度为。
2024-07-21 22:02:38
1557
原创 【2.移除元素】
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。遍历所给数组,以k为数组下标,共有k个满足要求的元素,所以把遍历得到的元素依次放进数组前k位就行。给你一个数组 nums 和一个值 val,你需要。
2024-07-19 12:15:54
240
原创 【1.合并两个数组】
为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n。若是用双指针指向数组末尾,从后往前进行排序再从末尾填充进nums1,因为nums1的空间大小为m+n,恰好是够装nums1+nums2的内容的,所以也不会出现被覆盖的问题。给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。空间复杂度为:O(m+n)
2024-07-18 20:06:10
223
原创 数据结构---图
图是由顶点的有穷非空集合V(G)和顶点之间边的集合E(G)组成,通常表示为:G=(V,E),其中G表示图,V是图G中顶点的集合,E是图G中边得集合。若V={V1,V2,V3,...,Vn},则用|V|表示图中顶点的个数,也称为图的阶,,用|E|表示图G中边的条数。注意:线性表可图中不能一个顶点也以是空表,树可以是空树,但是图不能是空图。也就是说图中不能一个顶点也没有,图的顶点集合V一定非空,但是边集E可以为空,此时的图只有顶点没有边。
2024-07-18 11:31:10
1187
原创 【B树、B-树、B+、B*树】
B-tree即B树,B是Balanced,平衡的意思,因为B树的原英文名称为B-tree,国内很多人将其译为B-tree,所以B树就是B-树。磁盘管理系统中的目录管理,以及数据库系统中的索引组织多数都采用B树这种数据结构。树中每个结点至多有m棵子树;若根结点不是叶子结点,则至少有两棵子树;除根之外的所有非终端结点至少有[m/2](向上取整)棵子树;
2024-07-15 20:27:07
1532
原创 【理解C++中的树】
有且仅有一个特定的称为根的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集合T1、T2、T3、…、Tm,其中每个集合本身又是一棵树,并且称为根节点的子树。没有后继的结点称为叶结点(或终端结点);有后继的结点称为分支结点(或非终端结点);除了根结点外,任何一个结点都有且仅有一个前驱;每个结点可以有0个或多个后继。树是一种递归的数据结构。n=0时,为空二叉树;由一个根结点和两个互不相交的被称为根的左子树和右子树组成,左子树和右子树也分别是一颗二叉树。
2024-07-14 22:14:40
1491
原创 【理解串】
其中,S是串名,双引号’'括起来的字符序列是串的值,a可以是字母、数字或其他字符,串中字符的个数n称为串的长度,当n=0时,称串为空串。串是一种特殊的线性表,数据元素之间呈线性关系,串的数据对象限定为字符集(中文字符、英文字符、数字字符、标点字符等)。朴素模式串匹配算法的缺点:当某些子串与模式串部分匹配时,主串的扫描指针i经常回溯,导致时间开销增加;在主串中找到与模式串相同的子串,并返回其所在主串中的位置。子串在主串中的位置:子串的首字符在主串中的位置。字符在主串中的位置:字符在串中的序号;
2024-07-11 21:57:52
892
原创 【数组、特殊矩阵的压缩存储】
只能用数字,字母和下划线命名,且不能用数字作为开头,注意数组名不要与其他变量名重复;数组的下标从0开始。一维数组的三种定义方式://数据类型 数组名[数组长度];//定义一个长度为10的数组,数组元素为int型//使用数组下标对数组元素进行访问//数组第一个元素的下标为0//数组最后一个元素的下标为9,对于长度为i的数组,最后一位元素的下标即为i-1注意:定义数组时,若未给定数组元素的初始值,则必须指定数组的长度,否则提示错误,因为编译时需要分配空间,数组长度未知的话,无法进行分配。
2024-07-11 17:03:16
1149
原创 【栈和队列】
10;//定义栈内元素的最大个数//静态数组存放栈的元素int top;//栈顶元素}SqStack;SqStack S;//声明一个顺序栈(分配空间)采用链式存储的栈被称为链栈。优点:便于多个栈共享存储空间和提高效率,且不存在满栈上溢的情况。在实现数据入栈时,需要将数据从链表的头部插入(头插);在实现数据的出栈时,需要删除链表头部的收元结点。因此,链栈就是一个只能采用头插法插入或删除数据的链表。//初始化链栈//判断链栈是否为空10;
2024-07-10 20:50:53
1304
原创 【线性表,线性表中的顺序表和链表】
线性表是具有相同数据类型的n(n>0)个数据元素的有限序列。存在唯一的第一个元素;存在唯一的最后一个元素;除第一个元素外,每个元素均只有一个直接前驱;除最后一个元素外,每个元素均只有一个直接后继;【直接前驱】:指在该序列中位于其前面且紧邻的元素;【直接后继】:指在该序列中位于其后面且紧邻的元素。例如:在一个整数数组[1,5,8,10,49]中,元素8的直接前驱为5,直接后继为10。
2024-07-10 09:53:47
2665
原创 【数据结构和算法的概念等】
又称为哈希存储,地址会通过hash算法来运算成一个相同长度的hash值,然后存放这个hash值,而不是直接存放地址,在访问关键字的时候会通过运算解码hash值,然后再访问。用一组连续的存储单元依次存储数据元素,数据元素之间的逻辑关系由元素的存储位置表示;一组值的集合以及定义于这个值集上的一组操作(如:int),原子类,结构类。用一组任意的存储单元存储数据元素,数据元素之间的逻辑关系用指针来表示;数据的存储结构是指:数据及其逻辑结构在计算机中的表示。数据的逻辑结构是指:数据之间逻辑关系的整体。
2024-07-09 17:47:56
513
原创 【C++中resize和reserve的区别】
改变当前容器的最大容量(capacity),不会生成元素,只是确认这个容器允许放入多少对象,如果reserve(len)的值大于当前的capacity(),那么会重新分配一块能存len个元素的空间,然后把之前的vct.size()个元素通过copy construtor复制过来,销毁之前的内存。发现在进行了vct.reserve(150)之后,再将reserve()参数设置为比150小的,不发生变化,说明如果新的容量比原来的容量小,reserve()函数不会做任何事情。
2024-07-09 16:35:31
356
原创 【sizeof()求内存、内存对齐】
对于没有override的虚函数,基类和派生类中_vfptr指向的虚函数表中,这个虚函数的地址是一样的,而对于重写了的或者默认重写的析构函数来说,_vfptr指向的虚函数表,函数地址是不一样的(当然两个类的虚表指针指向的地址也是不一样的)。因为sizeof(char) = 1,sizeof(double) = 8,按照最长的字节数来进行存储,所以1 + (7)+ 8 = 16。C++类中如果有虚函数,类内就会有一个虚表指针_vfptr,指向自己的虚函数表,vptr一般都是在类的最前面。
2024-07-09 09:43:56
937
原创 【时间复杂度的计算】
时间复杂度(time complexxity)是一个定性描述该算法运行时间的函数,它代表算法输入值的字符串的长度。时间复杂度常用O表述,不包括这个函数的低阶项和首项系数。时间复杂度的大小比较:算法完成工作最少需要多少基本操作叫做最优时间复杂度,是一种最乐观理想的状态;算法完成工作需要多少基本操作叫做最坏时间复杂度,是算法的一个保障;算法完成工作平均需要多少基本操作叫做平均时间复杂度,它可以均匀全面地评价一个算法的好坏。
2024-07-08 21:38:35
1074
原创 【理解STL】
STL是惠普实验室开发的一系列标准化组件的统称。STL的一个基本理念就是将数据和操作分离,数据由容器加以管理,操作则由可定制的算法完成,迭代器在两者之间充当“黏合剂”。容器是存储其他对象的对象,它存储的对象可以是自定义数据类型的对象,也可以是内置数据类型的对象。这些被存储的对象必须是同一种数据类型,它们归容器所有,称为容器的元素。当容器失效时,容器中的元素也会失效。容器本身包含了处理这些数据的方法。另外,容器最重要的优点就是它可以扩展自身的大小。
2024-07-08 16:45:19
1447
原创 【理解fork()、wait()、exec()函数】
父进程产生子进程使用fork拷贝出来一个父进程的副本,此时只拷贝了父进程的页表,两个进程都读同一块内存,当有进程写的时候使用写实拷贝机制分配内存,exec函数可以加载一个elf文件去替换父进程,从此父进程和子进程就可以运行不同的程序了。fork从父进程返回子进程的pid,从子进程返回0。调用了wait的父进程会发生阻塞,直到有子进程状态改变,执行成功后返回0,错误返回-1。exec执行成功则子进程从新的程序开始运行,无返回值,执行失败返回-1。
2024-07-05 16:55:20
188
原创 【理解进程与线程、并行与并发等】
线程是进程的子任务,是CPU调度和分派的基本单位,用于保证程序的实时性,实现进程内部的并发;此外,在可剥夺的操作系统中,当有更高优先级的进程就绪时,调度会将正在运行的进程转为就绪状态,让更高优先级的进程运行;创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进程的信息,然后由系统为该进程分配运行时所需的资源,最后将该进程转入就绪状态;父进程号(PPID):任何进程(除int进程)都是由另一个进程创建,该进程被称为创建进程的父进程,对应的进程号就是父进程号。
2024-07-05 16:43:56
920
原创 【指针数组、数组指针、函数指针、指针函数的区别】
先是一个名为fp3的指针,指向一个参数为空的函数,函数返回的是一个指针,指针指向一个大小为10的数组,数组中每一个元素都是指针,指向一个参数为空的函数,函数返回值为int型。先是一个名为fp2的指针,指向一个函数,这个函数有三个int型的参数,函数返回的是一个指针,这个指针指向一个参数为int型的函数,函数返回指为float型。先是一个名为fp1的指针,指向一个参数为int型的函数,它返回的是指针,这个指针指向一个大小为10的数组,数组中的每个元素都是一个void*指针。
2024-07-04 20:57:20
276
原创 【int、double、float、short、char等常见类型所占字节】
【代码】【int、double、float、short、char等常见类型所占字节】
2024-07-04 20:22:50
261
原创 【理解new/delete和malloc/free】
1.new运算符开辟空间成功时,返回的是对象类型的指针,类型与对象严格匹配,无需进行类型转换;它的参数是一个void指针,无返回值。如果在malloc()函数的开辟过程中遇到了无法分配请求的内存块(即开辟失败),会返回一个NULL指针,因此malloc的返回值一定要进行检查。3.使用new运算符申请空间时无需指定空间的大小,编译器会根据类型信息自行计算,而使用malloc时需要显示地指定所申请空间的大小。就是开辟一个有10个int型大小的空间,int是4个字节,所以开辟的空间就是40字节。
2024-07-04 20:01:48
463
原创 【const关键字的作用】
一、const的定义二、const使用原理1、const+全局/局部变量2、const修饰指针/引用3、const修饰函数参数4、const修饰函数返回值5、const成员函数和数据成员6、const修饰类对象二、const与宏定义的区别三、const与static的区别
2024-07-02 20:02:53
683
原创 【写一个在main函数执行前先运行的函数】
((constructor))这个特殊语法通常用于标记在程序执行main函数之前需要执行的初始化函数,是GNU C/C++的特色,不一定在其他编译器中得到支持。
2024-07-02 16:41:23
171
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人