自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 一文搞定MYSQL基础知识

文章目录前言一、MySql索引1.1 什么是索引1.2 索引的优点1.3 索引的缺点1.4 索引的分类1.5 索引的操作1.6 索引的底层原理1.7 聚簇索引和非聚簇索引1.8 局部性原理1.9 磁盘预读1.10 回表1.11 索引覆盖1.12 索引下推1.13 最左匹配二、事务2.1 什么是事务2.2 事务的四大特征2.2 事务隔离级别2.3 MVCC三、锁3.1 锁的分类3.2 表锁3.3 行锁3.4 共享锁(读锁)3.5 排他锁(写锁)3.6 悲观锁3.7 乐观锁四、InnoDB和MYISAM的区别相

2021-05-05 15:19:26 410

原创 HTTP协议

HTTP协议HTTP协议定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器(客户)。HTTP是万维网上能够可靠地交换文件(文本、声音、视频等各种多媒体文件)的基础。HTTP是应用层协议,但它在传输层使用面向连接的TCP协议传输文件,保证了数据的可靠传输。一、HTTP协议的特点面向事务HTTP不仅传送完成超文本跳转所必需的信息,而且也传送任何从互联网上得到的信息,如文本、超文本、声音或图像等。无连接虽然HTTP使用了TCP连接,但通信双方在

2021-04-11 13:05:26 330

原创 TCP拥塞控制

拥塞控制在计算机网络中的链路容量(即带宽)、交换结点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫做拥塞。所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。简单来说就是控制发送方发送数据的速率与当前网络状况的匹配。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到所有主机,所有路由器,以及与降低网络传输性能有关的所有因素。几种拥塞控制

2021-04-08 17:13:00 219

原创 TCP滑动窗口

滑动窗口TCP 协议是利用滑动窗口实现流量控制的。一般来说,我们总是希望数据传输得更快一些,不会一次只发一个字节。但是如果发送方把数据发得过快,接受方就可能来不及接收,这就会造成数据的丢失。所谓流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。在 TCP 的报头中有一个字段叫做接收通告窗口,这个字段由接收端填充,是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。所以发送端就会有一个发送窗口,这个发送窗口的大小是由

2021-04-07 21:31:57 210

原创 TCP三次握手和四次挥手

Tcp 协议提供的是:面向连接、可靠的、字节流服务。使用 TCP 协议通信的双发必须先建立连接(三次握手),然后才能开始数据的读写。双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输。TCP 连接是全双工的,双方的数据可以通过一个连接进行读写。完成数据交换之后,通信双方都必须断开连接(四次挥手)以释放系统资源。TCP的报头结构:TCP端口号TCP的连接是需要四个要素确定唯一一个连接:(源IP,源端口号)+ (目地IP,目的端口号)所以TCP首部预留了两个16位作为端口号的存

2021-04-07 18:07:02 124

原创 计算机网络基础概论

网络网络是由若干结点和连接这些结点的链路组成的。网络中的结点可以是交换机、主机、路由器等。传输介质有:双绞线、光纤、同轴电缆等互联网多个网络连接起来就形成了互联网。目前最大的互联网就是因特网。IP地址IP地址就是给因特网上的每一个主机(或路由器)的每一个接口分配的一个在全世界范围内唯一的标识。通常用点分十进制来表示。例如:“192.168.1.10”。每个IP地址由主机号和网络号两部分组成。D类和E类地址一般不使用。使用命令“ifconfig”可以在 linux 下查看..

2021-04-04 18:08:42 159

原创 Linux 线程的创建与同步

1.线程的概念线程是进程内部的一条执行序列或执行路径,一个进程可以包含多个线程。2.进程与线程的区别进程是资源调度的最小单位,线程是CPU调度的最小单位进程有独立的地址空间,线程共享进程的地址空间进程切换的开销大,线程切换开销相对较小进程创建消耗的资源大,线程相对较小3.线程同步线程同步指的是当一个线程在对某个临界资源进行操作时,其他线程都不可以对这个资源进行操作,直到该线程完成操作, 其他线程才能操作,也就是协同步调,让线程按预定的先后次序进行运行。线程同步的方法有四种:互斥锁、信号量

2021-03-29 19:58:49 90

原创 【Linux】进程间通信

进程间通信的五种方式1.有名管道有名管道可以在任意两个进程间通信有名管道的创建:(1)命令创建:mkfifo FIFO​ (2)系统调用创建:filename是管道名,mode是文件权限int mkfifo(const char *ilename,mode_t mode);2.无名管道无名管道主要应用于父子进程间的通信无名管道的创建:int pipe(int fds[2]);/* 成功返回0,失败返回-1 fd

2021-03-28 21:09:50 90

原创 【Linux】进程及进程创建

进程进程:进程就是处于执行期的程序。但进程并不局限于一段可执行程序代码,打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间,一个或多个执行线程(简称线程),用来存放全局变量的数据段等都可以是进程,实际上,进程就是正在执行的程序代码的实时结果。在操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存内核把进程的列表存放在任务队列(task list)的双向循环链表中,链表中的每一项都是类型为task_struct的结构,称为进程描述符,进程描述符中包括一个进程的所有信

2021-03-28 12:06:27 112

原创 [C++]STL库list和vector的简单介绍

list和vector1.list 的介绍(1)list 是序列容器,允许在任何位置进行O(1)时间的插入和删除操作(2)list 容器使用双链表实现(3)list 与其他基本标准序列容器(array、vector 和 deque)相比,list 通常在容器内的任何位置插入、提取和移动元素(4)list的主要缺点是不能通过位置直接访问元素,必须从已知位置(如开始或结束)迭代到该位置(5)list 要使用一些额外的内存空间(next,prev)来保持与每个元素相关联(前后序的线性)的链接信息,从

2021-03-16 15:51:15 189

原创 【C++】引用和内联函数

一、引用1.引用的定义:类型& 引用变量名称 = 变量名称;int a=10;int &b=a;//引用2.引用的本质就是给变量取别名3.引用和指针的区别:(1)指针有自己的一块空间,而引用只是一个别名(2)指针的大小是4,而引用的大小则是被引用对象的大小(3)指针可以被初始化为NULL,而引用必须初始化且必须是一个已有对象的引用(4)作为参数传递时,指针需要被解引用才可以对对象进行操作,而引用则可以直接操作(5)指针在使用中可以指向其他对象,而引用只能是一个对象的引用

2021-03-05 13:45:14 121

原创 【C++】C和C++的区别

C++和C的区别1.C是面向过程的语言,C++是面向对象的语言,因此C++语言不仅有类和对象以及继承多态这样的OPP语言必备的内容,并且C++还支持模板,运算符重载、智能指针等,还有非常强大的设计模式,例如工厂模式、观察者模式等,这些都是C语言不支持的。2.输入输出的区别。c输入输出时需要考虑格式,但C++不需要,直接输入输出就好以输出为例:int main(){ int a = 10; double b = 10.28; char c = 'A'; printf("%d %lf

2021-03-04 12:14:04 320 1

原创 阶乘后的零

题目:给定一个整数 n,返回 n! 结果尾数中零的数量。示例 1:输入: 3输出: 0解释: 3! = 6, 尾数中没有零。示例 2:输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) 。/** 题目:阶乘后的0* 算法:1、首先用递归算出n的阶乘* 2、让n!对10取余,就能得到个位上的数字,然后判断* 3、n!对10取模,舍弃个位的数*/int factorial(int n){

2020-10-25 20:24:15 127

原创 丢失的数字

题目:给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。进阶:• 你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?示例 1:输入:nums = [3,0,1]输出:2解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。示例 2:输入:nums = [0,1]输出:2解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2

2020-10-25 20:22:58 166

原创 个人主页进阶版

表单练习:先来看效果:CSS层叠样式表再来看代码<html> <head> <title>马哈哈的个人主页</title> </head> <body background="HTML\主页背景.jpg" > <h1><p align="center"><font color="black" face="楷体">自我介绍</font&

2020-10-24 23:11:30 601

原创 使用HTML制作一个简单的个人主页

此网页我对html有了一个简单,初步的认识后制作的一个网页,主要目的是练习html的一些简单操作,由于时间关系,有很多做的不好,细节处理不到位的地方。废话不多说,先来看效果1、首页这一个网页就是进行了网页背景、背景音乐、段落的处理、水平线以及超链接的简单练习。2、我的相册这一页主要是对大量图片进行一个排版的练习3、我的计划这一页主要是对文本有序无序以及表格内部的背景颜色等等的练习4、我的家乡这一部分是对段落、还有文本与图片结合的练习5、我的故事这个是对表格进阶版的练习,文字

2020-10-09 23:06:21 201721 67

原创 Linux(七)---进程和虚拟地址空间

一、进程1.进程的概念进程就是程序的一次动态执行过程,也就是运行中的程序。进程有三种基本状态:就绪状态、执行状态、阻塞状态三种状态之间的关系:操作系统是通过管理进程,让进程运行来完成用户指定的任务。进程是在内存上运行的,而程序是存储在磁盘上的二进制可执行文件。2.进程和程序的区别(1)程序是永存的,而进程是暂时的(2)程序是静态的,进程是动态的(3)进程具有并发性,而程序没有(4)进程是竞争计算机资源的基本单位,而程序不是(5)进程和程序不是一一对应的。一个程序可以由多个进程执行,一

2020-09-15 21:14:52 310

原创 JAVA学习(1)----java环境的搭建

java环境的搭建过程主要分为三个方面:一、JDK的安装第一步:通过JDK官网获取JDK,链接为:在这里我用jdk-8u144版本为例安装第二步:以管理员身份运行此文件第三步:直接点下一步第四步:点击以下界面的更改按钮,更改安装路径(选一个自己想要安装目录作为安装路径)安装路径更改成功,点下一步注意:安装路径不要有中文、空格或特殊字符,安装路径统一第五步:同第四步一样,更改安装路径更改的路径与第四步的路径一样第六步:等待安装第七步:JDK安装成功,关闭窗口当然你也可以通过DOS窗口来

2020-09-15 20:20:40 197

原创 Linux(六)--编译链接原理

一、编译链接原理我们编译一个程序的过程,其实是由四个步骤组成的,分别是:预编译、编译、汇编、链接。虽然我们现在都是在IDE这种集成开发环境下进行产品的开发,平时也不需要关注程序到底是怎么进行编译链接的,但了解编译链接原理对我们学习编程,以及对我们编写程序有很大帮助,因此,我们十分有必要学习程序的编译链接原理。接下来,我们就从四个步骤开始入手学习。1、预编译阶段预编译阶段主要处理那些源代码中以“#”开头的预编译指令,具体如下:(1)处理“#include”预编译指令,将被包含的文件插入到该预编译指令的

2020-09-08 17:41:04 176

转载 Linux(五)---GCC和G++的使用和区别

详细内容请看链接分享的博客,作者写的很详细总结gcc和g++的区别:1、gcc默认只链接C库,并不会链接C++的库,g++默认链接C++库和C库gcc编译.cpp文件需链接上C++的库:gcc -o main main.cpp -lstdc++2、gcc按照C语言的方式编译.c文件,按照C++的方式编译.cpp文件。而g++不管是.c文件还是.cpp文件,都是按照C++的方式进行编译。...

2020-09-05 15:16:10 147

原创 Linux(四)--vi/vim的认识与使用

一、认识vi/vim简单来说,vi就是Linux下的一种文书编辑器,而vim则是vi的进阶版。vim的功能很强大,它可以进行程序编辑、支持正规表示法的搜寻架构、多档案编辑、区块复制等等,并且它还可以用颜色或底线等方式来显示一些特殊的信息。如果你要在Linux下工作,vim是一个十分重要的工具。Linux 在文字接口下的 文书编辑器其实有很多,常常听到的就有: emacs, pico,nano, joe, 及 vim 等等。那么我们为什么一定要学 vim呢?那当然是vim有很多优点了:1、所有的Uni

2020-09-01 19:54:38 164

原创 Linux(三)-----系统文件相关的操作命令

先来回忆一下常见的文件类型有哪些?文件类型:普通文件 -目录文件 d管道文件 p链接文件 l设备文件:字符设备 c 块设备 b 套接字 s一、普通文件和目录文件的常用命令1、创建文件注:文件名中不能出现空格、字母、下划线、英文点如果有扩展名,创建时必须指定大小写是有区分的-:touch filename示例:创建一个名为myfirstfile的普通文件d:mkdir dirname示例:创建一个名为mydir的目录文件2、删除文件-:r

2020-08-30 18:56:27 116

原创 Linux学习(二)---文件类型、文件权限等

一、路径绝对路径:从根目录为起点到当前所在目录相对路径:相对于当前所在位置二、基础命令pwd:显示当前所在位置的绝对路径cd 路径 :切换当前工作目录cd … : 退回到上一层cd ~ : 直接进入到当前用户的家目录cd - : 切换到上一次所在位置 在两个位置之间来回切换ls : 默认显示当前目录下的内容clear : 清屏 将当前界面上的内容往上翻了上去,并没有删除内容reset :真正的清屏

2020-08-16 22:51:55 81

原创 Linux学习(一)--Linux基础

一、Linux 和 Windows 的区别:二、Linux目录存储---->磁盘空间的管理方式Windows:磁盘划分—》盘符 C盘 D盘 …Linux :没有盘符的概念,只有一个根目录 /所有文件都是从根目录开始存储的Linux的目录结构是一个倒状树结构(如下图)Linux上一切皆文件每个目录存储特定的文件/bin : 二进制文件---->系统命令对应的程序文件/etc: 系统的配置文件/dev: 系统的设备目录/mnt:

2020-08-15 19:17:21 103

原创 C语言实现一元多项式的基本操作

函数声明(poly.h头文件)//一元多项式的链式表达,利用带头节点的单链表实现//多项式的插入和删除操作是比较频繁.用链式结构比顺序结构更好//链表按照指数升序排列typedef struct{ double cofe;//系数 int expn;//指数}term;//存放系数和指数的数对typedef struct PNode{ term data; struct PNode* next;}PNode, * Poly;//Poly == PNode *//初始化vo

2020-06-01 21:46:11 1880

原创 单链表练习题

题目一:只给定单链表中某个节点P(并非最后一个节点,即P->next!=NULL)指针,删除该节点//方法:1.将P的后继节点的值赋给节点P// 2.再删除P的后继bool Delete(LinkList plist, int key){ assert(plist != NULL); Node* p = Search(plist, key);//查找值为key的节点p if (p == NULL) { return false; } p->data = p-&

2020-05-26 17:47:19 254

原创 检测单链表是否有环(C语言)

题目:给定单链表,检测是否有环方法:快慢指针慢指针一次走一个节点,快指针一次走两个节点;如果快指针走到尾则没有环,如果快慢指针相遇则有环#include <stdio.h>#include "LinkList.h"#include<assert.h>Node* IsCircle(LinkList plist){ assert(plist != NULL); Node* slow = plist->next;//慢指针 Node* fast = plist

2020-05-26 16:19:32 846

原创 单链表练习题

题目一:假设有两个按元素值递增有序排列的线性表 A 和 B,均以单链表作存储结构,请编写算法将 A 表和 B 表归并成一个按元素值递减有序(即非递增有序,允许表中含有值相同的元素)排列的线性表 C,并要求利用原表(即 A 表和 B 表)的结点空间构造 C 表。算法:谁的值小谁就先插入链表C中,插入时用头插法插入,最后就是递减有序void Merge(LinkList A, LinkList B, LinkList C){ assert(A != NULL && B != NULL &

2020-05-21 18:59:16 642

原创 数据结构之单链表

LinkList.h头文件typedef struct Node{ int data; Node* next;}Node;typedef Node* LinkList;//初始化函数void InitList(LinkList plist);//头插bool Insert_head(LinkList plist, int val);//尾插bool Insert_tail(LinkList plist, int val);//在plist中查找关键字key,找到返回

2020-05-21 16:45:48 72

原创 顺序表练习题

这些题都是在不定长顺序表的基础上实现的题目一:设顺序表plist中的数据元素递增有序。试写一算法,将x插入到顺序表的适当位置上,以保持该表的有序性bool InsertVal(DSeqList plist, int x){ assert(plist != NULL); if (plist == NULL) { return false; } //插入的位置:第一个大于x的值,没有就为结尾 int i;//顺序表下标 for (i = 0; i < GetCount(plist)

2020-05-09 23:57:47 1255

原创 数据结构之不定长顺序表

Dseqlist.h文件typedef struct Seqlist{ int *elem; //指向数据元素的指针 int count; //有效数据的个数 int lenth = 0;//总长度}DseqList, * DSeqList;//初始化函数void InitSeqList(DSeqList plist);//往plist的pos位置插入数据valbool Insert(DSeqList plist, int val, int pos);//在plis

2020-05-09 22:40:21 167

原创 数据结构之定长顺序表(C语言)

头文件seqlist.h#define SIZE 10typedef struct Seqlist{ int elem[SIZE];//存放数据 int count; //有效数据的个数}Seqlist, * SeqList;//初始化函数void InitSeqList(SeqList plist);//往plist的pos位置插入数据valbool Inser...

2020-05-08 16:35:02 109

原创 提取字符串中的数字

//将str中的数字提取出来void digit(const char* str, int *a){ assert(str != NULL && a != NULL); int tmp=0; int i = 0;//a的下标 while (*str != '\0') { if (isdigit(*str)) { tmp = tmp * 10 + *str...

2020-04-09 00:10:08 240

原创 约瑟夫环问题

问题描述:n个人围成一圈报数,报到3的人退出,一直循环直到最后一退出的人,输出最后一个退出的人的编号这个题需要注意的点是:1.标记数组2循环结束的条件3.环形处理int Josephproblem(int n){ int* a = (int*)malloc(n * sizeof(int));//标记(谁在、谁退出) int i; for (i = 0; i < n; ++i...

2020-04-07 16:47:52 79

原创 16进制转10进制

int fun(const char* str){ assert(str != NULL); if (str[0] != '0' || str[1] != 'x' && str[1] != 'X') { return 0; } else { str++; } int sum = 0; while(isxdigit(*str++))//检查是否是16进制...

2020-04-07 15:18:59 86

原创 输入年月日,输出这个日期是今年的第多少天

typedef struct Date{ int year; int month; int day;}Date;/*判断是否为闰年*/bool ISleapyear(int year){ /*能被4整除且不能被100整除或者能被400整除的为闰年*/ return year % 4 == 0 && year % 100 != 0 || year % 400 =...

2020-04-06 22:36:20 604

原创 定义一个学生结构体并打印出学生信息(平均成绩、最高分)

/*定义一个Student结构体*/typedef struct Student{ int num; //学号 char name[10]; //姓名 float score[3];//三门课成绩};/*输入学生信息*/void Input(Student *student,int n){ printf("请输入学生信息:学号,姓名和三门课成绩\n"); for...

2020-04-06 22:02:21 8724 6

原创 顺序移动数组

//将n个长度的数组的最后的m个数据移到最前面void Move(int* arr, int n, int m){ //检查参数合法性 assert(arr != NULL); if (n <= 0 || m <= 0 || m >= n) { return; } int* brr = (int*)malloc(sizeof(int) * m); //保存要...

2020-04-05 23:55:45 158

原创 输入一行字符串,输出其中的最长单词

//此函数不能检查单词的合法性char * longest(const char* str){ char *curstr=(char *)malloc(strlen(str) + 1);//保存当前单词 char *longest=(char *)malloc(strlen(str) + 1);//保存最长单词 int count = 0;//记录当前单词的长度 int maxsize...

2020-03-31 22:05:49 1089

原创 C语言实现myatoi函数

int Myatoi(const char* str){ //检查参数合法性 assert(str != NULL); if (str == NULL) { return 0; } int s = 0;//保存整型数值 int tag = 1;//标记 //碰到空格继续往前走 while (*str == ' ') { str++; } //处理符号 if...

2020-03-30 23:31:36 274

空空如也

空空如也

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

TA关注的人

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