自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 从中国数据库发展史看技术演进与未来趋势:观影感悟

然而,在不断的学习和项目实战中,数据库成为了我工作中的“定海神针”,从简单的查询到复杂的优化,逐渐让我意识到,它在系统架构中的核心地位。最终,系统上线后,能够顺利处理日常的订单管理需求,虽然只是个小项目,但让我真正对数据库的能力有了实战的认知。这让我联想到自己的工作经历,在面对项目中数据库性能问题时,如果没有足够的技术积累和实战经验,是很难做出正确的决策的。从我最初接触数据库时的懵懂无知,到如今能独立承担一些数据库设计和优化的工作,这条路上,我学到了很多,也积累了不少宝贵的经验。

2024-09-19 19:41:55 909 49

原创 你真的知道TCP协议吗?滑动窗口是什么?有什么重传机制?拥塞控制又是什么?一篇文章带你吃透TCP协议

如下图,当我们发送前1000个数据的时候,收到的ACK是1001,然后返回的缓冲区大小是3000,那么当对方的接收缓冲区的数据一直没有被取走的话,那么下一次的。滑动窗口是如何更新的呢?TCP还规定了确认序号之前的报文一定是被收到了,因为允许少量的应答报文丢失,假设101,201,301全部丢失,只有401返回,那么401之前的报文也是全部被收到了的。有了确认应答机制,就能保证上一条报文是可靠的,因为最后一条报文是没有报文的,所以没有百分百可靠的网络通信,只能确认上一条报文的发送是可靠的。

2024-09-07 17:53:28 1140 46

原创 TCP协议为什么是三次握手和四次挥手

一次握手就能成功的话,也就代表着不需要进行确认,那么万一有恶意的服务器一直发送SYN,而服务器需要维护大量的连接,维护连接又需要成本,那么就很。

2024-08-19 14:25:24 401 34

原创 浅谈面向数据报的协议-UDP协议

了。还有两个小问题:1.UDP协议是如何解决。

2024-08-08 21:54:36 1098 42

原创 linux-环境变量,进程地址空间

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有。下面这段代码就是将命令行参数传递给main函数的参数,然后进行模仿命令行的指令+选项,选项的本质也就是命令行参数。echo $NAME//NAME:你的环境变量名称PATH :指定命令的搜索路径。

2024-08-03 10:47:17 975 7

原创 linux-进程(2)

进程id(PID)父进程id(PPID)每一个可执行程序运行起来之后都会成为一个进程,每个进程都有一个自己的id,以及一个父进程id,父进程就是创建自己进程的进程,每个进程都是一个执行起来的程序,所以肯定在这个程序中创建另一个程序,就是自己的子进程。使用getpid这个函数就可以查看到自己这个进程的id,使用getppid这个函数就可以查看到父进程的id,getpid是一个系统调用函数,需要注意的是一个子进程只有对应的一个父进程,但是一个父进程可以有多个子进程。

2024-04-25 20:22:17 790 7

原创 linux-进程(1)

计算机管理硬件1. 描述起来,用struct结构体2. 组织起来,用链表或其他高效的数据结构。

2024-03-31 19:15:02 1180 1

原创 C++-树形关联式容器map的使用

1. map是关联容器,它按照特定的次序(按照key来比较)存储由键值key和值value组合而成的元素。2. 在map中,键值key通常用于排序和惟一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,k3. 在内部,map中的元素总是按照键值key进行比较排序的。4. map中通过键值访问单个元素的速度通常比unordered_map容器慢,但map允许根据顺序。

2024-03-14 12:42:07 1014 2

原创 C++-树形关联式容器set的使用

1. set是按照一定次序存储元素的容器2. 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。3. 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。4. set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。

2024-03-11 12:25:11 965

原创 C++-你知道二叉搜索树吗?(循环版)

或者是具有以下性质的二叉树在二叉搜索树中,右子树上的任意一个节点的值都大于当前节点的值,左子树上的任意一个节点的值都小于当前节点的值,所以查找值的时候效率就很高,在任意位置插入和删除数据也不需要挪动,而且搜索二叉树走中序遍历就是一个升序。

2024-03-01 15:29:36 906 2

原创 C++-带你走进多态(2)

一个含有虚函数的类中都至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也简称虚表,。那么派生类中这个表放了些什么呢?我们接着往下分析。

2024-02-27 16:43:32 1020 3

原创 C++-带你走进多态(1)

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。public:virtual void BuyTicket() { cout

2024-02-25 13:30:08 880 1

原创 C++-带你初步走进继承(2)

当我实例化了一个Assistant对象时,再访问成员变量_name就会报错,因为_name有两份,一份是Teacher的,一份是Student的.上面这段代码的作用就是统计个数,因为派生类的对象在实例化时一定会调用基类的构造函数,所以这个_count就会++,并且是同一个_count。也就是说,基类的友元不是派生类的友元,如果想让派生类也可以使用这个函数,就需要在派生类的内部声明这个友元函数,否则访问不了派生类的成员。继承一定程度破坏了基类的封装,基类的改变,对派生类有很。,因为对象的内部细节是不可见的。

2024-02-20 17:42:30 790

原创 C++-带你初步走进继承(1)

机制是面向对象程序设计。

2024-02-19 20:34:52 852

原创 C++-手把手教你模拟实现string

模拟实现string只需要三个成员变量,capacity,size,_str,也就是容量,数据大小,指向字符串的指针。

2024-02-17 21:06:03 1011

原创 C++-带你深度理解string类的常见接口

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可 能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本 都使用string类,很少有人去使用C库中的字符串操作函数。下面这个链接是c++官网里面有关string的文档介绍。

2024-02-14 21:43:18 789

原创 C++-模板基础

大家在学习过程中一定写过swap函数吧,那么swap函数的可以写成很多种形式,因为形参的类型可以是任意类型,那么我们如果想用多种swap函数的话,就意味着我们必须写多个swap函数吗?不是的,C++为了解决这个问题,引入了模板这个概念。通过比较这几个swap函数,我们可以发现,这些函数的内容是一样的,唯一的区别就是参数。 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。 template<typename T1, typename T2,...

2024-02-04 20:25:05 945

原创 Linux项目自动化构建工具-make/Makefile

会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作makefile带来的好处就是——“自动化编译,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile。

2024-02-01 21:10:41 926 2

原创 C++-内存管理

我们来看下面这段代码,如果使用malloc为自定义类型的对象开空间的话,就没办法初始化,因为自定义类型的初始化在构造函数里面,构造函数是对象实例化的时候自动调用的。

2024-01-30 21:21:28 1022 2

原创 C++-类和对象(3)

定义时不添加static关键字,类中只是声明3.类静态成员即可用。

2024-01-20 20:09:47 931 2

原创 Linux编译器-gcc/g++使用

静态库和动态库最本质的区别就是在进行编译链接的时候,静态库会将程序中需要的文件拷贝一份到程序中,从此不需要第三方库,也不受影响,这就是静态连接。结果gcc的-c选项之后,生成了一个test.o的文件,文件内部就是二进制,但由于vim是文本编辑器,所以识别不出来。因为预处理阶段会进行头文件展开,就是将c语言中写好的头文件拷贝到这个test.i中,这就是头文件的展开。缺点:对库的依赖性较强,一旦库缺失,所有使用库的程序都无法运行。允许进行拷贝的库就是静态库,允许进行关联的库就是动态库。在编译时默认使用动态库。

2024-01-09 15:28:15 1611 13

原创 C++-类和对象(2)

默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。

2024-01-03 22:47:15 1695 13

原创 Linux-权限

目录的可执行权限是表示你可否在目录下执行命令。如果目录没有-x权限,则无法对目录执行任何命令,甚至无法cd进入目录即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)而如果目录具有-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限。所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。

2023-12-29 14:07:29 3261 16

原创 C++-类和对象(1)

比如: 之前在数据结构中,用。

2023-12-26 21:05:04 1791 11

原创 C++入门(2)

那么inline内联函数拥有宏函数的优点,还避免了它的缺点,可以调试,而且没那么多的语法细节。在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的。而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。在for里面会自动取数组里面的值赋值给e,自动判断结束,自动++。,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运。,没有函数调 用建立栈帧的开销,内联函数提升程序运行的效率。的做法,如果编译器将函数当成内联函数处理,在。

2023-12-17 23:50:01 1309 36

原创 C++入门(1)

定义命名空间,需要使用到。

2023-12-17 17:26:50 772 40

原创 排序算法-快速排序

快速排序是Hoare于1962。上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,同学们在写递归框架时可想想二叉 树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。将区间按照基准值划分为左右两半部分的常见方式有:1.2.3.我来给大家讲解一下前后指针版本,因为这个代码简洁,但是不太好理解。

2023-12-12 23:13:26 2175 68

原创 排序算法-选择/堆排序(C语言)

首先写一个单趟,maxi和mini都在同一个位置(最左边),然后写一个for循环,下标i用来遍历数组,i的起始位置是begin+1,结束条件是i>end,进入循环开始找最大值和最小值的下标,循环结束意味着maxi和mini已经到了相应的位置,就可以开始交换值了,交换完最小值后要注意一下,如果maxi一直是begin这个位置,那么就已经被换走了,换到了a[mini]这个位置,所以要修正一下,将maxi=mini,再交换最大值。它是 通过堆来进行选择数据。元素,则将它与这组元素中的最后一个(第一个)元素交换。

2023-12-10 15:50:26 3200 56

原创 排序算法-插入/希尔排序

假设实现一个升序,首先创建一个变量end=0,然后tmp保存a[end+1]的值,写一个while循环,结束条件是end<0,进入循环判断tmp和a[end]的大小,如果tmp小则将a[end]的值覆盖到a[end+1],然后end--,跳出循环,此时将tmp插入到a[end+1]也就是a[0]这个位置。然后将tmp的值插入到a[end+1]这个位置。然后写一个循环控制end的位置,每次end+gap。的取值方法很多,导致很难去计算,因此在好些树中给出的 希尔排序的时间复杂度都不固定。

2023-12-08 22:31:03 1771 65

原创 LeetCode-二叉树OJ题

965. 单值二叉树先判断这棵树是否为空,如果是空树则是true。再判断左子树是否为空,并且左子树的值val和当前节点的val不相同,如果这左子树不为空且val不等于root的val则返回false,再使用相同方式判断右子树。最后递归一下左右子树即可,只有左右子树有一个返回false,则整体返回false。

2023-12-05 17:32:35 1496 52

原创 Leetcode-二叉树oj题

144. 二叉树的前序遍历这个题目在遍历的基础上还要求返回数组,数组里面按前序存放二叉树节点的值。既然要返回数组,就必然要malloc一块空间,那么我们需要算出这个二叉树的节点个数,所以就创建一个函数TreeSize求出节点个数。TreeSize的实现在上篇文章有提到所以在preorderTraversal里面创建一个变量n来接收TreeSize的返回值,再为变量amalloc一块空间,空间大小是n个int。

2023-12-01 19:14:20 1492 85

原创 数据结构-二叉树(2)

1.升序:建大堆;2.降序:建小堆。这种写法有两个缺点:1、先有一个堆的数据结构2、空间复杂度复杂度的消耗所以我们可以稍微改进一下,使得只要有一个数组就可以进行堆排序:假设要排一个升序:先使用向下调整的方式建一个大堆,然后再写一个循环,当end=0时结束循环,每次进入循环先交换首尾数据,然后从头开始进行向下调整,每次end--。

2023-11-29 21:47:35 1088 59

原创 数据结构-二叉树(1)

堆的底层可以定义一个数组。int size;}HP;

2023-11-27 21:34:14 1139 66

原创 手把手教你实现一个循环队列(C语言)

int K;int* a;int front;int rear;

2023-11-26 16:17:56 468 43

原创 你知道如何使用队列实现栈吗?(C语言)

题目要求是使用两个队列实现栈,那么就直接在栈的定义里面包含两个队列即可。Que q1;Que q2;} MyStack;

2023-11-25 16:08:44 410 17

原创 数据结构-队列

多个值我们使用两个结构体来封装,方便找头和尾。}QNode;int size;}Que;

2023-11-25 13:11:43 1096 66

原创 数据结构-栈的实现

int top;}ST;

2023-11-22 18:53:04 1283 88

原创 数据结构-双向链表

在单链表那一篇博客中介绍了单链表和双向链表的优缺点,所以此篇博客直接分享怎样实现一个带头双向循环链表。

2023-11-16 18:10:54 1496 90

原创 leetcode-链表经典题

206. 反转链表这里我们使用创建一个变量cur来遍历原链表,再创建一个新节点newnode,首先使用一个循环来遍历原链表,cur为NULL是循环结束,每次进入循环将cur的下一个节点赋给tail,然后将cur取下来头插,第一次头插的节点的next置为NULL,也就是cur->next=newnode,然后将cur这个节点赋给newnode,在新链表上相当于往左走一步,newnode=cur,然后cur在旧链表上往右走,cur=tail。

2023-11-12 21:46:50 1669 79

原创 数据结构-单链表

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。从以上图片可以看出:1.链式结构在逻辑上是连续的,但在物理上不一定是连续的。2.现实中的节点一般是在堆上申请出来的。3.从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,可能不连续。

2023-11-08 20:38:34 1583 85

空空如也

空空如也

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

TA关注的人

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