自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(149)
  • 资源 (2)
  • 收藏
  • 关注

原创 c++ 数据结构之 线段树

线段树是一种数据结构,是一种二叉树。线段树将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。线段树对于区间求和等区间操作能够实现复杂度为O(logn)的操作,故得以广泛利用。修改一个值的操作也是O(logn)。 线段树是建立在线段基础上,每个结点都代表了一条线段[a,b]。长度为1的线段称为元线段。非元线段都有两个子结点,左结点代表的线段为[a,...

2020-02-17 20:12:59 1592

原创 字符串 kmp算法解析

kmp算法是用于解析字符串匹配的问题。给定两个字符串:第一个是文本串str,第二个是匹配串p。问str中最早有那个位置能完全和匹配串p匹配呢?1. 暴力匹配假设文本串的长度为n,匹配串的长度为m. 那么显然有一种暴力解法是:int match(string str, string p){ int i = 0; int j = 0; while (i < str.size(...

2020-02-03 13:41:53 388

原创 C++简单实现 前缀树

今天在leetcode上面看了一道题(第208题),问题是如何实现一个字符串前缀树,能够实现字符串的插入,查找和查找前缀功能。在这里记录一下前缀树的实现:class Trie {public: /** Initialize your data structure here. */ Trie() { isEnd = false; for (int i = 0; i < 26...

2020-02-01 19:54:44 505

原创 docker 容器和镜像的区别

总的来说,镜像是一个包含程序运行代码和必要环境的只读文件,而container更像是头镜像的一个运行态。当程序员进行开发的时候,docker file是程序员开发的东西,docker镜像作为开发结束的交付形态,docker容器则是部署时候的运行态。 首先我们看一下镜像。镜像可以看作一个文件系统,不含有运行时候的动态数据,内容也不会改变。镜像就是一堆只读层的堆叠:...

2020-01-10 23:29:44 1878 1

原创 函数指针以及在类成员函数中应用函数指针

什么是函数指针如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的。例如:in...

2019-10-31 22:46:26 515

原创 哲学家就餐问题

哲学家就餐问题是一个典型的多线程死锁问题。有五个哲学家一起思考和吃饭,他们五个人围着一个圆桌坐着,每个人左边和右边都放着一只筷子(每只筷子也可以看成被左右两个哲学家所共享),如下图所示:每个哲学家先思考,饿了之后要吃饭。约定:每个哲学家必须拿到左右两只筷子才能吃饭;每个哲学家拿到了筷子,除非吃完饭,否则不会放弃手中的筷子。首先我们来看一个基础的想法:因为是五位哲学家,...

2019-10-14 22:49:35 1203

原创 死锁避免算法--银行家算法

银行家算法算法思想银行家算法:银行家算法是从当前状态出发,按照系统各类资源剩余量逐个检查各进程需要申请的资源量,找到一个各类资源申请量均小于等于系统剩余资源量的进程P1。然后分配给该P1进程所请求的资源,假定P1完成工作后归还其占有的所有资源,更新系统剩余资源状态并且移除进程列表中的P1,进而检查下一个能完成工作的客户,......。如果所有客户都能完成工作,则找到一个安全序列,银行家才是...

2019-10-14 20:00:03 512

原创 I/O: 阻塞非阻塞I/O 同步异步I/O

我们知道,在Linux(UNIX)操作系统中,共有五种IO模型,分别是:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动IO模型以及异步IO模型。同步IO模型阻塞IO模型我们钓鱼的时候,有一种方式比较惬意,比较轻松,那就是我们坐在鱼竿面前,这个过程中我们什么也不做,双手一直把着鱼竿,就静静的等着鱼儿咬钩。一旦手上感受到鱼的力道,就把鱼钓起来放入鱼篓中。然后再钓下一条鱼。映射到L...

2019-10-09 22:57:57 199

原创 函数宏定义 与函数自定义

为什么在C语言中要有函数宏定义这种形式呢?宏定义可以帮助我们防止出错,提高代码的可移植性和可读性等。  在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义。那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍。  我们来看一个例子,比较两个数或者表达式大小,首先我们把它写成宏定义:  #define MAX( ...

2019-10-06 23:04:26 1877

原创 C++中对象初始化赋值是否需要调用operator=函数

一般对于初始化类变量有两种方式:A a;A b = a;另一种方式是:A a ;A b;a =b;对于第一种方式,编译器相当于在b的初始化的时候,用a的引用作为复制构造函数的参数进行操作,相当于A b(a);而对于第二种方式,则应该是用了赋值构造函数,也就是=的重载。因为a和b本身都已经重载了,就相当于把b的值赋给a了。比如代码如下:class mytest{...

2019-09-25 20:29:43 314

原创 PETERSON互斥算法解析

对于互斥算法,主要有两种,一种是DEKKER算法,另一种是PETERSON算法,这一篇主要来说PETERSON算法。相比于DEKKER算法,PETERSON算法也解决了互斥访问问题,并且不需要像DEKKER算法一样强制轮流访问,可以正常的顺序进行工作,它的原理如下://进程ienter_region(i);//这个函数用于判断和决定进程i什么时候能进入临界区临界区leave_reg...

2019-09-19 10:34:35 3587 3

原创 Dekker互斥算法解析

引入Dekker互斥算法解决的是多进程访问一个临界区的保护问题和“after you”问题。我们首先来看,两个进程访问一段临界区的互斥问题://P进程如下:pturn = true;while(qturn);//临界区的资源pturn = false;//q进程如下:qturn = true;while(pturn);//临界区的资源qturn = fals...

2019-09-18 23:06:29 1410

原创 缓存淘汰算法 LRU

LRU(least recent used)算法,指的是最近最少访问淘汰算法,是内存不够的场景下,淘汰旧内容的策略。当内存中发生缺页异常的时候,需要从磁盘中读出最新的一页,那原来的一段时间内最少被访问的那一页就需要被替换掉。如何自己实现一个LRU队列,给定队列的容量,使之在常数时间内就能实现插入新的一页,删除最少访问的一页等操作呢?我们用基于hashmap和双向链表的方法:如上图所示:...

2019-09-18 16:47:21 171

原创 操作系统 虚存管理

把内存与外存有机的结合起来,从而得到一个容量很大的“内存”,这就是虚拟内存。可以分成按需取页和按需取段两种方式。基本原理:在程序装入时,不必将其全部读入到内存,而只需将当前需要执行的部分页或段读入到内存,就可让程序开始执行。在程序执行过程中,如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页或段调入到内存,然后继续执行程序。另一方面,操作系统...

2019-09-18 15:56:36 833

原创 段页式存储管理

内存管理有三种:页式管理,段式管理和段页式管理。1. 页式管理页式管理是用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个实际的物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。每个物理块的大小一般取2的整数幂。内存的所有物理块从0开始编号,称作物理页号。程序的各个逻辑页面从0开始依次编号,称作逻辑页号或相对页号。每个页...

2019-09-18 15:44:12 1189

原创 排序算法之 桶排序

桶排序假设输入数据服从均匀分布,而且需要已知待排序列的大概范围,是一种空间换时间的排序算法。桶排序的基本思想是:桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数...

2019-09-18 13:56:33 238

原创 TCP的三次握手四次挥手

1、TCP通信TCP是面向连接的协议。运输连接是用来传送TCP报文的,而运输连接的建立和释放是每一次面向连接的通信中必不可少的过程。可以类比传统的电话网,拨通号码,开始通话,挂断电话。用户进程和服务器进程需要完成一次通信都需要完成三个阶段:连接建立 数据传送 连接释放TCP协议中,主动发起请求的一端称为客户端,被动连接的一端称为服务端。由于全双工,不管是客户端还是服务端,TCP连接建...

2019-09-18 13:08:54 321

原创 AMR编码文件解析

一、AMR简介基于新的网络和新的要求,无论是从节省传输频带资源,还是保持线路通信的高效率等方面来看,研究采用各种可变速率语音编码技术的系统都有重要意义。目前为了适应此需要提出了AMR(Adaptive Multi-rate) 的概念,即自适应多速率语音编码器,主要用于移动设备的音频,压缩比比较大,但相对其他的压缩格式质量比较差,由于多用于人声通话。AMR又分为两种,一种是...

2019-09-17 17:22:44 1831

原创 H.265编码和H.264编码的区别

目前很多摄像机采用了H.265的编码标准,H.264编码的摄像机逐渐减少,为什么H.265会流行?H.264和H.265有何不同?一、什么是H.265H.265是ITU-TVCEG继H.264之后所制定的新的视频编码标准。H.265标准围绕着现有的视频编码标准H.264,保留原来的某些技术,同时对一些相关的技术加以改进。新技术使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的...

2019-09-17 14:50:18 36166 1

原创 操作系统 多线程之优先级翻转

优先级反转,是操作系统调度进程时出现的一种错误。是指在使用资源的时候时,可能会出现的这样一种不合理的现象,即:高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。-- 从现象上来看,好像是中优先级的任务比高优先级任务具有更高的优先权。具体来说:当高优先级任务正等待信号量(此信号量被一个低优先级任务拥有着)的时候,一个介于两个任务优先...

2019-09-14 21:15:09 411

原创 操作系统中阻塞和挂起的区别和联系

阻塞和挂起是操作系统的进程的状态描述,容易混淆。阻塞:正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般将这种状态称为阻塞状态。挂起:由于系统和用户的需要引入了挂起的操作,进程被挂起意味着该进程处于静止状态。如果进程正在执行,它将暂停执行,若原本处于就绪状态,则该进程此时暂不接受...

2019-09-14 11:14:31 6195 2

原创 进程和线程的区别

首先什么是进程?进程是具有独立功能的程序关于某个数据集合的一次运行活动,进程是CPU进行资源分配的最小单位。什么是线程?线程可以看作进程中的一个运行的实体,是CPU进行调度的单位,可以看作是一个轻量级的进程。他们的区别如下:①从定义上就能看出,进程是资源分配的最小单位,线程是CPU调度的最小单位。不同进程之间是不能共享数据和资源的,因为每个进程在创建的时候会分配独立的地址空间。而线程之...

2019-09-13 15:48:30 151

原创 牛客网 平衡二叉树

题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。话说这题有两种做法。首先平衡二叉树指的是:一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。所以直接来想的话,只要保证根节点的左右子节点都是平衡二叉树,并且两个子树的高度相差都是小于等于1就可以了。代码如下所示:class Solution {public: bool Is...

2019-09-07 20:06:00 234

原创 牛客网 丑数

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。话说这道题最直接的办法就是遍历每个数字,如果这个数字能被2,3,5除尽,那么就是丑数,否则就不是。但是显然会超时。所以用一个好的办法:排序队列。分析:一个丑数的因子只有2,3,5,那么丑数p = 2 ^ ...

2019-09-04 23:02:57 150

原创 C++ 最大堆最小堆与push_heap pop_heap

make_heap:根据不同参数生成大顶堆或者小顶堆,默认大顶堆。make_heap(_RAIter,_RAIter) 默认生成大顶堆make_heap(_RAIter,_RAIter,_Compare) _Compare有两种参数,一种是greater(生成小顶堆),一种是less(生成大顶堆)push_heap()是向堆中插入一个元素,并且使堆的规则依然成立push_heap(_R...

2019-08-25 15:04:51 4038 5

原创 牛客网 二叉搜索树与双向链表

题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。返回值应该是一个指向值最小节点的指针。思路:很明显,当中序遍历一个二叉搜索树的时候,结果就是由小到大遍历的。那么我们需要找一种方法能够持续连接中序遍历的时候的某个节点和它的下一个节点,从而形成双向链表。代码如下:/*struct TreeNode ...

2019-08-24 14:17:18 186

原创 牛客网 字符串的排列

题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。这道题我最开始的想法是递归,每次处理一个字符,然后将其存在一个字符串里面,当字符串到了指定的长度,就把它放在一个vect...

2019-08-23 19:05:41 245

原创 牛客网 正则表达式匹配

题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。这道题最开始我的分析思路有点偏差,重点在于如何分析这个“*”. 显然当一个一个字符读入的时候...

2019-08-20 15:50:15 346

原创 腾讯校园招聘笔试 2019-8-17 第四题 另一种解法

之前在博客https://blog.csdn.net/hanzhen7541/article/details/99710954中我们讨论了一种单调栈的解法,复杂度是O(nlogn)。那么实际上还有一种解法,用的是动态规划+二分查找。首先看一下题目:小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。小Q从第一栋一直走到了最后一栋,小Q从来没有看到过...

2019-08-19 15:58:31 1291

原创 最长上升子序列LIS 动态规划 二分查找算法

所谓LIS表示最长上升子序列,是面试的时候非常容易考察的问题。对于一个序列h1,h2,...hN,其中的子序列hi1,hi2,...hik,满足hi1<hi2<...<hik,那么这个子序列叫做上升子序列。那么如何求出最长的上升子序列呢?最容易想到的办法是动态规划,其中它的复杂度是O(n^2)。我们设置dp[i]表示从0~i之内最长的上升子序列的长度。那么对于任意的索引j(0...

2019-08-19 13:59:51 395

原创 upper_bound( )和lower_bound()的用法

lower_bound( )和upper_bound( )都是在排好序的数组中使用的。他们利用二分查找,以O(logn)的时间复杂度返回一个符合条件的索引值。下面进行解析:非重载的lower_bound( )和upper_bound( )用于在从小到大的排序数组中的查找:lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等...

2019-08-19 13:58:55 265

原创 腾讯校园招聘笔试 2019-8-17 第四题

小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。小Q从第一栋一直走到了最后一栋,小Q从来没有看到过这么多高楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)输入描述:输入第一行将包含一个数字n,表示楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表一栋楼的高度。...

2019-08-18 23:06:43 3105 4

原创 腾讯校园招聘笔试 2019-8-17 第三题

小Q在进行一场竞技游戏,这场游戏的胜负关键就在于能够能争夺一条长度为L的河道,即可以看作是[0,L]的一条数轴。这款竞技游戏当中有n个可以提供视野的道具-真视守卫,第i个真视守卫能够覆盖区间[xi,yi]。现在小Q想知道至少用几个真视守卫就可以覆盖整段河道。输入:输入包括n+1行。第一行包括两个整数n和L(1<=n<=10^5,1<=L<=10^9)接下...

2019-08-18 15:51:25 1645 1

原创 腾讯校园招聘笔试 2019-8-17 第五题

自己是真滴菜啊,跟着师兄做校招笔试被虐的体无完肤。在这里记录一下几道题的解法吧。由于业绩优秀,公司给小Q放了n天的假。身为工作狂的小Q打算在假期中工作、锻炼或者休息。他有一个奇怪的习惯,:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q每天只能干一件事。给出假期中的公司,健身房营业情况,求小Q最少需要休息几天。输入描述:第一行一个整数n...

2019-08-18 13:29:40 1660 2

原创 排序算法之 堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。什么是完全二叉树呢?可以看下这篇文章:https://blog.csdn.net/hanzhen7541/article/details/99437854所以说,堆排序是将数组当做完全二叉树、根据完全二叉树的特性来...

2019-08-16 17:16:54 210

原创 error:LNK2005 函数已经在*.obj中定义

出现上面的错误,只要原因有如下几个:1.头文件的重复包含包含的头文件中含有变量、函数、类的定义,在其他使用的地方多次包含,造成重复包含,产生LNK2005错误,有两种解决方法:1)使用宏 在头文件head.h中加入#ifndef HEAD_H_ //这个地方写法有不少#define HEAD_H_......#endif2)使用预编译,文件开头加入#pr...

2019-08-16 16:52:28 23748 3

原创 排序算法之 插入排序

所谓插入排序,是一种简单而稳定的排序方法。基本思想是:将序列分成有序组和无序组。每次从无序组中选择一个,以插入的形式放进有序组。知道无序组的数字被抽光,所得到的有序组就是最终的排序结果。代码实现如下:void insert_sort(int *array,unsigned int n){ int i,j; int temp; for(i=1;i<n;i++...

2019-08-15 22:29:30 98

原创 排序算法之 归并排序

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法。 该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。具体而言,是让每个小的子序列都有序,然后有序的合并这些子序列,从而得到一个整体有序的序列。对于归并排序,其时间复杂度是O(nlogn).因为每次都将其对半分,...

2019-08-15 21:55:21 122

原创 c++排序算法之 快速排序

快速排序由C. A. R. Hoare在1960年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序的序列。 复杂度分析:快速排序在最理想的情况下复杂度是O(nlogn),在最差的情况下是O(n^2)....

2019-08-15 20:54:15 156

原创 二分查找 递归与非递归实现

二分查找将一个有序数组查找的时间复杂度从O(n)降到了O(logn). 首先是最基本的二分查找:public int binarySearch(int[] arr, int target, int n){//n是数组总长度 int low = 0, high = n-1, mid; while(low <= high){ mid = low + (hig...

2019-08-15 14:12:40 221

精通Qt4编程

是给不方便买纸质书的同学的电子版阅读。完整且清晰,方便自学。

2017-10-17

C++ GUI Qt 4编程(第二版)

给不方便购买纸质书的同学们的电子版,完整且清晰,便于自学。

2017-10-17

空空如也

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

TA关注的人

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