- 博客(53)
- 收藏
- 关注
原创 [数据结构]归并排序、计数排序
归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
2023-04-02 15:59:01
453
2
原创 [数据结构]冒泡排序、快速排序
通过我们的分析,就算快速排序在理想情况下,每次都取到中间值作为key值,每次往下递归也必须开辟上一层递归层数的两倍的函数栈帧,而栈的空间是有限的,如果遇到数据比较大的序列,有可能会导致栈溢出,所以这也是快速排序可以优化的一个点。:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。经过一次单趟排序,最终使得key左边的数据全部都小于key,key右边的数据全部都大于key。
2023-03-27 15:35:53
1228
原创 [数据结构]选择排序、堆排序
动图演示的是每次选出集合中最小的数,我们可以进行优化,每次从集合中选出最小和最大的数,分别与第一个数和最后一个数交换,这样可以每趟排序可以排好两个数,效率提高一倍。堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。将根结点最大的堆叫做最大堆或大根堆,根结点最小的堆叫做最小堆或小根堆。堆通常是一个可以被看做一棵树的数组对象。
2023-03-25 15:48:53
540
原创 [数据结构]直接插入排序、希尔排序
希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。
2023-03-23 13:15:49
627
2
原创 MySQL索引特性
数据库的数据是可能同时存在于内存和磁盘中的,数据在进行CRUD之后发生更改,就需要有对应的刷新策略将数据刷新到磁盘,这就说明MySQL需要较高频次的进行IO操作,为了提高效率,MySQL服务器会在内存中预先开辟一大块空间进行数据缓存,这块空间叫做buffer pool,磁盘的数据会预先加载到buffer pool中,刷新磁盘的数据也是从buffer pool中将数据刷新到磁盘。其中, MyISAM 最大的特点是,将索引Page和数据Page分离,也就是叶子节点没有数据,只有对应数据的地址。
2023-03-18 14:55:27
1687
15
原创 MySQL复合查询
在实际中往往数据来自不同的表,所以需要多表查询。单行子查询是指子查询只返回单列,单行数据。多行子查询是指返回单列多行数据,都是针对单列而言的,而多列子查询则是指查询返回多个列数据的子查询语句。这里要用到数据查询的技巧,把一个子查询当做一个临时表使用。当使用该操作符时,会自动去掉结果集中的重复行。当使用该操作符时,不会去掉结果集中的重复行。子查询是指嵌入在其他sql语句中的select语句,也叫嵌套查询。因为上面的数据来自EMP和DEPT表,因此要联合查询。返回一行记录的子查询。返回多行记录的子查询。
2023-03-13 14:16:24
456
原创 MySQL表的约束
真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如说我们的居民身份证,电话号码,都被要求是唯一的,这就需要约束。
2023-03-03 18:59:19
1507
13
原创 MySQL表的操作
在项目实际开发中,经常修改某个表的结构,比如字段名字,字段大小,字段类型,表的字符集类型,表的存储引擎等等。我们还有需求,添加字段,删除字段等等。这时我们就需要修改表。
2023-02-08 19:32:04
1866
6
原创 MySQL库的操作
可以告诉我们当前有哪些用户连接到我们的MySQL,如果查出某个用户不是你正常登陆的,很有可能你的数据库被人入侵了。以后大家发现自己数据库比较慢时,可以用这个指令来查看数据库连接情况。说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8,校验规则是:utf8_general_ ci。创建一个数据库,校验规则使用utf8_ general_ ci[不区分大小写]创建一个数据库,校验规则使用utf8_ bin[区分大小写]不区分大小写的查询以及结果。区分大小写的查询以及结果。
2023-02-06 16:28:48
1197
6
原创 [MySQL]数据库基础
存储数据有各种各样的方式,最常见的方式使用文件存储,那么为什么要用数据库存储数据呢?文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中不容易控制为了解决上述问题,专家设计出了更加利于管理数据的方式----数据库存储,他能够更有效的管理数据。
2023-02-04 19:45:34
635
原创 [Linux]生产者消费者模型(基于BlockQueue的生产者消费者模型 | 基于环形队列的生产者消费者模型 | 信号量 )
在多线程编程中阻塞队列(Blocking Queue)是一种常用于实现生产者和消费者模型的数据结构。其与普通的队列区别在于,当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出(以上的操作都是基于不同的线程来说的,线程在对阻塞队列进程操作时会被阻塞)。POSIX信号量和SystemV信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。但POSIX可以用于线程间同步。
2023-02-02 17:14:21
1678
8
原创 [cpp进阶]C++类型转换
当我们在函数中用父类的指针或引用接受参数时,接收的参数有可能指向父类对象也有可能指向子类对象,当接收的参数指向父类对象时,不需要做任何处理,当接收的参数指向子类对象时,有时就需要将该对象转换为原来的子类对象。
2023-01-29 19:14:07
1001
3
原创 [cpp进阶]C++特殊类设计
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。
2023-01-27 21:35:45
870
2
原创 [cpp进阶]C++异常
在实际使用中,我们会自定义异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者没有办法识别异常是从哪一个业务层抛出的,所以实际中都会定义一套继承的规范体系。
2023-01-08 19:51:17
2752
23
原创 [cpp进阶]C++智能指针
智能指针运用了RAII的思想。RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
2023-01-05 18:49:20
1720
21
原创 [Linux]多线程的同步和互斥(线程池 | 单例模式 | 其他常见的锁 | 读者写者问题)
线程池是一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量
2022-12-25 13:29:46
745
13
原创 [Linux]多线程的同步和互斥(线程安全 | 互斥锁 | 死锁 | 条件变量)
创建一个线程为master线程,三个线程为worker线程,每过3s master线程唤醒一个worker线程工作。要做到这三点,本质上就是需要一把锁。
2022-12-21 16:04:54
488
8
原创 [Linux]线程概念_线程控制(线程与进程的区别与联系 | 线程创建 | 线程等待 | 线程终止 | 线程分离 | LWP)
因为Linux线程是用进程复用模拟的,所以Linux没有提供直接操作线程的接口,而是提供了在同一进程地址空间创建PCB的方法,分配资源给指定PCB的接口,但是这些接口为用户不友好,所以一些系统级别的工程师就在用户层对Linux轻量级进程接口进行封装,打包成库,让用户直接使用库接口(线程创建,释放线程,等待线程等等),这个库叫做。调用该函数的线程将挂起等待,直到id为thread的线程终止。线程获取退出码,得知代码的运行结果的对错,但是如果程序异常了呢?那么Linux是怎么管理线程的呢?为什么需要线程等待?
2022-12-20 12:19:08
881
7
原创 [Linux]进程信号(阻塞信号 | 信号集操作函数 | 信号捕捉 | 可重入函数 | volatile关键字)
进程在收到信号后,对于信号的处理并不是立刻做出反应,这与进程的优先级有关,进程有可能在执行优先级更高的工作,信号就需要被暂时保存下来,进程的信号会被暂时保存在进程的task_struct中。
2022-09-06 17:01:04
402
24
原创 [Linux]进程信号(信号入门 | 信号产生的方式 | 信号捕捉初识)
生活中有许许多多的信号,比如闹钟,红绿灯,信号枪和鸡叫声等等,当我们接收到这些信号后,我们会立即做出反应,闹钟响了就要起床,红灯停绿灯行,也就是说在接受这些信号之前,我们已经知道收到信号后所对应的措施。而且,在生活中我们收到信号,不一定是立即处理的,比如当我们接到外卖员的电话,这是一个信号,但是如果我们现在正在做更重要的事,就不会立即去处理这个信号。
2022-09-04 14:10:13
902
27
原创 [Linux]进程间通信(system V共享内存 | system V信号量)
在内核中,所有的IPC资源都是由数组组织起来的,但是共享内存、消息队列和信号量的数据结构类型完全不一样,操作系统是怎么组织的呢?
2022-09-02 19:51:09
1456
23
原创 [Linux]进程间通信(进程间通信介绍 | 匿名管道 | 命名管道)
进程是具有独立性的,进程之间在保持各自独立性时,可能会存在特定的协同工作的场景,比如一个进程要把数据交付给另一个进程进行处理,这种场景下就需要进程间通信。要实现进程间通信,操作系统就要设计适合系统的通信方式,然而进程是具有独立性的,要交互数据,成本非常高,因为一个进程是获取不到另一个进程的资源的,如果要实现进程间通信就必须让不同的进程可以看到同一份资源。所以说,进程间通信的本质是由操作系统提供一份通信进程可以看到的公共资源,这份资源可能以文件方式提供,也可能队列的方式,也可能是原始的内存块。...
2022-08-31 15:24:20
1485
17
原创 [Linux]基础IO下(理解文件系统 | inode | 动静态库)
Linux基础IO,理解文件系统,了解文件inode的构成,学会打包动静态库并使用。在基础IO上谈到的都是一个文件被打开后的情况,下面我们要谈谈如果一个文件没有被打开呢?文件没有被打开时,是被保存在磁盘的。文件=文件内容+文件属性,如果一个空文件被创建出来,这个空文件的属性也是要占磁盘的空间的。磁盘分为机械硬盘和固态硬盘。在机械硬盘中写入,本质上是写入到机械硬盘的盘片上,磁盘写入的基本单位是:扇区(512字节),扇区是盘片上的一圈磁道上同半径的小块单元,不同盘片的磁道上下形成一个柱面。......
2022-08-29 16:42:38
1304
29
原创 [Linux]基础IO上(C文件操作 | 系统文件IO | 文件描述符fd | 缓冲区概念)
[Linux]基础IO上(C文件操作 | 系统文件IO | 文件描述符fd | 缓冲区概念)
2022-08-23 14:31:52
1253
30
原创 [cpp初阶]类和对象上
文章目录面向过程和面向对象初步认识类的引入类的定义面向过程和面向对象初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。...
2022-08-19 14:46:27
320
6
原创 [cpp进阶]多态和虚函数
文章目录多态的概念多态的概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。比如说:买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。买票这一个行为,不同的人做就有不同的行为和结果,这就是多态。...
2022-05-14 21:01:35
1061
17
原创 [cpp初阶]C++入门
文章目录命名空间命名空间定义命名空间的使用C++输入输出缺省函数缺省函数分类函数重载函数重载概念函数名修饰规则extern "C"引用引用概念引用特性常引用使用场景引用和指针的区别内联函数概念特性auto关键字(C++11)auto简介auto的使用细则auto不能推导的场景基于范围的for循环(C++11)范围for的语法范围for的使用条件指针空值nullptr(C++11)C++98中的指针空值命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局
2022-04-25 14:27:10
501
1
原创 [数据结构]二叉树的结构及实现
文章目录树的概念及结构树的概念树的相关概念树的表示二叉树的概念及结构二叉树的概念特殊的二叉树二叉树的性质二叉树的存储结构二叉树的顺序结构及实现二叉树的链式结构及实现二叉树的链式结构二叉树的遍历二叉树的前中后序遍历二叉树的层序遍历结点个数及其高度二叉树查找二叉树的销毁树的概念及结构树的概念树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。有一个特殊的结点,称为根结点,根节点没有前驱结点.
2022-04-07 09:39:28
740
14
原创 [数据结构]栈和队列
文章目录栈栈的概念和结构栈的实现队列队列的概念和结构队列的实现栈栈的概念和结构栈:栈是一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。**进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。**栈中的元素遵循后进先出LIFO(Last in First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈。入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据也在栈顶。栈的实现栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。因为数组在尾上插入数据的代价
2022-04-05 11:48:29
151
5
原创 [数据结构]堆的实现及Topk问题
文章目录堆的概念及结构堆的实现堆向下调整算法堆的创建建堆时间复杂度堆的插入堆的删除堆的代码实现堆排序Topk问题堆的概念及结构 如果有一个关键码的集合K = { k0,k1 ,k2 ,…,kn-1 },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:ki <= k2*i+1且ki <= k2i+2(ki >= k2i+1且 ki >= k2i+2) i = 0,1,2…,则称为
2022-01-19 00:38:51
1127
9
原创 [数据结构]顺序表_链表
文章目录1.线性表2.顺序表2.1概念及结构2.2接口实现2.3顺序表的问题3.链表3.1链表的概念和结构链表的类型1.线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。2.顺序表2.1概念及结构顺序表是用一段 物理地址连续的存储单元依次
2021-12-01 23:29:46
1712
15
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人