自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux从0到1——进程间通信【管道/System V共享内存/消息队列/信号量】

从本节开始,建议大家将开发环境改为VS code使用vs code远程连接云服务器【以CentOS7为例】数据传输:一个进程需要将它的数据发送给另一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如子进程终止时要通知父进程)。进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。管道System V进程间通信。

2024-09-13 21:19:33 588

原创 Linux从0到1——基础IO(下)【磁盘/文件系统/软硬链接/动静态库】

前面我们所学习的,都是被打开的文件。但是,不是所有的文件都是被打开的大部分文件是不被打开的(当前不需要被访问),都在磁盘中进行保存。没有被(进程)打开的文件,也要被管理,对于这部分文件的核心工作,是快速定位它。完成这份工作的是文件系统,这是磁盘级的文件系统(一般谈到文件系统指的就是磁盘级的),它是操作系统中的一个分支。还有内存级别的文件系统,管理打开的文件。磁盘级文件系统+内存级文件系统=文件系统。对打开的文件进行管理;没有打开的文件也要在磁盘中进行管理。

2024-09-05 17:31:39 953

原创 Linux从0到1——进程池【匿名管道实现】

一旦管道中被放入了数据,意味着这个管道对应的子进程被激活,开始执行任务码对应的任务。一次性开辟多个管道和多个子进程,让每一个管道和子进程一一对应。上面这种创建管道和进程的方式有一个很深层次的。类型的数据,表示需要执行任务的任务码。父进程每次向管道中送入4字节。

2024-08-13 10:15:38 1016 1

原创 使用vs code远程连接云服务器【以CentOS7为例】

【代码】windows下,使用vs code远程连接云服务器【以CentOS7为例】

2024-08-05 20:12:13 573

原创 Linux从0到1——模拟实现一部分C库接口【fopen/fwrite/fflush/fclose】

我们模拟实现的函数肯定和C库中的函数有很大差别,这里只是从理解的角度去带大家模拟实现一下。实际C库中的函数会更加复杂。

2024-08-04 10:24:11 217

原创 Linux从0到1——基础IO(上)【文件描述符/重定向/缓冲区】

对文件的操作无非就分为两种,一种是读,一种是写。但是无论读写,都需要先将磁盘中的文件数据加载到文件缓冲区中。这里只是粗力度的解释一下为什么要刷新缓冲区,关于缓冲区更多的细节,我们在后面讲解。我们在应用层进行的数据读写,本质是将内核缓冲区中的数据进行来回拷贝。结构体中,必定要存储两个信息:a. 文件的属性 b. 文件的内容。如果关闭1号文件(显示器),则无法在显示器中看到输出结果。任何情况下,我们调用C语言文件接口的时候,都要有一个。菜鸟驿站在送快递时,肯定也有自己的配送方式。结构体中也封装了缓冲区。

2024-08-03 22:48:48 790

原创 Linux从0到1——自定义shell2.0【添加重定向功能】

学习本篇之前,需要大家掌握简单的自定义shellLinux从0到1——小实验:自定义shell。

2024-07-30 17:19:37 398

原创 Linux从0到1——小实验:自定义shell

【代码】Linux从0到1——小实验:自定义shell。

2024-07-21 17:53:25 403

原创 Linux从0到1——进程控制【进程创建/进程终止/进程等待/进程程序替换】

之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程。子进程进过等待退出时,需要先保存自己的退出信息,将退出信号和退出码写入子进程。状态是一个瞬时状态,不好观察,进入这个状态的进程,其资源已经可以被释放了。然后通过一定的计算(图中红色部分),将退出信号和退出码都保存在。中,这样父进程就可以拿到子进程的退出信息了。在进程终止时,不会自动刷新缓冲区;在进程终止后,会自动刷新缓冲区。执行时,子进程会修改自己的状态(,僵尸状态->死亡状态)。:以非阻塞方式等待。

2024-07-19 21:05:48 721

原创 MySQL快速入门——MySQL在CentOS7环境下的安装

安装与卸载过程中,用户全部切换成为root。⼀旦安装,普通用户也是能使用的;初期练习,mysql不进行用户管理,全部使用root进行,尽快适应mysql语句,后面学了用户管理,再考虑新建普通用户。

2024-07-19 11:58:16 673

原创 Linux从0到1——进程概念(下)【进程优先级/命令行参数/环境变量/程序地址空间】

还未定义,也就是该字段为00(假设00表示未分配,没有内容),操作系统就会先暂停对该虚拟地址的访问,随后进行物理内存的分配,初始化,然后再修改页表,将映射的物理地址和该标记字段修改一下——这个过程也叫。后两个是访问权限字段,和表示是否给虚拟地址分配空间、虚拟地址是否有内容的字段。访问权限字段:如果代码中,出现修改常量字符串的操作,会在页表处就进行拦截。标记是否分配空间&是否有内容的字段:模拟一次内存分配,假如现在执行代码。进程切换时,寄存器中的内容不用清空,而是直接被覆盖。的缩写,代表进程的优先级。

2024-07-13 11:03:55 752

原创 优化方法——梯度下降算法

1. 何为梯度下降:2. 梯度下降的必要性:3. 梯度下降的思想:1. 公式:梯度下降的更新公式,其实就是参数 θ\thetaθ 的更新公式(θ\thetaθ是一个参数向量,nnn 表示迭代次数):其中 η\etaη 表示学习率,gradientgradientgradient 表示梯度:由于 θ={θ1,θ2,...,θm}\theta=\{\theta_1,\theta_2,...,\theta_m\}θ={θ1​,θ2​,...,θm​} ,所以有:这里的 θj\theta_jθj​ 就是 θ\the

2024-06-13 17:27:04 655

原创 数据结构进阶——并查集

数据结构进阶——并查集。

2024-06-10 20:40:39 1065

原创 数据结构进阶——AVL树

学习本章,需要大家先掌握搜索二叉树,了解键值对pair。int _bf;// balance factor 平衡因子, _kv(kv), _bf(0){}该节点的定义是一个三叉链,_left和_right分别指向左右子树,_parent指向父节点;节点中存储的有效数据为pair,类型的键值对;_bf为平衡因子,在此我们定义为右树高度减去左树高度,用来控制左右子树的高度(注意:平衡因子只是其中一种控制平衡的手段,并不是唯一的);定义了一个模版构造函数,以便后续使用。

2024-06-09 23:23:55 1145 2

原创 西瓜书总结——决策树原理+ID3决策树的模拟实现

本文是对西瓜书中决策树章节的一个总结,将核心内容整理出来,帮助大家在短时间内快速建立一颗决策树。本文不侧重于帮大家理解,只是做一个知识点的总结,做一个“把书读薄”的工作。1. 生成过程:一个递归过程,对于一个节点,每次选择一个最优的划分属性,划分出n个子节点。有三种情况需要递归返回,并将当前的节点设为叶子结点,不再划分:2. 核心任务:1. 信息熵(information entropy)2. 信息增益:3. 计算信息熵的代码演示:4. 根据信息增益选择划分属性的代码实现:3.2 增益率1. 信息

2024-06-08 21:04:55 1030

原创 数据结构进阶——搜索二叉树

若它的左子树不为空,则左子树上所有节点的值都小于根节点的值;若它的右子树不为空,则右子树上所有节点的值都大于根节点的值;它的左右子树也分别为二叉搜索树。// 左节点// 右节点K _key;,_key(key){}public:// ... 相关接口实现protected:节点的定义中提供了一个构造函数,方便在后续实现相关接口的时候使用。

2024-05-14 23:24:24 882 2

原创 C++小白的逆袭之路——进阶(第一章:继承)

继承()机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。通过继承产生的新类,称为子类或派生类。继承谁谁就是父类,又叫基类。当然子类和父类都是一个相对概念。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。// 父类public:protected:// 姓名// 年龄// 子类public:void fun()Print();

2024-05-05 16:35:27 888

原创 C++中关于自定义类型的一个特例:具有常属性的临时变量可以使用非const成员函数

本节内容属于拓展,需要大家熟练掌握C++匿名对象,和临时变量的相关知识,再来学习。

2024-05-03 16:14:32 280

原创 C++小白的逆袭之路——初阶(第十二章:模版进阶)

模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生;增强了代码的灵活性。模板会导致代码膨胀问题,也会导致编译时间变长;出现模板编译错误时,错误信息非常凌乱,不易定位错误。

2024-05-02 18:32:18 1068 1

原创 C++小白的逆袭之路——初阶(第十一章:stack和queue)

stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行,元素的插入与提取操作也只能从一端进行。stack是作为容器适配器被实现的,容器适配器是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素。将特定类作为其底层的,元素在特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:empty:判空操作;back:获取尾部元素操作;push_back。

2024-05-01 14:11:49 704

原创 数据结构初阶——树和二叉树/堆

int size;// 当前数据个数// 容量}HP;数据类型是inta记录一段连续的地址空间,就是数组。普通二叉树的增删查改没有意义,真正有意义的是搜索树,平衡树,红黑树这些复杂的二叉树。但是学习控制普通二叉树的结构,是有意义的。在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树,快速进入二叉树操作学习,等二叉树结构了解的差不多时,我们反过头再来研究二叉树真正的创建方式。

2024-04-26 00:08:58 890

原创 C++小白的逆袭之路——初阶(第十章:list)

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与非常相似:最主要的不同在于是单链表,只能朝前迭代,以让其更简单高效。与其他的序列式容器相比list通常在任意位置进行插入、移除元素的执行效率更好。与其他序列式容器相比,list和最大的缺陷是不支持任意位置的随机访问,比如:要访问list。

2024-04-14 22:57:36 956

原创 Linux从0到1——进程概念(上)【PCB/初识fork/进程状态】

课本上的概念太宽泛了,进程的状态要看具体的操作系统。接下来我们要学习的事Linux中进程的状态。2. 进程的状态,就是PCB中的一个字段假设,我们设计一个操作系统的PCB123...struct PCB...int status;// 记录进程状态的变量...其中NEW就对应创建状态,RUNNING就对应运行状态,BLOCK就对应阻塞状态。变量status就是记录进程状态的变量。操作系统就可以根据进程中status的值,来判断该进程应该存在的位置。,PCB放入阻塞队列;

2024-04-09 14:09:29 1063

原创 Linux从0到1——Linux环境基础开发工具的使用(下)【git/gdb】

意味着当你推送到一个远程分支而没有指定分支时,Git会推送所有你本地的分支到远程仓库中同名的分支上。,这意味着当你推送到一个没有指定分支时,只有当你的本地分支与远程分支同名时才会推送。模式下有各种各样的调试信息,程序员在开发时都使用这种模式,方便调试代码。到这一步,我们只是将文件提交到了本地仓库,还没有提交到远端仓库。配置项未设置,而在Git 2.0以后,它的默认行为将会改变。在Linux下,我们编译代码时,默认的模式是。的基本使用,想要了解更多,请移步到我的。模式下调试信息被去掉了,无法调试代码,

2024-03-20 13:26:11 738

原创 Linux从0到1——Linux第一个小程序:进度条

右侧有一个百分数,提示当前具体进度,还有一个旋转光标,可以确定当进度条不动时,进程是还在进行还是卡住了。发现运行可执行程序后,没有直接打印内容,而是隔了一秒钟,才打印,这好像和我们理解的不太一样,是怎么回事?先执行的,因为C语言代码一定是从上到下运行的,但是现象是字符没有打印。所以,我们可以断定,可以发现它是换行打印倒计时,但是我们想让它只在一行打印,并且覆盖掉前一秒的秒数,如何做?是换行加回车,我们现在的需求是只回车,不换行,可以通过。是一种刷新策略,叫行刷新,默认就有刷新缓冲区的功能。

2024-03-15 22:40:17 834

原创 Linux从0到1——Linux环境基础开发工具的使用(上)【yum/vi/vim/gcc/g++/make/Makefile】

在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装。软件包和软件包管理器, 就好比 “App” 和 “应用商店” 这样的关系。在早期,智能手机还没有普及的时候,大多数人在电脑上下载软件都是去浏览器上直接搜,直接下载。但是这样下载下来的软件就很容易出问题(有病毒)。

2024-03-13 11:55:54 872

原创 KNN算法实际应用案例:鸢尾花种类预测

1. scikit-learn数据集API介绍中获取数据的操作是在一个大类下的。1)sklearn小数据集使用获取小数据集,数据包含在datasets里,从本地获取,也就是活sklearn中有一小部分已经下好的数据集;例:使用获取鸢尾花数据集。返回值是鸢尾花数据集。# 1. 数据集获取# 1.1 获取小数据集用datasets.load_*()print(iris) # 会显示一堆的内容,但是阅读起来不方便2)sklearn大数据集使用获取大规模数据集,需要从网上下载,函数的第一个参数。

2024-02-22 17:46:52 1269

原创 KNN和kd树

1. K近邻算法(KNN)的概念K Nearest Neighbor 算法又称KNN算法,这个算法是机器学习里一个比较经典的算法,总体来说是比较简单的。1)定义一个样本与在特征空间中k个最相似(即样本空间中距离最近)的大多数样本属于同一个类别。来源:KNN算法最早是由Cover和Hart提出的一种分类算法。2)距离公式二维平面上点a(x1, y1)与b(x2, y2d12x1−x22y1−y22d12​x1​−x2​2y1​−y2​。

2024-02-19 11:22:31 1447 1

原创 Matplotlib入门

In [3]: # 0. 准备数据# 1. 创建画布# 2. 绘制图像# 2.1 添加x,y轴刻度x_ticks_label = ["11点{}分".format(i) for i in x]# 修改x,y坐标刻度显示# 想打印字符不能直接打印,要先打印数字然后再替换成字符串# plt.xticks(x_ticks_label[::5]) 报错,不能用字符串直接修改。

2024-02-02 22:52:51 857

原创 Windows下,MySQL的介绍、安装和卸载

MySQL数据库最初是由瑞典MySQL AB公司开发,2008年1月16号被Sun公司收购。2009年,SUN又被Oracle收购。MySQL是目前IT行业最流行的开放源代码的数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统。MySQLMySQL最强大的优势之一在于它是一个开放源代码的数据库管理系统。开源的特点是给予了用户根据自己需要修改DBMS的自由。MySQL采用了,这意味着授予用户阅读、修改和优化源代码的权利,这样即使是免费版的MySQL的功能也足够强大,这也是为什么。

2024-01-26 22:19:49 841

原创 Numpy入门

学习本内容,需要对Python的语法有基本的了解,同时要会使用。本文章中的Python代码,大多数都会在上运行并展示。1. Numpy是什么?一个开源的Python科学计算库。使用Numpy可以方便的使用数组、矩阵进行计算。包含线性代数、傅里叶变换、随机数生成等大量函数。2. 为什么使用Numpy?对于同样的数值计算任务,使用原生Python肯定是可以实现的,但使用Numpy比使用原生PythonNumpy直接以数组、矩阵为粒度计算,并且支持大量的数学函数,而Python需要用for。

2024-01-24 16:58:33 945 1

原创 Python急速入门——(第十章:bug和调试)

bug就是程序运行中出现的错误。一般常见的bug类型有两类,一类是语法错误,这类错误比较好解决,程序会直接报红,然后我们在对应报红的位置查找问题即可;第二类是思路错误,这类错误就不是很好解决了,因为程序不会直接报错,只是运行的结果达不到我们的预期,这时候就需要一些调试技巧。但两种错误的本质,都是对基础知识掌握不牢固所导致的。在一些情况下,即使程序出错了,我们也不希望它直接终止,而是捕获对应出错位置的异常信息,给出提示,而不影响后续代码的正常运行。这就是异常处理机制。先来看一段代码:当我们输入10除0时,程

2024-01-09 15:48:43 1450

原创 Python急速入门——(第九章:函数)

函数定义时,给形参设置默认值,只有与默认值不符的时候才需要传递实参。(缺省值只能从右向左给)def fun(a, b=10): # b为缺省参数#函数的调用fun(100) # 只传一个参数,b 为默认值fun(20, 30) # 传两个参数,30将替换默认值10100 1020 30我们其实一直在用缺省参数,来查看一下print()函数的源码定义:这里我们先只看一个参数end,它的作用是给末尾传递一个字符串,缺省值是\n回车符。所以我们平时只写一句print()就能起到换行的作用。

2024-01-08 23:44:50 911

原创 Python急速入门——(第八章:字符串)

的地方是可以改变的字符串,其他地方都是固定的,那这就相当于字符串的拼接。1)当需要值相同的字符串时,可以直接从字符串池里拿来使用,避免频繁的创建和销毁,提升效率和节约内存,因此拼接字符串和修改字符串是会比较影响性能的;的驻留机制对相同的字符串只保留一份拷贝,后续创建相同字符串时,不会开辟新空间,而是把该字符串的地址赋给新创建的变量。(含有字母,数字,下划线的字符串,称为符合标识符的字符串)仅保留一份相同且不可变字符串的方法,不同的值被存放在字符串的驻留池中,号在拼接字符串的时候,会先开辟一块空间,把。

2024-01-07 20:11:54 1000

原创 Python急速入门——(第七章:元组和集合)

元组是Python的内置数据结构之一,是一个不可变序列。不可变序列:元组和字符串,特点是没有增删改操作。"""不可变序列:字符串、元组"""print(s)print(c)helloworld发现s在执行之前和之后的id不一样,说明s不能在原有字符串的基础上拼接,字符串是不可变的。可变序列"""可变序列:字典、列表"""lst.append(100) # 增加一个元素score['wangwu'] = 20 # 增加一个键值对发现无论怎么改列表和字典,它们的id。

2024-01-06 16:59:58 926

原创 C++小白的逆袭之路——初阶(第九章:vector)

vector是典型的模版实现,类的声明里包含一个参数是模版参数,第二个参数中出现了一个Alloc,这个我们以后会讲,现在先不说。大家只需要知道,Alloc是STL中六大组件中的其中一个,也就是空间配置器,本质就是一个内存池。vector是一个可以动态增长的数组实现的顺序容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。

2024-01-05 22:03:01 805

原创 C++大作业——学生选课系统优化版

本文将具体介绍优化的部分,而不对基本的实现做过多阐述。

2024-01-02 23:54:20 1197

原创 C++大作业——学生选课系统

本次课程设计是我第一次独自完成这样一个相对完整的项目,收获很多。但是我更想说一下本次设计中存在的不足。首先就是在最初设计课程类和学生类时,没有考虑的那么全面,导致出现了很多冗余的接口,和公有私有混着用的情况。其次就是,虽然是用C++写的,却没有把封装体现出来,使用了很多friend友元函数也破坏了类的封装效果。由于我最开始是在Linux系统上编写的代码,没有装中文包,所以很多注释和输出语句都是用英文写的。后来又转到Windows下的VS环境下编程,也写了一些中文的语句。

2023-12-29 22:29:42 3577 2

原创 Python急速入门——(第六章:字典)

1)Python内置的数据结构之一,与列表一样是一个可变序列(可变是指可以进行增删改的操作);2)以键值对的方式存储数据,字典是一个无序的序列(列表是有序序列);3)有序指的是列表在存放元素时,是按顺序挨个存放的;而字典则是通过哈希函数,用序列的值,来计算这个序列的存储位置;4)所以字典中的序列必须是不可变序列,意思是不可以进行增删改操作(目前学到的可变序列只有两个,一个是列表,一个是字典)。2.语法结构:key后数字表示序列存放的先后顺序,可见字典是无序的。

2023-12-24 21:58:31 1247

原创 Python急速入门——(第五章:列表)

变量可以存储一个元素,而列表可以存储N多个不同类型的数据,程序可以对这些数据进行整体操作(列表也相当于其他语言中的数组)。3)结论:字符串类型的数据只能和字符串类型的数据排序(能排序的前提是能比较)。1)如果查询列表中N个相同元素,只返回相同元素中的第一个元素的索引。注意:即使切片的值和原列表一样,它们的id也是不一样的。2)字符串类型的数据只能和字符串类型的数据排序。:切片的第一个元素默认为是列表的最后一个元素。:切片的最后一个元素默认是列表的第一个元素。不指定索引,默认删除列表中的最后一个元素。

2023-12-13 17:00:07 1178

空空如也

空空如也

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

TA关注的人

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