自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高并发内存池

池化技术在说内存池之前,我们得先了解一下“池化技术”。所谓“池化技术”,就是程序先向系统申请过量的资源,然后自己进行管理,以备不时之需。之所以要申请过量的资源,是因为申请和释放资源都有较大的开销,不如提前申请一些资源放入“池”中,当需要资源时直接从“池”中获取,不需要时就将该资源重新放回“池”中即可。这样使用时就会变得非常快捷,可以大大提高程序的运行效率。在计算机中,有很多使用“池”这种技术的地方,除了内存池之外,还有连接池、线程池、对象池等。

2024-01-05 10:58:20 1189 4

原创 算法——BFS解决FloodFill算法

中文:洪水灌溉。假设这一块4*4的方格是一块土地,有凸起的地方,也有凹陷的地方(凹陷的地方用负数表示)。此时下大雨发洪水,会把凹陷的地方填满。绿色圈起来的属于一块区域(上下左右四个方向,有时候题目也会问八个方向包括斜着相连的),题目会问有多少块区域被填满,或者问被填满的最大区域是哪个;或某一块区域的边长是多少。但是本质都是让我们在一块区域找性质相同的连通块。DFS——深度优先遍历(递归):从某一点开始一条路走到黑。

2024-01-04 17:49:19 815

原创 算法——优先级队列(堆)

每一回合,从中选出两块** 最重的** 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。拿到数组后先创建一个大根堆,将数组中的数字全部丢入大根堆里,先后两次拿出堆顶元素,让其碰撞,将碰撞后的结果重新放入大根堆中,给定一个单词列表 words 和一个整数 k ,返回前 k_ _个出现次数最多的单词。如果没有石头剩下,就返回 0。返回的答案应该按单词出现频率由高到低排序。排序后第K大的元素,包括相同的元素也统计进去。返回当前数组中的中位数,数组中会一个个添加数字。

2024-01-04 09:43:34 876

原创 算法——队列+宽搜(BFS)

队列这种数据结构大都服务于一个算法——宽搜(BFS)。宽搜还可以运用到二叉树、图、迷宫最短路径问题、拓扑排序等等。

2024-01-02 16:59:59 623 1

原创 算法——栈

接下来开始遍历数字(要把它从字符串中提前出来)当遇到第一个数字时,不要提取,先把他放入栈中,因为我们在数字前面初始化了+,我们不知道数字下一个位置的运算符是什么,如果是乘除,这个数字就要和后面的运算符结合。当箭头移动到4时,此时char里存储的是*,此时把栈顶元素弹出来计算(因为本题中没有括号,乘除法的优先级为最高,所以可以大胆将其弹出进行运算)执行完4*6之后,将24继续放入栈里。刚开始遇到数字,要先把数字提取出来,放到int栈里,碰到左括号,将左括号后的字符提取出来放入string栈里。

2023-12-29 12:05:47 1075 1

原创 算法——字符串

先不处理进位情况。相加完之后再处理进位情况。创建一个长度为m+n-1的数组,让下面的数去乘上面的数,判断放在哪个位置时,就让两个数字下标相加即可。比如用6去乘3,即都是0位置上,最终18就放在数组0下标的位置上。最终处理进位时,就相当于让tmp里的数再和0相加放入ret里就行。最后的最后处理前导0.

2023-12-28 16:13:47 1038

原创 算法——哈希表

*是什么:**存储数据的容器:快速查找某个元素,时间复杂度O(1),空间复杂度O(n)**什么时候使用哈希表:**频繁查找某一个数(这里不要忘了之前的二分,时间复杂度O(logN)): 1.容器 2.用数组模拟简易哈希表。

2023-12-25 17:50:05 1038 1

原创 算法——链表

我们一般选择创建哨兵位头结点,这里我们哨兵位不存储数据。解释传入空链表,这里的newhead只需要特判一下即可不要吝啬空间,大胆定义变量。

2023-12-25 10:17:14 977 1

原创 算法——分治

用归并算法给数组排序,首先先选择mid中间点,先把左边部分排序,排左边的时候相当于又是一个归并排序的过程,直至只剩下一个元素的时候,向上返回,排右边区间,直至剩下一个元素时,开始向上返回,当这一层都排完时,合并两个有序数组。当cur1[num] <= cur2[num]:说明此时还没有比cur2位置上大的数,就继续找,直到找到cur1位置大于cur2位置的数,所以让cur1++(本质上是先把cur1位置的数放到辅助数组里面,然后让cur1++)找两个数,使前面的数大于后面的数2倍。该算法是基于快排改良的。

2023-12-18 09:36:07 391 3

原创 算法——模拟

比葫芦画瓢,题目思路比较简单,考验思路转化为代码能力。

2023-12-12 16:58:09 875

原创 算法——位运算

一大堆数随便异或(不考虑运算顺序),结果是唯一的运用6、7LeetCode191. 位1的个数LeetCode318. 比特位计数LeetCode461. 汉明距离运用9LeetCode136. 只出现一次的数字LeetCode260. 只出现一次的数字III。

2023-12-11 16:46:29 471

原创 算法——前缀和

该算法是先预处理一个数组,用空间换时间,将原本时间复杂度为O(n2)降为O(n)

2023-12-08 11:03:47 1069 1

原创 算法——二分查找

在排序数组中查找元素的第一个和最后一个位置。

2023-12-05 16:59:16 1607 2

原创 算法——滑动窗口

更新结果这一步,需要结合实际题目具体分析,有时候需要进窗口的时候更新结果,有的时候需要出窗口时更新结果,此题出窗口前更新结果。滑动窗口的正确性:利用单调性,规避掉了很多没有必要的枚举时间复杂度:从代码角度看,好像是两层循环嵌套,时间复杂度似乎也是O(n2),但是实际情况我们对窗口进行操作时,left、right每次只移动了一步(即我们的两个指针不回退),最多两个一共移动n+n次,即时间复杂度为O(n)

2023-12-01 10:34:32 4881 3

原创 算法—双指针

双指针算法可以帮忙把时间复杂度降低一个维度,即原本O(n2)降为O(n);将O(n)降为O(1)

2023-11-28 15:43:29 538 4

原创 特殊类设计

new和delete默认调用的是全局的operator new函数和operator delete函数,但如果一个类重载了专属的operator new函数和operator delete函数,那么new和delete就会调用这个专属的函数。将该类的构造函数设置为私有即可,因为子类的构造函数被调用时,必须调用父类的构造函数初始化父类的那一部分成员,但父类的私有成员在子类当中是不可见的,所以在创建子类对象时子类无法调用父类的构造函数对父类的成员进行初始化,因此该类被继承后子类无法创建出对象。

2023-10-24 09:04:02 130 3

原创 C++智能指针

内存泄漏的问题内存泄漏是指因为疏忽或错误,造成程序未能释放已经不再使用的内存的情况。执行上述代码时,如果用户输入的除数为0,那么div函数中就会抛出异常,这时程序的执行流会直接跳到主函数中的catch块中执行,最终导致func函数中申请的内存资源没有得到释放。利用异常的重新捕获解决对于这种情况,我们可以在func函数中先对div函数中抛出异常进行捕获,捕获后先将之前申请的内存资源释放,然后再将异常重新抛出利用智能指针解决我们使用智能指针试试。

2023-10-18 09:04:29 184

原创 STL—— unordered_set、unordered_map的介绍及使用

unordered_set是不按特定顺序存储键值的关联式容器,其允许通过键值快速的索引到对应的元素。在unordered_set中,元素的值同时也是唯一地标识它的key。在内部,unordered_set中的元素没有按照任何特定的顺序排序,为了能在常数范围内找到指定的key,unordered_set将相同哈希值的键值放在相同的桶中。unordered_set容器通过key访问单个元素要比set快,但它通常在遍历元素子集的范围迭代方面效率较低。它的迭代器至少是前向迭代器。

2023-09-22 10:58:39 311

原创 高阶数据结构——图

图的基本概念图是由顶点集合和边的集合组成的一种数据结构,记作 G = ( V , E ) G=(V, E)G=(V,E)。如下图:带权图示例:如下图:如下图:图的相关应用场景图与树的联系与区别。

2023-09-19 18:20:39 321 2

原创 认识“协议”

协议,网络协议的简称,网络协议是通信计算机双方必须共同遵从的一组约定,比如怎么建立连接、怎么互相识别等。为了使数据在网络上能够从源到达目的,网络通信的参与方必须遵循相同的规则,我们将这套规则称为协议(protocol),而协议最终都需要通过计算机语言的方式表示出来。只有通信计算机双方都遵守相同的协议,计算机之间才能互相通信交流。

2023-08-22 10:43:44 336 2

原创 网络套接字(三)

在实现了简单的TCP服务器后,最开始我们实现的是单执行流的TCP服务器,之后通过代码测试发现单执行流的TCP服务器无法同时为多个客户端提供服务,于是又转而实现了多执行流的TCP服务器。在实现多执行流的TCP服务器时,分别演示了多进程和多线程的实现方式,为了进一步优化基于多线程的TCP服务器,最终还将线程池接入到了TCP服务器当中。此时访问TCP服务器的各个客户端,分别由不同的执行流为其提供服务,因此这些客户端能够同时享受服务器提供的服务。

2023-08-18 18:08:20 184 2

原创 网络编程套接字(二)

我们将TCP服务器封装成一个类,当我们定义出一个服务器对象后需要马上对服务器进行初始化,而初始化TCP服务器要做的第一件事就是创建套接字。如果创建套接字后获得的文件描述符是小于0的,说明套接字创建失败,此时也就没必要进行后续操作了,直接终止程序即可。

2023-08-08 17:24:56 312 2

原创 MySQL使用C语言连接

要使用C语言连接MySQL,需要使用MySQL官网提供的库。

2023-07-16 20:26:02 750 2

原创 MySQL用户管理

需要注意的是,MySQL中可以存在同名的用户,只要这些同名用户对应的登录主机不同即可,因为user表中的主键是复合主键,由表中的user列和host列共同承担。此外,由于我们创建的这个用户可以从任意地方登录,因此如果你在Windows下也安装了MySQL,那么就可以在Windows的cmd窗口进行远程登录。但该用户目前只能查看表中的信息,而不能对表中的数据进行修改,因为我们只授予了该用户select权限。需要注意的是,新创建的用户没有任何权限,因此创建用户后需要给用户授权。

2023-07-15 20:50:53 1088 2

原创 MySQL视图特性

视图的概念。

2023-07-11 18:10:45 330 3

原创 MySQL事务管理

隔离级别总结隔离级别脏读不可重复读幻读加锁读读未提交(read uncommitted)√√√不加锁读已提交(read committed)X√√不加锁可重复读(repeatable read)XXX不加锁可串行化(serializable)XXX加锁√:会发生该问题X:不会发生该问题隔离级别越严格,安全性越高,但数据库的并发性能也就越低,在选择隔离级别时往往需要在两者之间找一个平衡点。

2023-07-07 17:57:57 1931 4

原创 MySQL索引特性

索引的概念索引的价值上述SQL中创建一个名为index_demon的数据库,在该数据库中创建了一个名为index_demon的数据库,在该数据库中创建了一个名为EMP的员工表,并向表中插入了八百万条记录。将上述SQL保存到文件中,然后在MySQL中使用source命令,依次执行文件中的SQL即可。通过desc命令可以看到,目前EMP员工表中没有建立任何索引。如下:查询emp表中指定工号的员工信息,可以看到每次查询过程中都需要花费4-5s左右。

2023-06-18 11:30:37 643 4

原创 MySQL内外查询

表的连接分为内连接和外连接。

2023-06-11 15:49:18 661 5

原创 MySQL复合查询

准备测试表员工表(emp)中的内容如下:部门表(dept)中的内容如下:工资等级表(salgrade)中的内容如下:查询工资高于500或岗位为MANAGER的员工,同时要求员工姓名的首字母为大写的J在where子句中指明筛选条件为工资高于500或岗位为MANAGER,并且通过模糊匹配指明员工姓名的首字母为大写的J,在select的column列表中指明要查询的列为姓名、工资和岗位。如下:查询员工信息,按部门号升序而员工工资降序显示。

2023-06-10 20:34:17 1010 3

原创 MySQL内置函数

日期函数current_date函数current_date函数用于获取当前的日期。如下:current_time函数current_time函数用于获取当前的时间。如下:current_timestamp函数current_timestamp函数用于获取当前的时间戳,以日期时间格式进行显示。如下:now函数now函数用于获取当前的日期时间。如下:date函数date函数用于获取当前的日期时间。如下:date_add函数date_add函数用于在日期的基础上添加日期或时间。

2023-06-09 18:39:21 1075 2

原创 Linux线程池

线程池是一种线程使用模式线程过多会带来调度开销,进而影响缓存局部和整体性能,而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。

2023-06-07 17:02:34 502 4

原创 Linux信号量

此时由于生产者生产的很快,运行代码后一瞬间生产者就将环形队列打满了,此时生产者想要再进行生产,但空间资源已经为0了,于是生产者只能在blank_sem的等待队列下进行阻塞等待,直到由消费者消费完一个数据后对blank_sem进行了V操作,生产者才会被唤醒进而继续进行生产。虽然消费者消费的很快,但一开始环形队列当中的数据资源为0,因此消费者只能在data_sem的等待队列下进行阻塞等待,直到生产者生产完一个数据后对data_sem进行了V操作,消费者才会被唤醒进而进行消费。

2023-06-01 17:45:31 485 3

原创 Linux生产者消费者模型

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题生产者和消费者彼此之间不直接通讯,而通过这个容器来通讯,所以生产者生产完数据之后不用等待消费者处理,直接将生产的数据放到这个容器当中,消费者也不用找生产者要数据,而是直接从这个容器里取数据,这个容器就相当于一个缓冲区,平衡了生产者和消费者的处理能力,这个容器实际上就是用来给生产者和消费者解耦的。

2023-06-01 16:38:04 522 1

原创 Linux线程安全

临界资源和临界区进程之间如果要进行通信我们需要先创建第三方资源,让不同的进程看到同一份资源,由于这份第三方资源可以由操作系统中的不同模块提供,于是进程间通信的方式有很多种。进程间通信中的第三方资源就叫做临界资源,访问第三方资源的代码就叫做临界区。而多线程的大部分资源都是共享的,线程之间进行通信不需要费那么大的劲去创建第三方资源,让新线程每隔一秒对该变量加一操作,让主线程每隔一秒获取count变量的值进行打印。

2023-05-30 21:01:06 555 4

原创 Linux多线程

需要明确的是,一个进程的创建实际上伴随着其进程控制块(task_struct)、进程地址空间(mm_struct)以及页表的创建,虚拟地址和物理地址就是通过页表建立映射的。每个进程都有自己独立的进程地址空间和独立的页表,也就意味着所有进程在运行时本身就具有独立性。

2023-05-26 18:15:11 1166 4

原创 MySQL表的增删查改

在select的column列表中添加表达式查询,查询的表达式为语文、数学和英语成绩之和,为了方便观察可以将表达式对应的列指定别名为“总分”,在where子句中指明筛选条件为三科成绩之和小于260。需要注意的是,MySQL中不支持+=这种复合赋值运算符,此外,这里在查看更新后的数据时不能查看总成绩倒数前三的3位同学,因为之前总成绩倒数前三的3位同学,数学成绩加上30分后可能就不再是倒数前三了。

2023-05-20 08:37:10 2652 2

原创 MySQL表的约束

创建客户表的时候,将客户编号设置成主键并且可以将其设置成自增长字段,然后给姓名设置not null属性,将邮箱设置成唯一键,将性别设置成enum类型并仅提供男女性别选项,此外,题目虽然没有对身份证做要求,但正常来说身份证也应该保证唯一性,最好也设置成唯一键。创建购买表的时候,将订单号设置成主键并且可以将其设置成自增长字段,然需要将客户编号和商品编号设置成外键,分别关联到客户表和商品表中的客户编号和商品编号,用外键约束来保证每一个订单的客户编号和商品编号都是存在的。

2023-05-05 17:45:20 238 7

原创 MySQL数据类型

MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false。| | SET | 集合类型:SET类型的取值范围需要在定义字段时进行指定,设置字段值时可以从成员中选取一个或多个值,其所需的存储空间由定义SET类型时指定的成员个数决定 |如果要存储的数据是变长的,那就使用varchar类型进行存储,比如名字、地址等。

2023-05-02 22:04:47 1114 3

原创 MySQL表的操作

这里用的是表的DDL操作,也就是操作表结构的SQL语句。

2023-04-21 20:17:11 597 2

原创 MySQL库的操作

创建数据库创建数据库的SQL如下:如果创建数据库时未指明数据库的编码格式或校验规则,则默认使用MySQL配置文件中对应的编码格式或校验规则。

2023-04-21 17:05:23 813 2

空空如也

空空如也

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

TA关注的人

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