- 博客(61)
- 收藏
- 关注
原创 跳表 | 基本概念 | 代码实现
跳表的本质是一种查找结构,一般查找问题的解法分为两个大类:一个是基于各种平衡树,一个是基于哈希表,跳表比较的特殊,它独成一派。跳表是基于有序链表的基础上发展而来的,普通链表查找只能一个一个往下跳,而跳表能一次跳过好几个结点,这就是它查找效率高的原因。初始化跳表时是带头结点的,它的层数要求是最高的,它开始只有它自己,默认给一层,后面插入的时候如果有结点的层数高于它,需要调整。跳表中的元素是有序的,在理解跳表查找前先来看一下一个有序的单链表是如何查找元素的。有了有序单链表的查找的基础,来看跳表的查找就简单了。
2024-11-19 18:49:06
658
原创 C语言 | 单链表 | 代码实现
链表的实现又很多种方式,通常来说常用的有两种,无头单向非循环链表和带头双向循环链表。无头单链表通常是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。而带头双向循环链表,通常作为独立的结构出现,C++中的list就是使用这个结构实现。
2024-11-19 18:47:01
702
原创 tar | 打包 | 压缩 | 文件搜索 | 常用命令(二)
解包,如果包中的很多文件,可以创建一个目录去解包(一般来说打包的时候应该将文件放到一个目录下,自己创建指定目录解包是一个好习惯,避免别人打包不规范。),而不是在自己的工作目录去解包,不然导致自己的工作目录很乱。是将多个文件合并成一个文件,归档操作不会减少文件大小,它只是将文件合并到一个文件中,方便管理和传输。在网络传输的过程中通常要将文件经行打包,压缩和解压缩,接下来看看Linux下的一些常用的命令!使用系统的文件数据库(通常每日更新一次)来快速查找文件,是最快速的查找工具。locate 文件名。
2024-11-09 13:19:31
236
原创 Linux权限概念 | 权限修改 | 文件掩码 | 粘滞位
Linux下有两种用户:超级用户(root)和普通用户。对应root用户而言:可以在Linux系统下做任何事情,不受限制。而普通用户:只能做权限内的事情,如普通用户无法直接使用apt来下载gcc。
2024-11-07 20:53:53
874
原创 sizeof关键字
如果传入变量 , 会计算变量对应的数据类型对应的内存大小 , 如果传入表达式 , 会计算表达式计算结果的数据类型对应的大小;sizeof是C/C++中的一个编译时运算符,
2024-11-06 14:48:47
178
原创 二维数组搜索 | 空格替换
给你一个满足下述两条属性的 m x n 整数矩阵:每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target ,如果 target 在矩阵中,返回 true;编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列、每列的元素从上到下升序排列。查找就是要排除不是结果的数,遍历一次排除一个效率太慢。请实现一个函数,将一个字符串s中的每个空格替换成“%20”。
2024-11-05 19:07:32
255
原创 个人博客搭建 | Hexo框架
Hexo 使用 Markdown(或其他标记语言)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。现在已经下载完毕Hexo,创建一个文件夹来初始化博客,如果有错误把这个文件夹删除就可以了。2、我们可以使用vim使用markdown语法对文章进行编辑,markdown。系统默认创建的Hello World文章就有创建文件的指令,也可以。在Linux使用NVM管理工具下载,将它添加到环境变量中。npm默认是国外的镜像源速度比较慢,更换国内的淘宝镜像源。安装Node版本管理工具NVM,它可以管理不同的版本。
2024-10-14 21:21:44
809
原创 二分查找 | 二分模板 | 二分题目解析
找到最左边的(第一个位置):1、当nums[mid] < target则left = mid + 12、当nums[mid] >= target 则right = mid (mid可能就是最左边的target)找到最右边的(最后一个位置):1、当nums[mid] > target 则right = mid - 12、当nums[mid]
2024-09-01 21:43:16
996
1
原创 MySQL基础
如果使用纯文件操作,那么对程序员来说非常麻烦,去自己调用文件操作的接口,而专家们设计出更加利于管理数据的数据库,减少程序员的工作量。在学习数据库之初的困惑,是为什么要学习数据库?有了文件操作来存储数据为什么还需要使用数据库来存储?上面就使用数据库的方式对存储在数据库中快速的对。那么mysql安装在何处呢,它的数据放在何处。路径下的文件,找到了创建数据库的文件夹,至于这些文件是什么意思可以看小林哥的。
2024-06-06 11:34:56
460
原创 按摩师 | 打家劫舍 | 删除并获得点数 | 动态规划
但是这里有一个问题,第i个位置选还是不选的问题。假设nums = [1 2],如果i为1,这个位置选还是不选?这里的问题在于不能相邻!
2024-06-05 12:12:17
998
原创 使用最小花费爬楼梯 | 动态规划
如:dp[3]根据以往的计算这个就是最小花费,至于从0还是1下标,那就要问,dp[0]和dp[1]的最小花费是多少。
2024-06-02 12:47:01
420
原创 三步问题 | 动态规划
有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。注意的是,dp[i - 1] + dp[i - 2] + dp[i - 3] 取模会溢出:signed integer overflow。可以找到规律,0-3阶是特殊情况,往后的,是在原来的基础(原来阶段的结果)上跨1、2或3步,走到n阶位置。第3阶:小孩从第0阶,跨3阶,在第1阶的基础上跨2阶,在第2阶的基础上跨1阶。第2阶:小孩从第0阶,跨2阶,1种方式。在第1阶的基础上跨1阶,就上去了。第1阶:小孩跨1阶,就1种方式。
2024-05-29 19:52:10
456
原创 求第 N 个泰波那契数 | 动态规划
在解决这道问题之前先来了解一下,什么是动态规划。动态规划(Dynamic Programming):简称 DP,是一种求解多阶段决策过程最优化问题的方法。简单的理解,把原问题分解为相对简单的子问题,先求解子问题,再由子问题的解而得到原问题的解。它的核心思想是,把「原问题」分解为「若干个重叠的子问题」,将子问题计算出来的结果存放到一张dp表中,通过dp表中过往计算的结果,来减少计算并计算出原问题。它的解题步骤大致分为五个过程:状态表⽰、状态转移⽅程、初始化、填表顺序、返回值!
2024-05-24 21:10:07
559
1
原创 生产者和消费者模型 | 阻塞队列 | 信号量 | 环形队列
其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;用来描述资源,当申请信号量时就已经间接的判断临界资源是否就绪,如果申请成功就一定有对应的资源!就好比如,去电影院买票,只有票(信号量)买上了,就一定有对应的位置供你观影使用!同样的线程,成功申请了信号量,那里临界资源一定有线程所能访问的资源。也可以是放蛋糕的人有多个,取蛋糕的人也有多个,对应是多生产多消费!生产者和消费者模型,概括起来其实是一个321原则:3是:三种关系,2是两种角色,1是1个交易场所。
2024-04-12 15:55:19
853
原创 线程同步 | 条件变量
条件变量是实现同步的一种机制,既然要保证数据安全那么就要有互斥锁,当线程首先访问到对应的锁资源,如果申请不到,再去对应的条件变量的队列中排队,张三(线程)进入自习室(临界区)自习,并反锁门,其他人(其他线程)也去自习先自习室门口找钥匙(先申请锁),发现有人,就去排队。在纯互斥环境下,线程会产生饥饿问题;每个线程如果申请不到锁,就会进入阻塞,当特定情况下被唤醒(全部唤醒),线程之间是没有一定的顺序的。所以至少看了来条件变量有两个东西,1.按照一定顺序排队的数据结构,2.有对用的通信机制,唤醒队列等待的线程。
2024-04-10 12:25:27
443
原创 进程控制 | 进程终止 | 进程等待 | 进程替换
一般而言,我们创建的父进程长时间不会退出的,比如一个应用程序,是当用户点击退出的时候才会退出,在服务器端,一个服务器启动之后是不会退出的,要是发生内存泄漏就可以大事。其实exit()的底层是调用了_exit(),C语言对 _exit进一定的封装,如果我们使用printf打印函数,但是我们自己并没有主动的去刷新缓冲区,那么使用exit()函数来退出程序,会帮我们把缓冲区的数据刷新。当我们fork创建子进程的时候并不会加载一份新的可执行程序到内存,而是公用一份父进程的代码。b.调用C语言体统的函数exit;
2024-03-29 15:53:07
765
原创 TCP | TCP协议格式 | 三次握手
另外三次握手保证了通信的全双工验证,保证通信的局部可靠,还有就是可以同步双方初始序列号等。无论是一次还是两次,客户端向服务端请求连接,SYN到达服务器就立马ESTABLISHED状态,服务器需要创建对应的内核数据结构维持连接,有明显的SYN洪水的问题。而为什么不是四次,其实也可以是四次,但是TCP有捎带应答的机制,服务器向客户端发送SYN时捎带了ACK。说白了三次握手的最小次数的连接。
2024-03-22 23:06:16
1603
原创 软链接 | 硬链接 | 动态库 | 静态库 | 制作和使用
硬链接指向的是同一个inode,但是 inode 是不可能跨越文件系统的,每个文件系统都有各自的 inode 数据结构和列表,所以。都是删除文件,当引用计数变为0,没有文件名和inode关联,系统认为用户不管了这个文件了会删除。也代表上一级目录,而dir1的引用计数为3可以知道有1个目录。软硬接有独立的inode创建了新文件,而硬链接没有创建真正的文件;,所以访问软链接的时候,实际上相当于访问到了另外一个文件,所以。文件就是代表一个文件名就对应一个inode而目录中的。会有一个引用计数,创建一个目录中。
2024-03-21 21:43:43
379
原创 进程间通信 | 匿名管道 | 命名管道 | 共享内存 | 消息队列 | 信号 | Socket | 代码实现
进程间通信的本质,前提是要进程看到同一块"内存",这个"内存"不隶属那个进程,是进程间共享的!
2024-03-18 22:49:12
891
原创 双指针 | 移动零 | 复写零
特殊情况,left指向的位置由于空间不足,无法添加一个0,而且right也越界了。right指针一直往后移动,当nums[right]非0时和left指向的元素交换,然后left往后移动。如果nums只有一个元素如[1],那么直接交换没有影响,两外left变为1,没有访问数组是不会越界的。从后往前移动,当arr[left]非0,移动即可,arr[left]为了添加一个0。方法一,当找到index下标指向的元素为0,然后从前往后移动元素,浪费时间。移动到数组的末尾,同时保持非零元素的相对顺序。
2024-03-16 20:54:36
443
原创 探究malloc | sbrk系统调用的简单使用
malloc分配的是虚拟内存,如果分配的虚拟内存没有使用是不会分配物理内存的,这样就可以并不用占用物理内存。如果通过虚拟内存访问,操作系统通过查找页表,发现虚拟内存对应的页没有在物理内存中,就会触发缺页中断,然后操作系统会建立虚拟内存和物理内存之间的映射关系。通过观察也可以知道malloc出来的起始地址和堆分配的起始地址也相差16位f44010-00f44000,这个存放malloc出来的信息控制块,这个信息控制块保存了malloc分配的信息,等free的时候能正确释放。都是用来分配资源的函数,
2024-02-27 16:00:11
1270
原创 引用与指针 | 左值和右值 | 左值和右值引用 | 完美转发 | 原理与代码实现
左值引用操作C++引入引用为了,简化指针的操作,但是没办法替代指针,但是Java当中引用是可以替代指针的,C++中引用不能改变指向但是Java中却是可以的。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。注意:引用类型必须和引用实体是同种类型的引用在定义时必须初始化一个变量可以有多个引用引用一旦引用一个实体,再不能引用其他实体;
2024-02-26 17:10:54
1112
1
原创 C++内存管理 | new和delete使用与原理简单介绍
而系统资源泄漏指的是指程序使用系统分配的资源,比如:套接字、文件描述符、管道等没有使用对应的函数释放掉,导致系统资源的浪费,严重可导致系统效能减少,系统执行不稳定。operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。,内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
2024-02-22 16:31:59
944
原创 哈希应用位图 | 位图概述与代码实现 | 关于位图的几个面试题
当然C++库中也有位图的实现:链接给40亿个不重复的无符号整数(0~2^32),没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中能不能,将40亿个排序 + 二分查找,又或者整数存放在map或set,理论上是可以的只要你的内存足够大!无符号整数在32位机器下要用32个比特位来存放,我们按40个比特位算40亿个需要160亿个字节,那么1G大概是10亿个字节,存放40亿个无符号整数要16G左右的内存空间,普通配置的电脑是存放不下的!能不能一个整数对应用一个比特位来标定。
2024-02-20 22:56:16
879
原创 CSS概述 | CSS的引入方式 | 选择器
CSS,全称Cascading Style Sheets(层叠样式表),是一种用来设置HTML(或XML等)文档样式的语言。CSS的主要作用是描述网页的布局和外观,包括颜色、字体、间距、背景图像等,CSS可以和HTML内容经行分离,这样,一个CSS样式可以用在多个HTML页面,修改时候可以只修改一个CSS文件即可。CSS的基本语法选择器 + 一条或N条声明选择器决定针对谁做修改,比如想要对p标签中的字体大小和颜色进行修改,那么p就是一个选择器,这样类型的选择器称为元素选择器声明,是在一对花括号{}
2024-02-17 23:55:17
1397
原创 HTML | DOM | 网页前端 | 常见HTML标签总结
HTML(HyperText Markup Language,超文本标记语言),所谓的超文本,不仅可以定义文本信息还可以定义图片、音频、视频、表格、链接等内容。而标记语句是由标签构成的语言!HTML页面通过浏览器的渲染展示出来。DOM(Document Object Model)树是一个用于表示HTML或XML文档结构的模型。
2024-02-16 23:59:55
1128
原创 初识Qt | 从安装到编写Hello World程序
Qt 是⼀个 跨平台(Linux、Mac、Windows)的 C++图形⽤⼾界⾯Z(GUI)应⽤程序框架。简单来说Qt用来开发PC端的应用程序,Windows下(主要是在Windows上开发):WPS Office 办公软件、VirtualBox等,Linux的KDE桌面都是使用Qt来开发的。当然Qt也支持移动应用开发,但是这是一个边缘的解决方案。框架和库的理解框架是各位大佬编写的解决一些问题的通用代码,我们普通的程序员在这些大佬的基础之上,填充代码完成自己的需求,这可谓是站在巨人的肩膀上!
2024-02-15 00:13:43
1609
原创 动态内存分配函数 | free为什么只传入一个指针就能正确释放
总的来说:malloc根据一定的对齐规则,开辟空间并自动的开辟了对应的控制信息管理开辟的空间!free释放的资源不会立刻归还给系统,如果对一块空间释放,那么下次申请资源如果释放的空间大小合适,会通过双链表查找到释放的位置重新利用,这也避免一定的内碎片问题!的方式分配空间的,所有即使我们向堆申请1个字节的空间都不仅仅只是一个字节,所以小空间的变量要使用malloc来分配!情况2:原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小的连续空间来使用。辟空间,会根据一定的对齐规则来管理!
2024-02-11 00:49:39
1133
原创 内存管理 | 进程地址空间
进程地址空间和页表都是由操作系统创建并维护的,也就意味着使用地址空间和页表进行映射都在操作系统的监管之下,如果你是非法的,操作系统就会终止你的进程将虚拟地址映射到真正存储数据的物理地址!
2024-02-09 22:49:00
1112
原创 进程状态 | 僵尸进程 | 孤儿进程 | 前台后台进程 | 守护进程
僵尸进程的危害:子进程被创建出来,是为了完成父进程交给它的任务,父进程需要读取子进程的返回状态,但是父进程先退出,那么子进程就要一直维护Z状态;Linux操作系统中,当一个用户登录的时候会分配一个会话,一个会话期间可以创建多个进程组,退出登录,会话会销毁;会话中前台进程终止,后台进程可能不会终止,但是会受一定的影响。一个任务可以是一个进程执行也可以是多个进程执行,多个进程组成进程组以第一个进程的进程pid为任务号,一个进程可以自成进程组!将自成进程组自成会话的进程,称为守护进程,他的本质也是孤儿进程;
2024-02-07 21:36:32
1210
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人