自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机系统概述——了解冯诺伊曼 && CPI相关公式

例如,浮点数运算既可以用专门的浮点运算器硬件实现,又可以通过一段子程序实现,这两种方法在功能上完全等价,不同的只是执行时间的长短而已,显然硬件实现的性能要优于软件实现的性能。的算术和逻辑运算功能,而其他功能大多通过软件的扩充得以实现。对某一功能来说,其既可以由硬件实现,又可以由软件实现,从用户的角度来看,它们在功能上是等价的。送入主存储器后才能执行,一旦程序被启动执行,就无须操作人员的干预,计算机会自动逐条执行指令,直至程序结束。通过上面的公式,我们可以知道,其实CPU执行的速度,是由以下3点决定的。

2025-05-14 13:09:35 623 1

原创 考研还是不会 KMP算法吗?

针对比较字符串匹配得算法,时间复杂度为O(n + m),效率很高。一般是会有三个东西,“主串”、“模式串”和“next数组”。

2025-03-11 14:51:36 257

原创 算法分析 —— 《栈》

这就是题目的基本意思,但是会有一种情况,题目会给你这样的例子:2[ab2[2[cc]]最后转换就是abccccccccabcccccccc,所以他是会出嵌套的情况,而针对数字,也会有两位数以上的数字,那这里我们还要进行处理。题目描述我们也好理解,如果有尝试考研的同学肯定有做过这道题,简单来说,拿示例1来看,我们有一个栈,我可以先push1 2 3 4,然后把4给推出去,这样栈剩下就只有1 2 3,接下来想要推5出去,但我没有,所以我就加到5,加到了然后推出去。你可以认为输入字符串总是有效的;

2025-03-02 22:10:19 920

原创 算法分析 —— 《字符串》

二进制相加是我们在学习编程前期就必须掌握的技能,然而随着我们的技术不断进步,我们也需要着手通过代码解决二进制的相加问题,这道题还是很重要的,因为通过这道题我们可以对高精度的加减乘除法均有了解,而高精度运算算是一个算法入门技能,为什么是高精度呢,因为一定存在某些特别大的数之间进行运算,这里的大指的就是超过int类型甚至是long long类型的存储大小范围。先解释一下什么是回文串,回文串就是一个字符串,正着读和反着读都是一样的,所以对于像这种回文串是一某个字符串的子串的情况题型下,我可以采取。

2025-02-28 16:40:22 1060

原创 算法分析 —— 《哈希表》

题目也很好理解,解决方法就是将当前的值和下标绑在一起丢到哈希表里,当你遍历得到的值在哈希表中存在的话,那就拿自己的下标和哈希表里所映射的下标相减,如果小于等于3,就反回true,否则就加到哈希表里,增加新的映射关系。因为我们最后是要返回原字符串的,所以你排序完之后又得将原数据string存放集中在一起,那么用哈希表就能完成映射关系,<排序后的字符串,原数据string的数组>,通过这种模板的哈希表就能建立正确的映射.,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

2025-02-26 14:15:19 591

原创 算法分析 —— 《链表》

既然是从小到大进行排序,那么我们需要从各个头节点的指针中,选取一个值小的节点,然后选取完之后,向后移动,但是问题就出现在vector里会有很多个链表,如果每个链表都创建一个指针来接收,那这个就是很困难的。题目来看,也不难理解,就是分别进行逆序呗,他给了k为2,那我就先逆序前2个节点,然后再跳转到后面,不断的两两进行逆序,直到剩下的节点不满足两两配对即可。题目描述很简单,就是实现两两交换即可,比如1、2、3、4,就直接搞成2、1、4、3,然后1、2、3、4、5,就可以变成2、1、4、3、5。

2025-02-24 10:21:52 1066

原创 算法分析—— 《归并排序》

那在这里我们在实现「合并两个有序数组」之前,就可以先通过双指针进行一次判断,再去排序,因为你无法控制是以2倍为标准然后向右移动还是统计数据,而且经过排序后,数据也会乱了,因此我们必须在排序之前就通过双指针做好统计。这道题目总体来说,与上一道题的算法思路一样,上一道题是记录有多少个前面大于后面的数字,而这道题是将每个坐标的数字统计起来,然后将确切的数据按照下标统计。所以归并排序是最简单的,利用递归的思路,我们就认为这个递归操作一定可以做到,那么最终就是实现一个「合并两个有序数组」的操作。

2025-02-18 18:28:13 589

原创 算法分析 ——《快速排序》

问题,而针对该问题,我们第一次是用堆排序的算法来解决的,可是题目要求我们设计一个$ O(n) $的时间复杂度,那么堆排序肯定就pass掉了,所以在这里我们尝试使用: “数组分三块”的快排思路来解决。因为要划分区域,所以我们还是定义两个指针left和right,然后先进行一次遍历,将数组划分成三块,具体的方法和《颜色分类》的方法一致,但是第一次遍历肯定还是乱序的,因为只是大概的进行排序。这一步很好理解,因为我们已经动手实现过很多次了,不过这里我们的最终目标是找到第k大的那个数字,如果上面的数组已经排好序了,

2025-02-17 23:29:28 853

原创 算法分析 ——《模拟》

因此我们只需要满足条件:1、当「问号」出现在第一个位置时,只需要看「问号」后的那个元素即可。2、当「问号」出现在最后个位置时,只需要看「问号」前的那个元素即可。

2025-02-13 19:54:20 639

原创 Linux线程 —— 生产消费模型

在学习完线程互斥和同步后,尤其是在学习同步时一定会遇到个问题,为什么条件变量的等待接口为什么要传递一个锁进去?那么本章就会来解决这个问题,不过前提是我们得了解生产消费模型。本章我们还会介绍信号量的使用。

2025-02-03 15:34:58 811

原创 线程互斥&&同步

如果从底层来看的话,还是能很好的说明情况。假设票数tickets被抢到为1了,那么此时假设线程A进来了if语句中,它来判断票数是否大于1了,那么线程A就会把1放在if语句的寄存器中来进行判断。假设线程A的时间到了,CPU会赶走线程A和它的寄存器,所以线程A就会带着它在寄存器里存放的1在别的地方呆着,同时也会记住自己刚刚所在的代码行,然后CPU立马切换线程B来执行,线程B同样走到了if语句中,把1放在了自己的寄存器中,然后一切没问题之后进行减减操作,所以票数tickets就变为了0。

2025-02-03 15:24:46 987

原创 算法分析 —— 《位运算》

既然实现了无进位相加,那么我们得考虑进位叭,获取进位的位也很容易,直接将两个数按位与上即可,如果最终算出来的进位是不等于0的,那就代表存在进位,如果为0,就代表不存在进位了,这样直接返回原数据即可。那么我们就不能简单的讲他们异或在一起,如果你是两个数相同,那异或完之后肯定都会变为0,但是这是3个数字,那就不能简简单单的异或了,这就得尝试换一种思路了,我们先以题目中给的一个例子来进行举例。现在我们就彻底找出规律来了,那个唯一的数,把它们二进制的每一位都进行操作,如果结果是1的话,那就代表着这是唯一的数。

2025-01-22 16:00:50 800

原创 简单封装线程库 + 理解LWP和TID

在上一文的线程控制中,我们先是聊了关于为什么我们要在编译链接时将线程库给链接起来,简单回顾一下,其根本原因,就是因为我们理解的线程和Linux中的线程是两个不同的概念,在Linux操作系统中,只认“LWP”即轻量级进程,而为了能够很好的适配我们所理解的线程,线程库pthread就出现了。然后紧接着我们学习了控制线程的一系列操作,包括线程的创建、线程的等待、线程的终止、线程的分离。这部分的学习和当年我们学习进程的一系列操作一致。特性进程线程定义程序的执行实例进程中的执行单元内存。

2025-01-01 22:46:42 794

原创 Linux —— 《线程控制》

上一文我们学习了解了线程的相关概念,我们以生动形象的概念阐释了线程这一具体的概念,我们同时也输出了一个重要的结论:“线程是CPU调度的基本单位”。在那一刻,我们同样也输出了重要的知识,在Linux中不存在进程和线程控制块这个区分,而针对于Linux,CPU只认轻量级进程,而不是什么线程控制块。那同样,进程我们是存在控制的,例如创建、删除、等待和替换,那么针对于线程我们同样也是要对其进行管理控制的,因此本文重点讲解线程控制。sleep(1);

2024-11-30 16:21:08 986

原创 你真的理解《线程》吗?

看到此处觉得就两字 —— **抽象。**首先我们需要继续对虚拟地址空间有一个小引入。在虚拟地址中,存在一块区域,这个区域名字叫“正文代码”,假设现在我有一个函数,那这个函数的实现肯定是会存放在“正文代码”区域的。而一个函数,我们知道函数名,是函数的地址,而这个地址从我们现在来看,是指。

2024-11-27 15:00:08 721

原创 算法分析 —— 《位运算基础》

这次的算法分享,我想给大家带来位运算的专题练习,相信大家在学习C语言的时候一定有接触到位运算的操作,包括按位与(&),按位或(|),按位异或(^)。本章是作为开启真正的算法分享之前的补充文章,先铺垫好基础知识,这样在后面分享讲解的时候也能很快就反应过来是怎么一回事。下面就先来介绍8个基础知识,然后会有5道经典的OJ题目让我们来解决。有0则0有1则1相同为0,相异为1(无进位相加给一个数n,确定它的二进制表示中的第×位是0还是1:==提取n & -n==干掉位运算的优先级:多加括号。

2024-11-25 19:42:58 614

原创 手搓《unordered_map && unordered_set》

上一文中,我们讲解了unordered_map和unordered_set的使用场景,并且我们又详细手搓了哈希表,我们介绍了两种方式,一种是开放定址法还有就是链地址法,其中链地址法我们需要重点学习和使用,那针对使用本文就来运用哈希表来实现我们的unordered_map和unordered_set的封装。!在这里要提前说明,本文实现的逻辑和之前手搓的map和set一致,在这里我就只对整体思路进行一个概况,以及迭代器的封装进行说明!!!!

2024-11-24 17:15:00 557

原创 算法分析 —— 《前缀和》

而我们要判断出现了多少次,本质就是拿sum[i] - K在哈希表里查找出现了多少次,上图就是一个简单的例子,很明显此时的K是出现了两次,因为当i到8这个位置时,前缀和就是13,而13 - 7 == 6,而6是会在哈希表里出现两次,一次是2 + 4还有一次是2 + 4 + 0.因此count就会位2,以此类推。那我们还是用暴力的方法来做,时间复杂度将会非常的高,因此这是低效的。而细节就在这里停下了,我们不需要进行更新,因为j一定是小于i的,后续若是又发现一个值,我们就减去最左边的,算出的结果就肯定是大的!

2024-11-23 00:47:36 768

原创 面试官问我 —— 《哈希表》?

一文带你全方位理解哈希表

2024-11-21 16:05:56 1120 1

原创 手搓STL库中 ——《map && set》

我们从一开始接触map和set时就惊叹于这两个容器的强大之处,set可以高效的为我们进行排序去重,而map就像一个字典一样,不仅可以为我们实现去重排序,也可以帮助我们进行一一对应的查找。接下来我们又学习了AVL树和红黑树,我们也算是了解到了map和set的底层是基于红黑树实现的。因此现在我们已经具备对map和set进行自主实现了!在你阅读本章之前,你需要熟悉红黑树的特性,以及我们之前对list容器进行的自主实现。

2024-11-20 17:07:03 860 1

原创 一文理解吸收《红黑树》的精华

在前面的学习中,我们是先自己实现了一个平衡二叉树,然后我们就介绍了stl两个容器map和set,但是我们并没有立即实现,这是因为他们的底层是红黑树我们当时还没有了解到。本章承接上文的AVL树,我们将开启学习一种特殊且流传广泛的数据结构————红黑树。学完本文,我们就可以自主模拟实现map和set!!!以上就是红黑树的插入过程,在这里我只是对插入进行了讲解,而至于删除则难度较高,在这里我也不做赘述了,感兴趣的同学可以下来自己学习学习。其实我们在学习完红黑树后,会发现其实这是要比AVL树简单好实现的!

2024-11-14 15:00:36 707

原创 剖析AVL树的核心思路——C++

对于搜索来说,我们在数据结构部分中学习过二分查找,而在算法题目中也学习过关于二分的思路。而在之前的学习中,我们又接触到了“二叉搜索树”这一概念,但是我们也提到过关于二叉搜索树之中存在的缺点。接下来我们介绍学习了STL中的map和set这两个容器,我们说过其底层是一颗类似二叉搜索树的数据结构,但是当时的我们并没有机会去自主实现,所以本章以及下一章会围绕着两棵树来进行展开讲解,分别是《AVL树》和《红黑树》。

2024-11-11 11:39:46 786

原创 Linux——— 信号

本文不仅仅介绍了基础的信号理论,还浅谈了关于中断以及操作系统的处理调度方法.

2024-10-30 16:38:34 1284 3

原创 TeamSpeak开黑频道加入 —— 点歌机器人 (细致讲解100%学会)

本文支持小白从零开始进行部署,本文面向新手,无痛部署。顺带还可以熟悉linux的基本指令语法版本:Ubuntu20.04, node.js 20

2024-10-27 15:59:46 4067 23

原创 初学C++高效容器 —— map和set

很久没有继续写C++了,主要还是之前学习Linux学习学上瘾了,搞了差不多有4个月的Linux博客,是时候回来学会C++了。但其实我们在学习C++后期会使用到操作系统的线程这一概念,包括后面所需要做的项目,都需要我们有C++和操作系统的基础,两个部分都已经接近了尾声,后续我们就会同步进行学习,相辅相成。本章的内容可以说是两个神器,未来我们在写算法题的时候运用我们今天所学习的内容,将会特别爽!前一章的C++学习,我们是来讨论了下二叉搜索树的Value和K-Value模型,不知道大家还有没有印象?

2024-10-23 10:27:56 665

原创 简单聊聊System V下的IPC + 内核是如何管理该IPC

关于System V下的通信方式,我们只是对共享内存做深度的处理,而对于消息队列和信号量我们并不会特别在意,一下我将粗略的介绍一下关于消息队列,但是信号量这一部分,还有一些新的知识点需要好好聊聊。

2024-10-18 12:47:55 756

原创 进程间通信 —— 《共享内存》

对于进程间通信的话题也来到了尾声,我们现在了解到了常见的通过管道实现进程间的文件级通信方式,但是对于实现进程间的通信还有很长一段故事需要我们去学习,接下来我们就来了解了解System V下的本地通行方式——“共享内存“,”消息队列“, ”信号量“。其中我们会对”共享内存“进行重点讲解。共享内存是一种进程间通信(IPC, Inter-Process Communication)机制,允许多个进程直接访问同一块内存空间,以实现高速的数据交换。

2024-10-17 13:30:19 1758

原创 进程间通信 —— 《命名管道》

在前面的一文,我们主要介绍了关于进程间的通信是如何实现的,以及引入了进程间通信的前提——“要让两个进程在OS中看到同一份资源”,而对于父子进程来说,子进程是通过继承父进程的来看到同一个文件的缓冲区,因此那个对应的缓冲区就是匿名管道,它们都看到了缓冲区这么一个同一份资源。那现在如何使得两个独立的进程实现通信?

2024-10-13 13:09:46 1055

原创 Linux操作系统小项目——实现《进程池》

在前面的学习中,我们简单的了解了下进程之间的通信方式,目前我们只能知道父子进程的通信是通过匿名管道的方式进行通信的,这是因为这点我们就可以简简单单的来写一个项目————进程池。

2024-10-10 10:57:07 710

原创 进程间通信——《匿名管道》

前面的学习中,我们已经可以初步的了解操作系统对文件I/O操作的具体实现,通过学习重定向认识到了文件fd以及操作系统是如何管理文件的,不管是管理打开的文件的还是存在磁盘的文件,我们都已经有过了解了。接下来的内容,我们想要深入一点,之前我们总是研究单一的进程,而我们之前又学习过进程具有独立性,那么对一个计算机来说,同一时间段内存在特别多的进程在运行,有一些数据肯定会从一部分进程中读取,那么进程与进程之间又是如何构建起来通信的呢?我们下面就来聊聊,进程间的通信问题!!!

2024-10-07 14:01:29 1000

原创 算法分析——《二分查找》

《二分查找》《在排序数组中查找元素的第一个和最后一个位置》《x 的平方根》《搜索插入位置》《山脉数组的峰顶索引》《寻找峰值》《寻找旋转排序数组中的最小值》《点名》

2024-09-30 15:29:20 1287 1

原创 算法分享——《滑动窗口》

《长度最小的子数组》《无重复字符的最长子串》《最大连续1的个数 III》《将 x 减到 0 的最小操作数》《水果成篮》《找到字符串中所有字母异位词》《串联所有单词的子串》《最小覆盖子串》

2024-09-25 15:45:34 2600 1

原创 Typora安装,使用,图片加载全流程

​ Typora是一款非常流行的Markdown编辑器,简单来说就是可以方便我们写博客。拿我之前的经历来说,每次我在写博客时,我都会打开CSDN来进行线上编写,虽然我不知道能不能离线编写并缓存,但是时间长了眼睛会非常累,因为CSDN写博客的界面是没有黑夜模式的。而且我们不能进行多个博客的编写,而且我们还不能上传至Gitee或者是Github。而我们的Typora就可以对MarkDown文件进行编写。

2024-09-17 23:03:34 678 1

原创 软硬链接 && 动静态库(深入地址空间)

​ 在前面一章,我们介绍了文件系统,下面我们来对关于文件I/O操作的进一步补充,我们来聊一聊软硬链接是个什么,还有我们之前粗略的讲解的动静态库,最后我们想来进一步谈谈地址空间的概念。

2024-09-11 15:30:06 1039

原创 算法分享——《双指针》

《移动零》《复写零》《快乐数》《盛最多水的容器》《两数之和 II - 输入有序数组》《三数之和》《四数之和》

2024-09-08 16:56:18 1352

原创 突破教材,简单聊聊《文件系统》

找到指定的文件 -> 找到该文件的目录 -> 打开目录 -> 找到inode与文件名映射关系 -> 找到inode进而找到属性与内容。

2024-09-04 18:30:19 1120

原创 攻破:重定向 && 缓冲区

​ 从上一章开始,我们进入了文件IO的学习,认识了文件描述符是个什么,以及在操作系统内部是如何管理那么多文件的,最终我们还解释了为什么说“linux一切皆文件”这个概念。下面我们继续往下学习,认识输入输出重定向以及了解缓冲区的概念。​ 现在我差不多知道什么叫重定向了,不就是原本是往显示器文件打印数据,变成了往普通文件打印数据吗。但是实现这个却要先close掉显示器文件,可不可以不关掉直接发生重定向呢?​ 对于这个函数,它的本质其实是文件描述符下标所对应的内容的拷贝。

2024-08-25 16:36:32 948 2

原创 Linux文件操作:文件描述符fd

​ 现在我们对进程的总体概念也有了了解,下面我们进入新的模块学习。关于Linux如何操作文件。其关的操作也与进程有关。

2024-08-23 00:34:37 1232

原创 自主编写shell

​ 我们在上一章学习的进程的程序替换,这对于我们来说是一件重要的事,因为可以实现创建子进程执行别的程序进而实现进程程序的替换,那么现在我们就可以实现我们自主编写的shell,一个命令解释器了!

2024-08-19 13:34:45 373

原创 攻破:进程替换

​ 承接上文的进程控制,我们接下来想要来聊一聊进程替换,进程替换是怎么实现的呢?理解完进程替换后,我想我们就对命令行解释器bash有了一定的了解。所以这一章结束之后,我会带领大家自主编写一份属于自己的shell命令行解释器。​ 事实上,只有execve是真正的系统调用,其它五个函数最终都调用 execve,所以execve在man手册 第2节,其它函数在man手册第3节。这些函数之间的关系如下图所示。

2024-08-16 13:15:39 887 1

220922物联网5门课程指导与要求发学生.zip

220922物联网5门课程指导与要求发学生.zip

2022-12-14

空空如也

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

TA关注的人

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