自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SkipList 跳表

最近在读 LevelDB 的源码,正好看到里面使用了跳表这种数据结构于是学习一下跳表实际上是由多个链表组成的,时间复杂度是O(logn)logN上面所述 的规则如果严格执行,查询的效率会很高,但是插入和删除会十分麻烦,所以跳表采用概率 在尽量不增加时间复杂度的同时 , 更加容易 插入和删除maxlevelmaxlevelnull那么一个节点的有几层该如何确定呢?这就是跳表的精髓,首先我们有一个概率p,这个p。

2024-04-01 21:18:18 700 3

原创 Linux 时间系统调用

众所周知不同国家都是有时差的,那么比方说北京时间是如何计算出来的呢?首先UTC(世界协调时) 是一个基准,在这个基准上我们根据经纬度 划分出不同的时区,如果我们想得到本地时间 只要用标准时间加上该地区所在时区的偏移量。现在我们已经知道了如何获取时间,但是现在又有一个问题,存储的秒数 虽然精确但是不是很易读,如何让这些时间变得易读就要用到接下来的系统调用。举一个简单的例子: 北京时间在东八区时区,意味着北京时间比基准时间快8个小时(偏移量),而这个标准时间就是。t1 和 t2 得到的结果是一样的。

2024-03-17 21:55:18 449

原创 详解线段树

但是在做题的时候还是会对模板进行修改,修改的点主要在区间val的意义上,我们这里模板里面val代表的是区间和,但后面题目里面可能是 区间最大值 、区间最小值…,但是万变不离其宗,线段树的结构是不会变的。

2023-12-06 19:16:02 1157

原创 数据结构——树状数组

原题的连接最近刷leetcode的每日一题的时候,遇到了一个区间查询的问题,使用了一种特殊的数据结构树状数组,学习完之后我不禁感叹这个数据结构设计的巧妙,下面是我的学习笔记。树状数组 实际上是对前缀和的优化,前缀和计算的是[0,i]的和,如果一个修改就要对所有的区间和修改,但是树状数组将区间的长度通过lowbit的巧妙构造,使得每次单点修改所要更新的区间和始终不超过O(logN)。单点更新区间查询然后默写树状数组的时候牢记三个规律,AC这类题应该没有多大问题。

2023-11-19 16:03:17 635 3

原创 C++ 类的前置声明

然后在写的过程中就遇到了一些问题,困扰了我很久,那就是前置声明问题 这个问题开始于一个头文件的循环引用。上面两个头文件就造成了非常难搞的问题,两个类相互依赖,且在两个不同的文件里面,于是我那时候想当然的就写出了以下代码上面的代码,然后在编译的时候就会出现大问题!然而在预编译的时候会做一步重要的处理就是头文件展开,而这个展开的过程是递归进行的,也就是说你展开的头文件里面可能引用了别的头文件,全部都要展开直到没有。这就要用到C++类的前置声明了,实际上这个的逻辑就是我不引头文件,而是在你前面先写一个类的。

2023-09-27 22:36:26 342

原创 Centos安装postgresql数据库以及postgis扩展的安装

这几天项目上的数据库迁移差点没把我弄死 ,因为项目上的使用的是postgis来处理地理数据 ,而开发环境的数据库以及postgis扩展并不是我安装的。所以在迁移的时候造成了不小的麻烦。记录一下迁移过程中遇到的。下面以Centos操作系统为例。

2023-07-25 22:05:14 1646 5

原创 再看const成员函数

关于函数重载实际上我理解不是很深入,直接导致const成员函数这块出大问题,在阅读《effective C++》后才恍然大悟,做如下学习记录。

2023-06-07 15:01:08 662 6

原创 线程池设计

这些必须都传给线程池中的线程才行,线程池中的线程从任务中拿取输入数据调用解决方法,最后把输出结果写入,线程池不需要对任务做任何多余的操作!而这个方法函数叫做——回调函数。大体思路是:任务队列不为空就通过条件变量向线程池中的线程发送信号执行任务,如果任务队列为空,则线程池中的线程在cond条件变量下等待。大体思路是: 把信号量的大小设置成任务队列task_queue的大小,这样临界资源的粒度就变小了,实现了生产和消费的解耦。最后线程池被设计成了单例模式,可以保证该线程池全局唯一。结构体中的对象包括👇。

2023-05-15 10:12:46 769 2

原创 B树

我们之前已经对 平衡搜索二叉树有了一定的了解,学习了两种树——AVL树和红黑树,下面介绍一下B树首先我们要了解一下B树的度:即每个B树节点最多可以有M个子节点,这个M就是B树的度- 每个结点的值(索引) 都是按递增次序排列存放的,并遵循左小右大原则。- 对于所有节点来说:关键字的数量始终=子节点的数量-1(这一点不论B树什么时候都必须满足)- 对于根节点:-关键字的数量满足[1,M-1]- 子节点的数量满足[2,M]- 对于除了根节点以外的其他节点。

2023-05-03 22:03:02 2813 4

原创 读写锁的原理与实现

对于生产者和消费者模型的概念图👇那么我们读写锁源自读者写着模型,和生产者和消费者模型十分类似👇两个的模型实际上是一模一样的,我们还是通过“三二一”来深入了解一下读者写者模型三种关系读者-读者:没有关系,共享公共资源读者-写者:互斥、同步,因为读的时候发生了写或写的时候来读,读取到的信息都是错误的!!写者-写者:互斥,临界资源中当有一个写者时其他所有人(不论你是读者还是写者)都进不来两者角色:写者和读者一个场所:临界区生产者和写者两个是一模样的,都是向临界区输入数据的读者和消费者。

2023-04-19 16:50:02 1215 4

原创 线程

线程总体来说就是一个执行流,是CPU调度的最小单位条件变量创建:是一个类型变量,改变了是条件变量的类型:设置条件变量的属性,一般填的都是nullptr等待条件满足:指明条件变量,哪个线程调用这个函数就会去名为的条件变量下等待:线程等待之前必须把锁交了,否则就会造成死锁问题在线程被唤醒之后会接着该函数之后继续执行(可能依然在临界区内),所以该函数依然会贴心的位该线程申请锁唤醒等待唤醒所有在名为__cond条件变量下等待的线程唤醒一个在名为__cond条件变量下等待的线程。

2023-04-11 21:23:59 1437 2

原创 特殊类设计(单例模式)

今天忙活了一天写了一个线程池,写完我才发现单例模式的重要性🤗,做如下学习记录。

2023-04-09 21:03:16 461 3

原创 C++11 新特性

C++11 新特性、初始化列表、Lambda表达式、包装器、绑定

2023-03-22 21:30:50 656 3

原创 右值和右值引用(C++11新特性)

右值引用:对右值的引用左值引用:对左值的引用右值VS右值引用和左值VS左值引用//左值 和 右值 int a1 = 1;//右值引用 int && r1 = 10;//左值引用 int & l1 = a1;注意右值是不可以取地址,但是右值引用是可以取地址,因为给右值取别名之后必然会存储到特定位置,也就是说右值引用是左值!📌左值引用既可以引用左值也可以引用右值——引用右值可以使用右值引用只能引用右值,不能引用左值右值引用可以引用move之后的左值。

2023-03-16 20:50:11 699 2

原创 哈希表

在上一篇博客map和set我们详细的介绍了以红黑树为底层的数据结构,本篇博客论述的哈希这种数据结构实际上是和的数据结构的底层。哈希实际上是一种映射关系,map和set实际上在搜索的时候对树进行遍历,理论上的时间复杂度是O(log2N),但是哈希是可以不经过任何比较,一次直接从表中得到要搜索的元素。如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。

2023-03-09 14:26:34 1890 3

原创 map和set 的封装

这些问题在没有学习map和set之前并没有很好的解决方法(但是map和set并不是唯一的解决方法),第二个问题:之前我们解决的方法一般就开辟一个新数组tmp,遍历arr中所有元素,对于arr中任意元素遍历tmp数组如果元素在tmp中未出现就插入。这时就会报错,因为是非const对象,调用的begin是非const成员函数,返回的是普通迭代器,所以报错的原因是缺乏普通迭代器到const迭代器的转化!我们对于map和set封装始终是在红黑树的基础上进行封装的,红黑树的代码可以参考blog。

2023-03-03 16:48:48 880 2

原创 LeetCode:二叉树——对称二叉树

的对称节点,这两个节点分别在根节点的两侧,我们设这两个对称的节点为left和rright。在整个判断过程中,判断的对称只能判断当前节点是对称的,而判断不对称就说明整棵树都不对称。进入下一层时由于当前层的left和right是对称的,所以下一层也需要对称!这道题思路很重要,首先我们要选择两个在。

2023-03-01 22:38:26 143

原创 红黑树的原理+实现

红黑树是一个近似平衡的搜索树,关于近似平衡主要体现在最长路径小于最短路径的两倍(我认为这是红黑树核心原则),为了达到这个原则,红黑树所有节点都增加了一个存储位表示节点的颜色(红或黑),并规定了一些性质来达到“近似平衡”

2023-02-16 18:10:23 3431 4

原创 类的 多态

多态的概念多态:通俗的来说就是多种形态,对于不同的情况,会产生不同的状态举个例子:例如车站的卖票系统,对于学生、普通市民和军人三类人的卖票政策是完全不同的,例如:对于普通市民是全家买票、对于学生是半价买票、对于军人是全价买票,排队优先。但是这三种角色中又有继承关系,所以这里就可以用到类的多态,通过虚函数完成不同角色同一函数实现不同功能。多态的条件被调用的必须是虚函数,子类必须重写父类的虚函数必须通过基类的指针或者引用调用虚函数...

2023-02-06 18:18:57 1629 3

原创 如何写一个命令行解释器(SHELL)

本shell设计的结构参考的是,但是代码都是自己写的,还加了一些新的功能关于什么是shell前面的文章深入理解 shell/bash已经说过了,我这里就不多赘述了。进程替换、字符串操作库函数、文件系统、进程等待、动态增容到此整个shell就差不多,语言层面对C语言字符串操作函数、读写文件函数要求比较高。完整代码放在gitee上了仓库。

2023-01-30 21:01:48 2021 9

原创 几个特殊的运算符重载(前置\后置++、前置\后置--、<<、>>)

运算符重载是一个非常重要的概念,在运算符重载中我们可以重新定义 运算符 的具体含义,一个运算符重载函数的定义是,对于运算符重载有以下重点。以下讨论的都是双操作数的运算符a+b;

2023-01-12 21:46:15 699 2

原创 反向迭代器

+----++在使用STL的时候我们会接触到许多反向迭代器的接口,例如:这些接口返回的类型都是反向迭代器类型,这些接口一般封装在STL容器中。下面来看一下封装在反向迭代器类中的成员函数:这里唯一要注意的就是operator*的指向问题,关于这个问题,我们首先要了解rbegin()和rend()的指向rend()和rbegin()正好与begin()和end()的指向相反,但是在函数上两种迭代器就不一样了。

2023-01-09 17:20:04 473 2

原创 C++模板

文章目录C++模板函数模板函数模板的实例化类模板C++模板函数模板前面学过了函数重载,对一个功能我们可以实现不同数据类型的函数重载,给我们编译代码节省了不少麻烦,但是函数重载对于 泛型编程 来说,还是不够高效,因为每次传入的函数类型不同就要重新写一个函数重载。所以就出现了函数模板这种东西,让编译器来完成生成不同数据类型的函数的构建。函数模板的概念:函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本定义函数模板的格式template<ty

2023-01-04 10:56:29 516 3

原创 测绘程序设计大作业——TIN三角网生成+等高线生成

文章目录测绘程序设计大作业——TIN三角网生成+等高线生成图形库的选取数据的读取Delaunay三角网的递归生成算法什么是Delaunay三角网空接外接圆准则张角最大准则如何生成数据结构的定义递归生成算法空接外接圆准则张角最大准则对递归生成的改进测绘程序设计大作业——TIN三角网生成+等高线生成学校布置的测绘程序设计大作业,花了一个星期从算法学习到数据结构设计完成到最后出成果,虽然以后不搞测绘,但是还是记录一下在学习过程中的心得。图形库的选取测绘的最终目的在我看来是将数据可视化,所以选取一个更加直观

2022-04-09 17:26:14 7249 18

原创 Linux信号

信号是一种条件反射,不管事件有没有发生,但是你对带这件事情的处理方式是固定的。这件事情的发生对你来说就是一种信号。操作系统也存在信号,实际上os中的信号:是操作系统向进程传达指令的一种操作。操作系统向进程发出信号,进程接受到信号执行相应的动作。输入指令kill -lkill -signum 进程pidsignum 为信号编号这里每个信号都有一个字字母标识该信号信号从操作系统发出到信号被执行一共要经理三个过程:下面就让我们从这三个方面来对信号深入了解。

2022-03-19 20:31:11 2596 7

原创 AVL树的 插入 和 删除

AVL树的 插入 和 删除

2022-03-11 16:30:15 2024 6

原创 二叉搜索树(BinarySearchTree)

二叉搜索树(BinarySearchTree)文章目录二叉搜索树(BinarySearchTree)二叉搜索树的概念如何定义 二叉搜索树的节点 && 二叉搜索树查找插入删除二叉搜索树的缺点二叉搜索树的应用二叉搜索树的概念搜索二叉树满足一下条件:是一棵二叉树这可树上的任意一个节点满足:若他的右子树不为空,则右子树上的所有节点的值大于该节点的值这可树上的任意一个节点满足:若他的左子树不为空,则左子树上的所有节点的值小于该节点的值它的的左子树和右子树也是二叉搜索树例如下图就是一

2022-03-05 17:53:44 1680 12

原创 进程间通信(IPC)

进程间通信IPC

2022-02-14 19:29:30 1416 31

原创 C++类的继承

继承的概念和定义概念我们知道C++是一个面向对象的语言,继承是面向对象程序设计使代码可以复用的最重要的手段,使在逻辑上是继承关系的对象在用类来描述对象语言层面实现了代码复用,这样产生的新的类叫做派生类例如用学生系统来举例图中的学生管理系统建立了四个类用来描述 人、学生、老师、助教,但是我们发现学生、助教、老师这三个类都有人这个类的属性,在这个属性上才会多出来一些不同的特征,例如学生可能会有学号、班级…,于是学生从人继承部分属性就是类中的继承,人这个类叫做 父类 或者 基类 ,学生这个类别叫做 子类

2022-02-07 21:01:22 2094 7

原创 操作系统——文件学习笔记

在学习C语言的时候学习过如何打开关闭一个文件,可以参考一下以前的博客C语言文件操作,在学习了进程之后看待文件的角度就不能只停留在语言层面上了,下面从两个角度来认识一下操作系统对文件的管理文章目录进程眼中的文件磁盘眼中的文件进程眼中的文件在C语言中我们可以用多少种方法往屏幕上打印字符串?int main(){ const char* p = "hello world\n"; printf(p); fwrite(p, strlen(p), 1, stdout); fprintf(stdout

2022-02-06 11:30:49 1187 11

原创 深入理解 shell/bash

深入理解 bash/shell什么是bash和shell深入理解shell的变量配置自己的bash/shell重定向 和 管道正则表达式shell脚本

2022-01-27 16:46:55 6059 14

原创 C++内存管理

文章目录C++内存管理C++内存分布(四大内存分区)C语言中内存管理的方式C++中内存管理的方式operator new和operator deletenew和delete的实现原理定位new表达式C++内存管理C++内存分布(四大内存分区)下面依次简单的介绍一下各个分区:栈:主要存储函数参数,局部变量,栈区的大小实际上大概只有8M堆:存储动态开辟的变量,堆的大小比栈大多了,所以一些较大的数据一般都存在堆上面数据段:存储全局变量,静态变量代码段: 存储可执行代码、只读常量(例如字符常量)

2022-01-24 10:55:35 638 7

原创 进程的 创建 终止 等待 替换

文章目录创建从进程的角度从内存的角度终止等待替换创建从进程的角度Linux中有一个重建进程非常重要的函数——fork() ,fork以该进程为模板,创建一个子进程,而原进程为父进程#include<unistd.h>pid_t fork(void)现在我们以进程的角度来看待一下进程的创建:fork函数实际上是一个系统调用,调用fork函数之后,就会被内核接管接下来的流程,内核会做如下事情:分配新的内存给子进程创建PCB也就是进程控制块将进程添加到描述进程的数据结构中fo

2022-01-22 16:33:00 1060 7

原创 进程地址空间——学习笔记

文章目录进程地址空间的划分进程地址空间示意图进程地址空间 & 物理内存为什么需要进程地址空间进程地址空间的划分我们在学习C/C++的时候一直会涉及一个概念——地址,以前我一直认为地址就是内存,一个地址对应一字节的物理空间,但是对于某些现象并不能解释例如:在一个64位的操作系统下,如果一个地址对应一个字节的话理论上内存应该有4*2^32 GB的内存空间,但是实际上内存还没有那么大现在才知道我们以前在语言层面所理解的地址,实际上是虚拟地址,与真正的物理的内存是独立的进程地址空间示意图虚拟地址

2021-12-29 15:20:56 548 2

原创 Linux进程——学习笔记

文章目录认识操作系统冯诺依曼体系结构是计算机的基本结构操作系统进程的概念task_struct的内容查看进程创建进程进程的状态进程的优先级认识操作系统冯诺依曼体系结构是计算机的基本结构该结构规定了 cpu(中央处理器) 只和内存进行交互,任何其他设备 例如 输出设备 和 输入设备 都必须把数据加载到内存上,才能被cpu读写那么为什么要把所有数据都加载到内存中才能被cpu读写?这是因为不同硬件数据传输的效率不同,cpu读取数据的速度 是 硬盘上传数据的1000万倍,这样两种设备如果直接交互会导致c

2021-12-22 13:50:24 855 5

原创 gdb、make/makefile学习心得

gdb 学习心得

2021-12-13 19:27:14 1401 11

原创 vim的基本使用

vim的基本使用文章目录vim的基本使用配置vimvim常见的模式 及 如何切换命令模式插入模式底行模式替换模式vim遇到打开时的警告信息vim是Linux操作系统上文本编译器,Linux上面的命令,大部分都是默认选择vi作为数据的接口,而且vim同时也支持在上面编写程序。配置vim如果你以前对你自己的vim没有配置过的话,你用第一次用vim 打开一个空白文本的时候大概是这个样子的:这个vim看起来十分的简陋,连行号都不显示,而且你在上面敲代码,不会有:括号自动补全、首行缩进总之拿这种vim敲

2021-12-06 14:05:24 912 5

原创 迭代器的学习心得

迭代器的学习心得这段时间学习STL实现自己的STL时第一次接触迭代器,学起来有些痛苦,下面来记录一下我的学习心得,理解有些浅薄首先我们要了解 ——泛型编程学完类之后给我的感觉是: C++将一个 概念 抽象成一个类,这个类用 数据结构 来组织数据 用来描述这个概念前面学习的的类模板,直接将类的数据类型给抽象化了,一个模板类适用于各种数据类型,不管是内置类型(int,char…),还包括一些自定义类型(例如 自定义的链表节点、树节点…),这些类模板再加上一定的 数据结构的组织 (数据被组织成 数组 、

2021-11-26 13:59:29 2010 7

原创 Linux 权限的理解

文章目录Linux 权限的理解用户的概念权限的决定因素文件访问者的分类(角色)文件的属性文件类型和访问权限文件权限的表示方法符号类型数字类型文件权限的修改方法修改文件属性:chmod数字类型修改符号类型修改修改文件的所属组:chgrp修改文件的所属者:chown目录的权限粘滞位Linux 权限的理解用户的概念Linux下有两种用户:普通用户 和 超级用户(root)超级用户:不受文件权限的限制,可以做任何事情普通用户:在Linux下做有限的事情超级用户命令提示符是“#” ,普通用户的命令提示

2021-11-15 19:07:15 2588 7

原创 kmp算法

kmp算法

2021-10-25 16:00:43 356 8

空空如也

空空如也

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

TA关注的人

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