自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法之分治

分治法所能解决的问题一般具有以下几个特征:1) 该问题的规模缩小到一定的程度就可以容易地解决2) 该问题可以为若干个,即该问题具有最优子结构性质3) 利用该问题分解出的可以该4) 该问题所分解出的各个子问题是的, 即子问题之间第一条特征是绝大多数问题都可以满足的, 因为问题的计算复杂性一般是随着问题规模的增加而增加.第二条特征是应用分治法的前提它也是大多数问题可以满足的, 此特征反映了递归思想的应用.

2024-06-11 09:38:22 675

原创 Linux之线程互斥

试着用线程控制力介绍的一些系统调用, 将线程的创建、执行和等待等都封装起来. 我们在程序中指定一个函数Print, 让多个线程不断地执行该函数. myThread.hpptest.cc 创建一个线程: 创建多个线程: 首先模拟一段多线程抢票的例子观察现象: 运行之后会发现不合理的现象, 票出现了非正值初步解释原子性: 比如--操作就不是原子操作, 这条语句其实对应三条汇编指令: 在这三条汇编语句的执行过程中, 都有可能会因为线程切换而中断, 假如线程A对a要执行++操作, 刚执行完inc指

2024-06-04 10:02:03 925

原创 Linux之线程控制

库为了能够快速的找到每一个线程, 所以提供了一个。

2024-05-30 20:39:11 1028

原创 Linux之线程概念

线程是的一种执行流/线程是在的一种执行流.是CPU调度的是承担系统资源的基本实体.首先我们需要明确:除了文件、通信等操作, 一个进程它要访问的大部分的代码和资源都是要通过进程地址空间+页表的方式去找到资源, 所以解释概念:1. 线程是的一种执行流线程是的一种执行流 ,呢?从资源占用的角度分析, 一个进程要被创建, 要完成一系列的初始化工作,, 分配和初始化内存地址空间, 把程序代码和相关数据从磁盘加载到物理内存中, 初始化文件描述符表, 设置进程调度信息插入调度队列等等一系列工作, 这样看来。

2024-05-30 11:21:09 1109

原创 Linux之信号

sigaction头文件: signal.h功能:注册更改信号自定义处理方式。signum 表示信号的编号,act 是输入型参数, 用来保存属性的结构体,其中sa_handler是保存自定义处理函数的函数指针(和signal函数的handler一样),sa_mask 是需要额外屏蔽的信号, 下面主要讨论这个参数sa_sigaction是处理实时信号的, 不考虑sa_flags字段包含一些选项,本章的代码都把sa_flags设为0sa_restorer也不考虑。

2024-05-14 19:56:59 1069

原创 Linux之命令行参数与环境变量

此时PATH设置为了空,上面说过可以重新登陆新建一个bash进程重新读取PATH变量, 这个时候, 我们再来。

2024-05-02 19:34:07 860 1

原创 Linux之进程间通信(二)

共享内存的同步方式,

2024-04-28 19:09:36 645

原创 数据结构之并查集

首先需要明确, 并查集是一个在一些应用问题中, 需要将n个不同的元素划分成一些开始时,自成, 然后按一定的规律将归于. 在此过程中要反复用到的运算. 适合于描述这类问题的抽象数据类型称为有10个人来自不同的学校, 起先都是的, 现给这些学生进行编号:{0, 1, 2, 3,4, 5, 6, 7, 8, 9};给以下数组用来存储该小集体, 数组中的代表: 该小集体中具有。

2024-04-17 16:33:06 673 1

原创 Linux之进程间通信(一)

操作系统的特点之一以实现多任务并发处理.既然进程具有独立性, 那一定会让二者产生联系, 那又何谈独立性呢?进程的独立性是指的, 但. 进程与进程间是需要信息交互与状态传递等的通信. 比如说, 父进程等待子进程查看子进程状态, 在子进程完成任务时回收子进程信息, 而且有些程序的运行也需要才能完成。比如说这个指令:cat file | grep 'hello'

2024-04-14 16:15:57 778 2

原创 汇编语言(第4版)(王爽)第一章

仅为个人汇编语言(第4版)(王爽)的读书记录, 部分添加了一点点个人理解

2024-04-08 22:18:37 768

原创 算法之模拟

从前往后遍历crokaOFFrogs字符串, 如果遇到 'c' 说明有一个青蛙开始叫, 如果遇到 'r' 只需去查找前面的字符串中是否有 'c', 所以可以用哈希表来存储字符出现的次数, 也就是青蛙的个数, 遍历到 'r' 的时候, c字符出现个数>=1, 说明有青蛙可以叫出来'r', hash['c']--, hash['r']++, 代表有一个青蛙叫到 'r', 其它字符也是同理. 叫到'k'说明青蛙叫完了.2. 如果字符串遍历结束k之前的字符有>=1的情况, 说明有青蛙没叫完, 返回-1。

2024-04-04 10:11:28 631

原创 Linux之动静态库

静态库是指程序在编译链接的时候把库的代码链接到可执行文件中, 程序运行的时候将不再需要静态库, 这个被链接的库就是静态库, 在Linux下静态库的后缀名一般为.a, Windows下为.lib动态库与之相反, 程序在运行的时候才去链接动态库的代码, 多个程序共享使用库的代码.一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表, 而不是外部函数所在目标文件的整个机器码, 在Linux下动态库一般后缀名为“.so”,Windows下为.dll。

2024-03-27 18:11:12 1099

原创 Linux之文件系统与软硬链接

操作系统需要通过软件的方式对底层的硬件差异化进行屏蔽, 这种动作就叫做逻辑抽象.

2024-03-23 20:52:00 1076

原创 Linux之缓冲区与C库IO函数简单模拟

不管是什么语言Java, python, C, C++等, 它们的IO函数。

2024-03-20 16:42:42 876

原创 Linux之文件管理与重定向

最开始说到过, 一个进程是可以打开的并且可以对这些文件做出不同的操作, 也就是说加载到内存中的文件可能存在多个.当我们在程序里面打开多个文件时, 操作系统肯定是得对这些文件进行管理的, 而管理的本质就是, 管理的方法就是, 所以操作系统为了管理被打开的文件就会创建内核数据结构来描述这些文件, 在操作系统中这个结构体就叫做。

2024-03-20 15:49:47 870

原创 算法之位运算

得到的结果就是最终加法的结果:

2024-03-19 20:33:25 686

原创 算法之前缀和

可以把矩阵 i*j 沿 i 和 j 分为四块, 分别标记为A,B,C,D, 因为这样划分A+B 和 A+C 的面积可以分别用dp[i-1][j]和dp[i][j-1]表示, 而D的面积就是arr[i][j], 所以dp[i][j] = A+B + A+C + D - A = dp[i-1][j] + dp[i][j-1] + dp[i-1][j] + arr[i][j] - dp[i-1][j-1], 而区间[l,r]的和就是dp[r] - dp[l-1], 直接取出数据即可。

2024-03-17 09:47:00 823

原创 算法之二分查找算法

1. 首先说明二分查找算法是比较恶心, 细节很多, 很容易写出死循环的算法, 但熟悉了之后是最简单的算法.2. 其次我们可能听说过二分查找的前提是数组有序的前提下进行, 但其实不一定.二分查找算法的关键是"" , 当我们发现一个规律, 根据这个规律能把这个数组分为两部分, 根据规律能有选择性的舍去一部分, 进而能在另一个部分继续查找, 可以看到这其中并没有提到数组是否有序, 关键在于数组是否有此外, 我们对于选择区间划分点mid的位置也并。

2024-03-12 20:05:26 986

原创 算法之滑动窗口

▪ 我们既然已经找到从 left1 开始的最优的区间, 那么就可以⼤胆舍去left1,但是如果继续像⽅法⼀⼀样,重新开始统计第⼆个元素(left2)往后的和, 势必会有⼤量重复的计算(因为我们在求第⼀段区间的时候, 已经算出很多元素的和了, 这些和是可以在计算下次区间和的时候⽤上的).right不需要再回退到left重新来算一遍sum了, 抛开right对应的值, 此时窗口内的和肯定比上一个窗口小, 所以当前窗口以left为起点的子窗口的sum肯定更小, 所以right在上次的位置待着即可.

2024-03-11 15:22:41 1023

原创 C++之特殊类设计

设计模式(Design Patter)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结.为什么会产生设计模式呢?就像人类历史发展会产生兵法. 最开始部落之间打仗时都是人拼人的对砍, 后来春秋战国时期, 七国之间经常打仗, 就发现打仗也是有套路的,, 来孙子就总结出了《孙子兵法》.设计模式也是类似.为了代码可重用性、让代码更容易被他人理解、保证代码可靠性. 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络, 如同大厦的结构一样.

2024-03-08 20:29:47 763

原创 C++之类型转换

在C语言中, 如果, 或者, 或者不一致时, 就需要发生类型转化, C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换1. 隐式类型转化是, 意义相近的类型之间的转换, 编译器在编译阶段自动进行, 能转就转, 不能转就编译失败,2. 显式类型转化是的类型, 需要用户自己处理.转换的可视性比较差, 所有的转换形式都是以一种相同形式书写, 难以跟踪错误的转换。

2024-03-06 21:53:30 909

原创 C++之智能指针

前面我们知道使用异常可能会导致部分资源没有被正常释放, 因为异常抛出之后会直接跳转到捕获异常的地方从而跳过了一些很重要的的代码, 比如说下面的情况:无异常抛出正常内存释放: 有异常抛出, 内存泄漏: 为了解决这个问题就可以异常重新抛出, 在func函数里面添加捕获异常的代码, 然后在catch里面对资源进行释放最后重新将异常进行抛出, 最后交给main函数中的catch进行处理, 比如说下面的代码: 无论除零是否有异常都会正常释放资源: 但是这么写就完成正确了吗? 肯定没有, 因为new本

2024-03-05 10:20:42 1120

原创 C++之异常处理

实际中都会自定义自己的异常体系进行规范的异常管理, 因为一个项目中如果大家随意抛异常, 那么外层的调用者就没办法处理了, 所以实际中都会定义一套继承的规范体系.这样大家抛出的都是继承的派生类对象, 捕获一个基类就可以了如果每个小组分别负责数据库模块, 缓存模块, 业务模块, 每个小组都会抛出异常, 但是每个小组抛出的异常类型又不同, 如果一起在main函数里面进行捕捉的话就会非常的多并且非常的复杂, 并且每个小组所抛出的异常都有着自己的模块的属性, 所以使用一个类来解决这里的异常就不现实.

2023-12-09 19:00:41 1115

原创 C++11(下)

总体而言emplace的效率并没有比push_back高多少, 但是有一种场景提升比较明显, 对于浅拷贝而且是对象很大的类有效果, 因为浅拷贝push_back不存在移动构造(不存在资源转换), 就是构造+拷贝构造, 而emplace是直接构造, 直接构造肯定比构造+拷贝构造效率高, 所以emplace对于深拷贝的类效果不是很明显, 因为移动构造的成本就是转移资源, 成本很低;对于浅拷贝的类有一定的提升.

2023-12-07 20:44:47 1161

原创 Linux之重谈文件和c语言文件接口

所有对文件的操作都是: a.对内容操作 b.对属性操作。

2023-12-05 17:01:45 251

原创 C++11(上)

1.左值引用只能引用左值, 不能引用右值.2. 但是const左值引用既可引用左值, 也可引用右值.右值引用:1. 右值引用只能引用右值, 不能引用左值.2. 但是右值引用可以move以后的左值.所以其实左值引用其实既可引用左值, 也可引用右值(加const就行了), 那为什么要有右值引用.

2023-12-04 18:23:09 1007

原创 哈希的应用——位图

1.暴力查找:数据量大了, 效率就低.2.排序 + 二分查找问题a: 排序有代价问题b: 数组不方便增删3.引申出->ALV树和红黑树, 性能整体比较稳定, 插入不会有太大波动.4.哈希:搜索比较快, 但是整体不稳定, 插入是有波动的, 某次的插入可能需要扩容, 扩容代价比较高还有极端场景下某个桶的数量可能很高, 但可以改挂红黑树解决.以上数据结构, 空间消耗很高.对于数量很大的数据的场景?5、[整形]的是否存在及其扩展问题--位图及变形节省空间, 但是位图的局限是只能处理整型6、[

2023-11-27 23:10:14 163

原创 C++之哈希

以及。

2023-11-27 19:50:30 161

原创 C++之unordered_map/set的使用

前面我们已经学习了STL中底层为红黑树结构的一系列关联式容器——set/multiset 和 map/multimap(C++98).

2023-11-24 19:03:51 1031

原创 Linux之实现简易的shell

我们在使用shell的时候,发现我们在输入命令是,前面会有:有等信息,这里我们可以用写。看到我们打印出来的是绝对路径, 而shell显示的相对路径, 但为了区分先这样不去裁剪.由于用scanf接收的遇到空格就会停止读取, 所以用fgets, 而且用户输入完命令一定会输入回车, 所以把最后一个回车符删掉.

2023-11-23 17:18:27 97

原创 Linux之进程替换

创建子进程的是让子进程执行中的一部分,是让子进程想办法加载磁盘上让子进程执行另外一个就是让比如说我们在其他路径下写的一些可执行程序.第二种方法可称之为, 进程替换是父进程创建子进程之后让子进程执行其他程序的代码而不是执行父进程代码的一部分.注意和。

2023-11-22 16:53:31 183 1

原创 算法之双指针

dest++ 之后,指向的元素是0元素或者也可能是cur, 因为当dest == cur时,0区间不存在, 因此可以交换dest和cur位置上的数据(如果此时dest==cur,相当于自我交换,可以加if判断省略掉),实现 [0, dest] 的元素全部都是⾮零元素, [dest + 1, cur - 1] 的元素全是零。情况⼆:在历史的数据中死循环,但始终变不到1, 由于上述两种情况只会出现⼀种, 因此, 只要我们能确定循环是在「情况⼀」中进⾏,还是在「情况⼆」中进⾏, 就能得到结果。

2023-11-16 23:26:06 235

原创 C++之map和set模拟实现

在map和set的使用文章中提到了C++STL中的map和set的底层其实就是用的红黑树来实现的,所以可以用来一下STL中的map和set.

2023-11-16 16:31:32 64

原创 数据结构之红黑树

先来定义一下红黑树的结构:结点的颜色我们可以用一个枚举:enum COLORRED,BLACKT _val;COLOR _col;{}这里结点的颜色我们默认给的是红色, 为什么要选择红色, 黑色不可以吗?

2023-11-12 11:04:32 677

原创 数据结构之二叉树OJ(C++)

题目的要求是给我们一棵二叉树,让我们用前序遍历的方式把它转换成一个由整数和括号组成的字符串。我们观察它给的用例会发现其实整数就是每个结点的值,括号其实是把每棵树的左右子树括起来。另外还要求但是又不能无脑的全部省略掉,省略后不能影响字符串与原始二叉树之间的一对一映射关系。所以我们可以先来分析一下,哪些情况需要省略空括号,哪些情况不能省略那对照着图我们很容易得出,括号的处理应该是这样的:1.根结点不为空的情况对应子树的括号肯定不省略2.左不为空,左子树的括号一定不省略3.左为空。

2023-11-10 21:01:21 516

原创 数模之线性规划

投资类问题的注意事项• 收益率 = 收益/成本,设收益率为r,收益为g,成本为c• 如果要求“总收益最大”,一般可以用线性规划• 如果要求“总收益率最大”,一般是非线性规划, r = g/c, 其中c是-1次方(不绝对)

2023-11-09 21:22:40 281

原创 数据结构之AVL树

那我们这里以KV模型的结构实现AVL树,本质都是一样的int _bf;

2023-11-08 17:20:31 293

原创 linux之进程控制

如果子进程结束父进程没有对子进程进行处理的话, 子进程就会变成一个僵尸进程处于这个状态的进程无法被kill指令杀死因为你无法杀死一个已经死去的进程,虽然这个进程的数据和代码已经被操作系统删除, 但是该进程的PCB中还存储着各种退出信息所以它还一直存储在内存中等待着被父进程处理。

2023-11-08 16:43:34 157

原创 map和set的例题

我们为什么要拷贝原链表的结点一个个链接到原链表结点的后面?其实就建立了方便我们设置拷贝结点的random域。那我们现在C++有了map:1.首先我们定义一个map,然后遍历原链表,依次拷贝结点,在map中建立源节点与拷贝结点的映射,并链接拷贝链表.2.然后, 再遍历原链表用来设置拷贝结点的random域:如果源节点的random指向空,那么拷贝结点random也指向空;如果源节点不指向空,那拷贝结点就指向。

2023-11-05 16:00:03 82

原创 C++之set/multiset 和 map/multimap的使用

1. set是按照。

2023-11-05 12:47:51 63

空空如也

空空如也

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

TA关注的人

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