自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 QT使用emit时发生内存泄露

2.主要原因:在使用子线程时,线程使用了join()来等待子线程完成,这样使用emit也不会发送信号,因为join()是阻塞的,必须等待当前线程完成。1.场景:在QT里面使用多线程进行编程时,子线程执行的函数里面使用了emit发生了内存泄露。3.解决方法:将join()改为detach();

2023-04-08 10:51:32 552 1

原创 获取当前CPU的运行速度

1.实时获取CPU频率2.获取的方法,使用性能计数器PDH来实现对性能数据的高级访问。PDH是Windows提供的库。相关文档可以自行查看。实时频率 = 处理器性能*基准频率下面就是代码:获取的单位是MHz,可以进行转换。另外,和当前资源管理器显示的不是完全一致的,因为这个值是在实时更新的。

2022-12-06 21:02:54 1174 1

原创 工厂方法模式

工厂方法模式(FACTORY METHOD)是一种常用的类创建型设计模式,此模式的核心精神是封装类中变化的部分,提取其中个性化善变的部分为独立类,通过依赖注入以达到解耦、复用和方便后期维护拓展的目的。它的核心结构有四个角色,分别是抽象工厂;具体工厂;抽象产品;具体产品类图如下:写出来的程序只会依赖Creator和Product这两个抽象类,而不会依赖具体的类。主要的思想就是,高层的模块应当依赖抽象类,而不是依赖具体的类。需要符合依赖倒置原则依赖倒转原则高层模块不应该依赖低层模块,二者都应该依赖

2022-05-25 17:45:55 233

原创 计算机网络

1. 网络篇1. 公钥和私钥公钥和私钥是通过一种算法得到的一个密钥对,公钥是秘钥对中公开的部分,私钥是非公开的部分。如果用其中一个密钥加密一段数据,必须用另一个密钥解密。比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。原则:公钥公开,私钥只有自己拥有。2. 对称加密与非对称加密对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;​ 非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发

2022-05-18 15:43:35 328

原创 操作系统经典问题

生产者消费者模型生产者和消费者问题是计算机同步互斥的经典问题,其意思就是生产者把生产出来的产品放在仓库里,消费者把产品从仓库里取出来。仓库属于临界区,生产者和消费者一次只能一个进入临界区中。两个进程之间就有一个同步互斥问题,下面我将对该问题进行详细介绍。什么是PV操作  PV操作是由P操作原语和V操作原语组成(原语是不可能中断的过程),操作对象是信号量。具体的:  P(S):① 将信号量S的值减1,即S=S-1;② 如果S>=0,则该进程继续执行;否则进程进入等待队列,置为等待状态。  V(

2022-05-16 15:36:20 394

原创 C++内存管理

四大基本构件一、new/delete1.new/delete的调用过程new的调用过程是:首先调用operator new分配空间(operator new的底层还是使用malloc来分配空间),然后调用对象的构造函数。delete的调用过程:首先是调用对象的析构函数,然后调用operator delete(底层使用free实现)释放空间注意:这就是new/delete与malloc/free的区别,虽然new/delete底层还是调用malloc和free,但是new/delete多出来的

2022-05-12 20:39:18 261

原创 优先队列priority_queue

一、概述顾名思义,priority_queue是一个拥有权值观念的queue。其里面的元素的排列顺序是通过最大堆来决定的。最大的元素在堆顶,形成了一个最大堆。缺省的情况下priority_queue是利用一个max-heap来实现的。而max-heap是一个以vector表现的complete binary tree。注意:对于一个堆来说,最大的元素在堆顶,但是后面的元素不一定是有序的。2.max-heap实现优先队列最大堆的创建每添加一个元素,就把这个堆构建成最大堆,以确保堆顶元素最大。然后当

2022-05-03 16:08:40 190

原创 stack和queue

一、stack1.概述stack(栈)是一种先进后出的数据结构。它只有一个出口。所以stack不允许有遍历行为。在缺省的情况下stack以deque作为底层结构。也可以以链表作为底层结构。2.stack的一些操作3.stack没有迭代器stack的所有元素都必须符合先进后出的条件,只有stack顶端的元素才会被外界取用。stack不提供遍历功能,也不提供迭代器。二、queue1.概述queue(队列)是一种先进先出的数据结构。它有两个出口,如下图所示。在缺省的情况下stack以dequ

2022-05-03 14:50:20 1100

原创 deque容器介绍

一、概述deque是一个双向开口的连续线性空间。所谓双向开口,就是可以在头尾两端分别做插入和删除操作。deque和vector的差异:deque允许于常数时间内对头端进行元素的插入或删除操作。deque没有所谓的容量(capacity)概念,因为它是以动态地以分段连续空间组合而成,随时可以增加一段新的空间并连接起来。换句话说,向vector那样“因旧空间不足而重新分配一块更大的空间,然后复制元素,再释放旧空间”这样的事情在deque上是不会发生的。因此,deque没有必要提供所谓的空间保留(res

2022-05-02 15:59:08 371

原创 list容器介绍

一、概述list的好处是每次插入或删除一个元素,就配置或释放一个元素空间。并且,对于任何位置的插入或删除,list永远都是常数时间。二、list的数据结构1.list的节点list是一个环状双向链表2.list在内存中的结构这个链表是一个双向环状链表,在list的定义里面,有一个元素node用来指向当前的节点,因为它是一个双向环状链表,所以一个node就可以表示整个链表。刚开始时,node指向一个空的节点,这个节点的next指向链表的开始结点begin(),这个结点的prev指向链表里面最后一

2022-05-02 14:47:23 738

原创 vector容器

一、vector概述vector是动态连续空间,支持随机存取,迭代器的类型是Random Access Iterator。所以它支持下标访问。二、vector的实现原理1.vector动态空间的实现当vector当前的空间被充满时,如果还想要插入元素,那么必须扩充空间。扩充空间的过程是:首先在内存里面找到当前vector容量两倍的空闲的连续空间。然后进行配置空间、数据移动、释放旧空间的大工程。重新配置空间的时间成本很高,所以系统按两倍的方式扩充。2.vector的定义与常用的函数:三、ve

2022-04-28 09:02:09 734

原创 mysql里面的日志

一、日志类型MySQL 中有七种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log),中继日志(relay log)。二、日志作用1.二进制日志(binlog)binlog 主要有以下作用:复制:MySQL 主从复制在 Master 端开启 binlog,Master 把它的二进制日志传递给 slaves 并回放来达到 master-

2022-03-21 11:02:03 8392 1

原创 mysql常见面试题

3. SQL语句可以分为几类?DDL(Data Definition Language)数据定义语言用来定义数据库对象:数据库,表,列等。关键字:create, drop,alter 等DML(Data Manipulation Language)数据操作语言用来对数据库中表的数据进行增删改。关键字:insert, delete, update 等DQL(Data Query Language)数据查询语言用来查询数据库中表的记录(数据)。关键字:select, where 等DCL(Data

2022-03-06 17:54:54 122 3

原创 操作系统面试题

操作系统面试题什么是操作系统?请简要概述一下操作系统有哪些分类?用户态与核心态?哪些操作会导致用户态切换到核心态?并发和并行的区别什么是进程?进程的基本状态?简述进程间通信方法进程调度的时机不能进行进程调度的情况进程调度算法有哪些?什么是孤儿进程?僵尸进程?什么是线程?为什么需要线程?简述线程和进程的区别和联系进程同步的方法线程同步的方法进程同步与线程同步有什么区别死锁是怎样产生的?如何解决死锁问题?请说一下什么是写时复制?实时操作系统的概念优先级反转是什么?如何解决常见内存管理方式有哪些?什么是分页存储管

2022-03-04 18:01:14 94

原创 C++面试题

• 指针与引用的区别,struct 与 class 的区别引用必须被初始化,指针不必。int ival=1024;int &refval=ival; //refval指向ival(是ival的另一个名字)int &refval2; //报错,引用必须初始化因为一般在初始化变量时,初始值会被拷贝到新建立的对象中。不过在定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。一旦初始化完成,引用则绑定到它的初始化对象上。不能更改绑定的对象,因此引用必须

2022-02-28 20:01:13 1005

翻译 二叉搜索树的创建和删除

一、二叉搜索树的概念二叉搜索树又称为二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:1.若它的左子树不为空,则左子树上所有结点的值都小于根结点的值。2.若它的右子树不为空,则右子树上所有结点的值都大于根结点的值。3.它的左右子树也分别是二叉搜索树。下面就是一颗二叉搜索树二、二叉搜索树的算法实现...

2022-01-06 11:05:56 3714

原创 堆排序实现哈夫曼树

哈夫曼树1.哈夫曼树:假设由m个权值{W1,W2,…,Wm},可以构造一棵含m个叶子结点的二叉树,第i个叶子结点的权为Wi,则其中带权路径长度WPL最小的二叉树称作最优二叉树或哈夫曼树。2.哈夫曼树的目的:找出存放一串字符所需的最少的二进制编码3.哈夫曼树的建立:Huffman为了减少通信系统中字符编码所需要的二进制位长度,提出了用于产生不定长的前缀编码算法,所谓前缀编码是指任意一个编码都不是其它编码的前缀。前缀编码的思想就是对于出现概率较大的字符采用短编码方式,对于出现概率比较小的字符采用长编码方式

2022-01-04 17:13:49 877

原创 二叉树的存储与遍历

文章目录二叉树的存储结构遍历二叉树二叉树的存储结构1.顺序存储结构存储的结构体为:typedef struct{ DataType data[MaxTreeNodeNum]; int n;}QBTree;这种存储方式的优点是:空间利用率高、寻找孩子和双亲比较容易。缺点:若二叉树不是完全二叉树的话,那么就必然会有空缺的位置,空缺的位置需要用特定的符号填补,若空缺节点比较多,势必造成空间利用率的下降。2.链式存储结构结构体为:typedef struct bnode{

2021-12-31 10:02:35 740

原创 TCP/IP网络编程--基于Linux

文章目录网络编程初识创建套接字并建立连接基于TCP实现基于UDP实现连接之后的数据交换优雅的断开套接字的连接多进程服务器端进程概述信号处理基于多任务的并发服务器分割TCP的I/O程序进程间通信通过管道实现进程间通信基于select的I/O复用多种I/O函数套接字和标准I/O分离I/O流优于select的epollepoll的理解以及应用条件触发和边缘触发多线程服务器端的实现网络编程初识网络编程就是编写程序使两台联网的计算机相互交换数据,这就是网络编程的全部内容。那么怎么交换数据呢?首先需要物理层的支持,

2021-12-22 21:15:27 1213

原创 应用层总结

1.进程通过一个称为套接字的软件接口向网络发送报文和接收报文。2.IP地址用来标识主机,而目的端口号则是用来标记主机上的接收进程。3.应用层需要运输层提供的服务有:可靠数据传输、吞吐量和、定时和安全 性。4.英特网为应用层提供了两个运输层协议:UDP和TCP。5.TCP服务模型包括面向连接服务和可靠数据传输服务。TCP协议还有拥塞控制机制,这种服务不一定能为通信进程带来直接好处,但能为英特网整体带来好处。6.UDP是一种不提供必要服务的轻量级运输协议,UDP是无连接的也提供不可靠数据传输服

2021-12-11 10:59:44 1893

原创 LeetCode第241题:为运算表达式设计优先级

给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。示例 1:输入: “2-1-1”输出: [0, 2]解释:((2-1)-1) = 0(2-(1-1)) = 2示例 2:输入: “23-45”输出: [-34, -14, -10, -10, 10]解释:(2*(3-(45))) = -34((23)-(45)) = -14((2(3-4))5) = -10(2((3-4)

2021-12-08 20:22:23 175

原创 LeetCode206题:反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例 1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例 2:输入:head = [1,2]输出:[2,1]示例 3:输入:head = []输出:[]/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() :

2021-12-06 14:04:50 252

原创 LeetCode第203题:移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]提示:列表中的节点数目在范围 [0, 104] 内1 <= Node.val <= 50

2021-12-03 20:56:13 59

原创 LeetCode第50题:Pow(x,n)

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。示例 1:输入:x = 2.00000, n = 10输出:1024.00000示例 2:输入:x = 2.10000, n = 3输出:9.26100示例 3:输入:x = 2.00000, n = -2输出:0.25000解释:2-2 = 1/22 = 1/4 = 0.25提示:-100.0 < x < 100.0-231 <= n <= 231-1-104 <= xn &lt

2021-11-23 17:11:03 205

原创 Leetcode第24题:两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4]输出:[2,1,4,3]示例 2:输入:head = []输出:[]示例 3:输入:head = [1]输出:[1]提示:链表中节点的数目在范围 [0, 100] 内0 <= Node.val <= 100进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)/** *

2021-11-22 21:21:38 75

原创 LeetCode第21题:合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例 1:输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]示例 2:输入:l1 = [], l2 = []输出:[]示例 3:输入:l1 = [], l2 = [0]输出:[0]提示:两个链表的节点数目范围是 [0, 50]-100 <= Node.val <= 100l1 和 l2 均按 非递减顺序 排列/** * Defin

2021-11-22 19:41:38 62

原创 LeetCode第二题:两数相加(递归解法)

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 = [9,9,9,9,9,9,9], l2 =

2021-11-22 19:20:38 138

原创 数据结构--递归算法

一、递归的定义递归算法(英语:recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。计算理论可以证明递归的作用可以完全取代循环,因此在很多函数编程语言(如Scheme)中习惯用递归来实现循环。二、递归的三要素在我们了解了递归的基本思想及其数学模型之后,我们如何才能写出一个漂亮的递归程

2021-11-19 19:56:16 1096

原创 最长回文字符串

最长回文字符串给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = “babad”输出:“bab”解释:“aba” 同样是符合题意的答案。示例 2:输入:s = “cbbd”输出:“bb”示例 3:输入:s = “a”输出:“a”示例 4:输入:s = “ac”输出:“a”#include<iostream>#include<vector>#include<string>class Solution {public:

2021-09-01 16:13:43 70 1

原创 归并排序。

归并排序归并排序(mergeSort)是建立在归并操作上的一种有效的排序算法,该算法采用分治法。将以有序的子序列合并,得到一个完全有序的序列,即:先使得每个子序列有序,再使得子序列段间有序。如果将两个有序表合成一个有序表,称为:二路归并。#include<iostream>using namespace std;void merge(int a[], int l, int mid, int r){ int b[100]; int i = l, j = 0, k = mid; wh

2021-05-22 14:37:13 79

原创 快速排序法

快速排序法1. 算法步骤从数列中挑出一个元素,称为 “基准”(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;递归地把小于基准值元素的子数列和大于基准值元素的子数列排序;#include<iostream>using namespace std;int partion(int a[],int m, int n){ int key = m;

2021-05-22 11:19:56 55

原创 希尔排序

希尔排序1. 算法步骤选择一个增量序列,很明显我们可以用一个序列来表示增量:{n/2,(n/2)/2…1},每次增量都/2按增量序列个数 k,对序列进行 k 趟排序;每趟排序,根据对应的增量 step,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。#include<iostream>using namespace std;int main(){ int a[10]; int n

2021-05-22 11:08:18 81

原创 插入排序法

插入排序法1. 算法步骤将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)2.时间复杂度分析最好情况是需要排序的序列基本有序,序列是递增的。这样的时间复杂度是O(n),最坏的情况是序列是递减的。这样的时间复杂度是O(n^2)#include<iostream>using namespace s

2021-05-22 10:16:57 139

原创 选择排序法

选择排序法1. 算法步骤首先在未排序序列中找到最小(大)元素,存放到未排序序列的末位置。重复第一步,直到所有元素均排序完毕。#include<iostream>using namespace std;int main(){ int a[10]; int n; int max,maxindex=0; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; // 61 17 29 22 34

2021-05-22 09:42:59 59

原创 冒泡排序法

冒泡排序法1. 算法步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。#include<iostream>using namespace std;int main(){ int a[10]; int n; int temp; cin >> n;

2021-05-22 09:19:10 64

原创 最大字段和

最大字段和C - 顺序表应用7:最大子段和之分治递归法Description给定n(1<=n<=50000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-

2021-04-17 10:58:34 150

原创 c++分治算法解决众数问题

众数问题Description给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={1,2,2,2,3,5}。多重集S的众数是2,其重数为3。对于给定的由n 个自然数组成的多重集S,计算S的众数及其重数。如果出现多个众数,请输出最小的那个。Input输入数据的第1行是多重集S中元素个数n(n<1300000);接下来的n行中,每行有一个最多含有5位数字的自然数,。Output输出数据的第1行给出众数,第2行是重数。Sampl

2021-04-12 18:35:26 4307 1

原创 用C语言栈实现进制转换

#include<stdio.h>#include<stdlib.h>#include<windows.h>#define MAXSIZE 100typedef struct //定义栈的结构体{int data[MAXSIZE];int top;}Se,*Pe;Pe begin(); //栈的初始化void ru(Pe S,int x); //入栈函数P

2020-10-19 11:36:11 3658 3

空空如也

空空如也

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

TA关注的人

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