自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 资源 (1)
  • 收藏
  • 关注

原创 C++实现优先级队列模板类

1. 优先级队列1.1 基本原理仿照C++ STL 中的优先级队列priority_queue,主要实现以下功能:向队列中添加元素后,队列自动调整,保证队列中优先级最高的元素在队列头部(优先级可以定义比较函数,按照大小或者其他条件决定); 每次出队元素是队列中优先级最高的,因此优先级队列不满足先进先出的原则,而是根据每次都是优先级最高的先出。优先级队列ADT的API如下: 方法名 功能 push() 添加一个元素

2021-03-12 15:45:46 673

原创 操作系统——进程调度

进程调度的目的:在进程间切换CPU,最大化CPU利用率,通过操作系统的调度使得计算机资源分配和使用更加高效。1. 基本概念1.1 CPU-I/O执行周期进程的属性:进程执行包括周期进行CPU执行和I/O等待。据此可以将程序分为CPU密集型程序和I/O密集型程序。CPU密集型程序一般只有少量长CPU执行;I/O密集型程序一般具有大量短CPU执行。1.2 CPU调度程序(CPU scheduler)CPU空闲时,操作系统从就绪队列中选择一个进程来执行,进程选择采用短期调度程序(short

2021-01-27 11:45:21 5868 2

原创 操作系统——进程状态

进程从创建到执行,再到执行完毕销毁的过程中,经历了不同的进程状态,进程状态部分取决于进程当前的活动,可以将进程状态分为(1)三状态模型;(2)五状态模型;(3)七状态模型。1. 三状态模型包含进程三个最基本的状态:就绪态:进程具备运行条件,等待分配处理器; 运行态:进程占有处理器,正在运行; 等待态:进程等待发生某个事件。其中:①就绪态->运行态:CPU空闲时,调度程序选择一个就绪进程运行;②运行态->就绪态:进程运行时间片到,或出现更高优先级进程,当前进程失去..

2021-01-26 20:48:38 1396

原创 C++——多线程

目录1. 线程创建1.1 创建函数作为线程工作函数1.2 创建匿名函数作为线程工作函数1.3 类成员函数作为线程工作函数2. 线程互斥2.1 使用mutex进行线程互斥2.2 使用lock_guard和mutex实现线程互斥3. 其他功能函数3.1 join和detach3.2 线程暂停3.3 赋值运算符1. 线程创建1.1 创建函数作为线程工作函数新建一个工作函数作为线程工作函数,然后在后面跟上工作函数的传入参数,如下:#include .

2020-09-04 10:56:56 379

原创 数据结构与算法——常见排序算法写成模板,新建命名空间打包带走

1. 前文汇总前面陆陆续续总结过常用排序算法,如下:数据结构与算法——快排序数据结构与算法——插入排序C++——归并排序,从固定数据类型到函数模板以及使用函数对象自定义递增/递减数据结构与算法——插入排序——使用C++实现函数模板、数据结构与算法——希尔排序数据结构与算法——选择排序2. 常用排序算法整理将常用的排序算法进行了实现,写成了模板,并放在了一个命名空间下面。包括插入排序,选择排序,希尔排序,快排序,堆排序和归并排序。需要注意的就是模板的特化,不能将模板函数

2020-09-03 14:43:28 219

原创 设计模式——单例

1. 懒汉式单例懒汉式单例在第一次被使用的时候才会进行实例化。1.1 单线程的懒汉式单例#include <iostream>using namespace std;class Singleton {private: Singleton() { cout << "Construct called!" << endl; } Singleton(Singleton&) = delete; Singleton& operator=(co

2020-09-03 11:46:08 96

原创 数据结构与算法——并查集(Union-Find)

1. 原理/概念并查集(Union-Find)主要用来解决无向图的【动态连通性】问题,对于无向图的连通,一般具有如下几个性质:自反性:节点p和 p 是连通的; 对称性:如果节点 p 和节点 q 连通,那么节点 q 和 p 也是连通的; 传递性:如果节点 p 和 q 连通, q 和 r 连通,那么 p 和 r 连通。本文参考一个大神labuladong的算法小抄:Union-Find算法详解,主页在这。注意,并查集只能用来解决无向图的连通性的问题,如果是有向图,要找其强连通分量,需要用t..

2020-09-03 10:44:37 436

原创 剑指 Offer(39):数组中出现次数超过一半的数字

1. 题目描述2. 题目理解方法1:哈希表记录元素出现次数最直观,最容易想到的,就是记录数组中每个元素的个数,使用哈希表(unordered_map)来记录数组中不同元素出现的次数。然后出现次数大于数组长度一半的那个元素就是要找的元素了。这个思路实现起来比较简单,时间复杂度O(n),空间复杂度O(n)。方法2:基于快排的思想快排每轮定位一个元素的位置,然后通过该元素的位置与数组中间位置进行比较,决定下一轮快排的区间。直到定位的那个元素刚好落在数组的中间位置。方法3:摩尔投票数

2020-08-24 11:10:23 165

原创 剑指offer(47):礼物的最大价值

1. 题目描述2. 题目理解典型的动态规划问题,直接看状态数组的定义:状态数组:dp[i][j]表示从起始位置到(i,j)能获得的最大的价值。状态转移方程:dp[i][j] = grid[i][j] + max( dp[i-1][j], dp[i][j-1] )就是,在当前grid[i][j]所能获得的最大价值=上一个位置所能获得的最大价值+当前位置的价值,其中上一个位置可以是在当前位置的正上方,也可以是当前位置的左边。base case:就是在矩阵的最上一条边和最...

2020-08-23 15:11:46 99

原创 剑指offer(46):把数字翻译成字符串

1. 题目描述2. 题目理解最先想到的可能是递归,从第一个数字开始翻译,然后判断前两个数字能不能合并一起翻译,然后一直递归下去。用递归的话势必会存在重叠子问题,存在重叠子问题的话,可以用备忘录来进行剪枝。递归从最大的问题开始自上而下解决问题,我们也可以从最小的子问题开始自下而上解决问题了,这样可以消除重复问题。重叠子问题想到动态规划,是一个比较顺的思路了,我们从最小的子问题开始,就是从num的最后,对应的是dp[len-1]。动态规划,状态数组定义:dp[i]表示从num[i]到结尾

2020-08-23 14:58:37 141

原创 数据结构与算法——选择排序

1. 选择排序的基本原理原理详解可以参考浙大的数据结构与算法。简单说选择排序的思想就是:选择排序每趟遍历未排序的序列,从其中选出一个元素(升序就选最小的,降序就选最大的),将其与无序区最前面的元素交换,使得有序区元素个数+1,无序区元素个数-1。这样每趟遍历可以从无序区中挑一个元素放到有序区中,直到最后无序区中元素个数为0.2. C++实现选择排序原理比较简单,这里就直接贴代码:选择排序功能函数:/** * @brief 选择排序主函数,提供通用的外部接口 * @param[i

2020-08-04 14:37:02 190

原创 数据结构与算法——希尔排序

1. 希尔排序基本原理原理详解可以参考浙大的

2020-08-01 13:31:22 292

原创 数据结构与算法——插入排序——使用C++实现函数模板

1. 插入排序原理插入排序是最基本的排序算法,之前写过一篇文章实现插入排序,不过是用的C语言+函数指针,使得用户可以自定义升序排序还是降序排序。现在考虑使用C++,将该算法做成一个函数模板。2. 将排序算法做成函数模板几个关键字:【函数模板】,【函数对象】,【匿名函数】,【友元函数】。对于基本数据类型,构建函数模板比较简单,排序的比较也可以直接用STL里面的less和great函数对象。对于自定义类型的数据,需要实现自定义类型对象的比较,可以1)重载比较运算符,less重载"<"运

2020-07-31 21:25:55 922

原创 C++——归并排序,从固定数据类型到函数模板以及使用函数对象自定义递增/递减

1. 归并排序几个高级排序算法之一,具体原理可以参考这个视频:归并排序算法讲解。基本原理就是使用分治的思想,将数组不断二分,分割成单个元素,然后从单个元素开始两两合并,将两个有序的数组片段合并为一个新的有序片段。最后将整个数组归为有序。基本步骤:将数组不断二分,分割成只包含单个元素的片段; 对分割之后的片段进行两两合并,将两个片段合并为一个有序的大片段,最底层是对于单个元素的片段进行合并,单个元素肯定有序,合并只需要根据两个元素的大小进行片段的重排。需要使用额外的内存空间保存两个子片段,然后在

2020-07-26 16:51:47 340

原创 C/C++——字符串分割(strtok, strtok_s)

1. 使用strtok分割字符串strtok()函数的原型如下:char *__cdecl strtok(char *_String, const char *_Delimiter)strtok()函数接收两个传入参数,将_String中保存的字符串(待处理字符串),按照_Delimiter中的字符作为分隔符进行分割。如果_String为空,则函数内部保存的SAVE_PTR指针在下一次调用中将作为起始位置。其实这就说明在函数strtok()内部使用了一个静态变量SAVE_PTR指针,用以记

2020-06-21 15:07:02 26066 5

原创 C++——list(线性双向链表)

1. 基本概念list也是C++ STL中提供的一种容器,是线性的双向链表的数据结构。拥有链式结构的特征:支持元素的快速插入和删除,但是元素随机访问较慢(相较于vector容器),不提供[]运算符的重载。C++中使用list容器需要包含头文件<list>,把list当做双向链表来看,可以记住list的常用操作,如下:push_back():添加元素到list尾部。 push_back():添加元素到list头部。 pop_back():从list尾部删除元素。 pop_front(

2020-06-09 18:32:10 1378

原创 C++——string类

1. string类1.1 基本概念string是C++ STL 中定义的标准类,与C语言中的字符数组(char[])类似,但是有更完善的API,使用更加便捷。C++中使用string类,要引用头文件<string>。1.2 string的构造string有好几个构造函数,使用方式如下: string str1; //不初始化,默认为空 string str2("Hello"); //使用字符串"Hello"初始化,str2中内容为"Hello" s

2020-06-05 19:04:11 285

原创 C++——优先级队列(priority_queue)

1.优先级队列(priority_queue)1.1 基本概念之前已经提到了队列(queue),队列是一种先进先出(First in First out,FIFO)的数据类型。每次元素的入队都只能添加到队列尾部,出队时从队列头部开始出。优先级队列(priority_queue)其实,不满足先进先出的条件,更像是数据类型中的“堆”。优先级队列每次出队的元素是队列中优先级最高的那个元素,而不是队首的元素。这个优先级可以通过元素的大小等进行定义。比如定义元素越大优先级越高,那么每次出队,都是将当前队.

2020-06-04 17:26:39 26687 4

原创 C++——双端队列(deque)

1. 双端队列(deque)双端队列(deque)是队列的一种变形,一般队列只能在队尾添加元素(push),在队首删除元素(pop),双端队列则同时在队首或者队尾执行添加和删除工作。C++中,使用双端队列需要包含头文件<deque>。C++中队列的基本操作如下:push_back():在队列尾部添加元素,无返回值。这个操作跟普通队列(queue)的push()方法类似,在队列的尾部添加一个元素; push_front():在队列头部添加元素,无返回值; pop_back():删除队列

2020-06-03 22:31:44 14890 1

原创 C++——队列(queue)和栈(stack)

1. 队列(queue)队列是一种先进先出(First in First out,FIFO)的数据类型。每次元素的入队都只能添加到队列尾部,出队时从队列头部开始出。C++中,使用队列需要包含头文件<queue>。C++中队列的基本操作如下:push() :入队。在队列尾端添加一个元素,无返回值; pop() :出队。将队列头部元素删除(出队),无返回值; front() :获得队列头部元素。此函数返回值为队列的头部元素,常与pop()函数一起,先通过front()获得队列头部元素,然

2020-06-01 18:44:01 4225 2

原创 LeetCode(46):全排列

1. 题目描述2. 题目理解看到这道题,就是典型的“回溯”问题,可以使用回溯算法来解决。回溯也是递归的过程,这里写了一下回溯算法的简单框架://回溯算法的框架void backTrack(最终结果(res),子结果(subRes),选择列表){ if(满足结束条件)结果中新增该项; for(遍历选择列表){ if(该项选择已经被包含在subRes中)continue; 将该选择项包含在子结果中; backTrac

2020-05-29 12:22:26 213

原创 操作系统原理——死锁

1. 基本概念1.1 死锁、活锁,与饥饿死锁(Deadlock)在多道程序设计系统中,一组进程的每一个进程均无限期地等待被该组进程中的另一个进程所占有且永远不会释放的资源,这种现象称系统处于死锁状态,简称死锁。当死锁发生后,死锁进程将一直等待下去,除非有来自死锁进程之外的某种干预。活锁(Livelock)前提条件:当进入临界区互斥的时间很短,而阻塞等待的时间开销很大,那么在某种情况下,可采用轮询(忙等待)原语进入临界区或存取资源。在这种情况下,如果两个进程A和B,都需要两个资源1和2,当

2020-05-28 12:06:39 767

原创 C语言——多线程基础(pthread)

目录1. 线程的定义以及线程的创建1.1 线程和进程的概念1.2 使用pthread_create()函数创建进程2.使用pthread_join()等待线程结束2.1 使用pthread_join()等待线程结束2.1 使用pthread_join()得到线程函数的返回值1. 线程的定义以及线程的创建1.1 线程和进程的概念线程:进程中的一个实体,是CPU调度和分派的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存..

2020-05-27 15:15:24 25105 4

原创 数据结构与算法——03-树1 树的同构(浙大陈姥姥《数据结构与算法》)

1. 题目描述给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N(≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母..

2020-05-26 15:11:15 417

原创 LeetCode(204):计算质数

1. 题目描述2. 题目理解题目看着很简单,最先想到的就是做一个判断是不是质数的函数(isPrim),然后对n以内的正整数做个遍历,判断是质数的话,计数器count++,最傻瓜的代码如下:int isPrime(int n);//该函数用来判断传入参数是不是质数,是:返回1;不是:返回0int countPrimes(int n){ int cnt=0; for(int i=1;i<n;i++){ if(isPrime(i))cnt++; }

2020-05-26 10:02:59 638

原创 LeetCode(105):从前序与中序遍历序列构造二叉树

1. 题目描述2. 题目理解前序遍历数组的首元素一定是当前子树的根节点。根据这一性质,找到当前子树的根节点,然后查找该节点在中序遍历数组中的位置,可以得到当前根节点左子树中元素的个数。将中序遍历按照根节点分为左右两部分,对应左右子树的中序遍历;同时将前序遍历按照根节点以及根节点左子树中元素的个数,也分成左右两部分,对应左右子树的前序遍历。按照以上思路,用递归的方式可以构造出整个树。3. 代码3.1 C语言代码/** * Definition for a binary tree

2020-05-25 11:16:05 129

原创 数据结构与算法——03-树2 List Leaves(浙大陈姥姥《数据结构与算法》)

1. 题目描述Given a tree, you are supposed to list all the leaves in the order of top down, and left to right.Input Specification:Each input file contains one test case. For each case, the first line gives a positive integerN(≤10) which is the total num..

2020-05-24 09:32:01 272 1

原创 数据结构与算法——插入排序

还是先上算法视频讲解:浙大——数据结构与算法(插入排序)1. 算法实现插入排序作为简单排序的一种,可能是每个人天生就会的算法(谁还没打过扑克牌呢?),就想打扑克整牌的时候,将最小的牌一般会放在手中最左边,一手牌就是个升序排序的过程。直接贴算法://插入排序算法,升序算法void insertSort(int* arr,int num){ int i,j; for(i=1;i<num;i++){//从位置1开始,到数组的最后 int tmp=arr[i];

2020-05-21 11:57:27 206

原创 数据结构与算法——快排序

先上浙大陈姥姥的视频连接,我觉得看这个视屏讲的很好。浙大数据结构与算法——快排序原理部分还可以参考《大话数据结构》程杰【著】。1. 算法实现单看陈姥姥的视频,算法实现的伪码描述部分有一点点问题,照着写程序的话会出问题。就是这里for(;;)循环,有点问题是,如果for(;;)跳出之后,此时i可能大于right-1,这样会造成错误,因此最外层的swap应该判断一下i和right-1的大小。代码如下:快排序主函数,提供通用的外部接口。//快排序主函数,提供通用的外部接口void QS

2020-05-20 17:46:44 180 3

原创 C语言——函数指针

1. 函数指针概念1.1 函数指针的声明类似变量在内存中会分配一个空间,函数在内存中也会分配一个空间,这个空间的入口(或者叫首地址)称为函数的地址。用整型指针可以保存整形变量的地址,同样地,用函数指针可以保存函数的地址。我们回顾一下怎么定义一个整型指针:int *p_int;由于整型变量只需要定义变量的类型即可完全规定这个变量的格式(个人理解,变量声明限定了变量的格式,变量定义规定了其内容)。但是对于一个函数来说(将函数也看成一种复杂的变量),函数的格式由哪些东西唯一确定呢?函数返回值

2020-05-20 10:20:25 2740 1

原创 数据结构与算法——链表

1. 线性单链表1.1 抽象定义 类型名 链表。类型属性存储一些列项,运行时确定大小,支持元素的快速插入和删除。类型操作读取任意节点元素;在任意节点位置插入元素;删除已有节点元素;清空整个链表。1.2 代码实现1.2.1 接口定义如下,接口定义在linklist.h文件中://文件名:Linklist.h //主要作用:定义链表的数据接口 #ifndef _LINKLIST_H_#define _LINKLIST_H_#include <

2020-05-17 16:31:57 410

原创 KMP模式匹配算法

1. 从朴素的模式匹配算法讲起基本问题:从主串S中,找到T这个字串的位置。例如:主串S:“goodgoole”,字串T:“goole”,得到结果T在S出首次出现的位置在S起始字符开始第五个字符。这种字串定位问题称为“串的模式匹配”朴素算法思路最简单,就是每次从S的第i个字符开始比较,判断S中第i+j字符是否与T中第j个字符相等,相等的话j++,直到i+j超过S的长度或者j超过T的长度,然后返回(i+j超过S的长度:返回-1,表示主串中不存在字串;j超过T的长度:返回I,表示主串中子串的初始位

2020-05-10 14:30:52 209

原创 中断处理函数注意事项

中断服务函数由硬件触发,因此不能获得参数,也无法返回值;另一方面,在中断服务函数中使用不可重入的函数,往往会导致问题。

2020-05-09 11:49:24 9180 4

原创 C语言——整型和浮点型混合运算

1. int和double混合运算C语言int和double混合运算时,会自动将int类型的数据转换为double类型的数据,最后得到的结果也是double类型。如下例:double a=4.0/9.0;int b=9*a;//b=3,因为double类型的4.0/9.0的值要小于4.0/9.0的实际值(考虑到有效位数有有限的)上面代码中,b=3,因为double类型的4.0/9.0要小于4.0/9.0的实际值,这是由于浮点型有效位数的限制造成的,所以9*a的值要小于4,赋值给int类型的时

2020-05-08 21:39:53 28243 3

原创 数据结构与算法——平衡二叉树(AVL树)

1.平衡二叉树(AVL树)1.1 定义平衡二叉树(Self-Balancing Binary Search Tree,Height-Balancd Binary Search Tree),是一种二叉排序树,其中每个节点的左子树和右子树的高度差不超过1.有两名俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年共同发明了一种解决平衡二叉树的算法,因此平...

2020-05-07 21:08:06 601

原创 C语言——const关键字

1. const关键字的作用const创建只读变量; 对函数形参使用const以保护数据; const与指针; 非const指针转换为const指针。1.1 const创建只读变量记住一点:const创建的不是常量,而是只读变量,相当于给变量赋予了常量的属性。C语言一般只有(1)字符常量;(2)#define宏定义的常量;(3)enum枚举常量。下面的代码验证了const定义的...

2020-05-07 20:56:43 260

原创 C语言——预处理器指令(#define)

1. 明示常量#define使用#define定义明示常量,例如:#define TWO 2 //可以使用注释#define PI 3.1415923 //定义PI#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL //定义一年有多少秒(不考虑闰年)上述宏被称为“类对象宏”,其定义的语法如下:#define PI...

2020-05-06 22:16:46 881

原创 线程同步——信号量

参考学习资料:进程线程互斥与同步1.信号量mutex初始化后为0;上锁后+1,解锁后-1;mutex只能串行。信号量可以并行,运行多个线程同时访问共享资源。1.1 头文件#include <semaphore.h>1.2 变量类型//类型名 变量名sem_t sem;1.3 主要函数(1)初始化信号量sem_init(sem_t* s...

2020-05-06 11:08:52 460

原创 线程同步——条件变量

1 条件变量】使用读写锁、互斥锁可以阻塞线程,使对临界代码的操作变为原子操作。其临界区代码只有两种状态,锁定和非锁定。而如果需要外部的条件判断之后才执行某些临界区代码,比如经典的生产者-消费者模型,生产者和消费者对资源的使用时互斥的,但是消费者对资源的使用还有一个前提就是资源不为空,但是这个判断互斥锁没法实现。因此需要使用条件变量,在消费者进入临界区并被告知当前无可用资源的时候,阻塞消费者...

2020-05-06 10:08:22 169

原创 线程同步——读写锁

参考学习资料:进程线程互斥与同步1. 读写锁1.1 读写锁变量pthread_rwlock_t lock; (一个变量是一把锁)读写锁使用时,一个变量是一把锁。1.2 读写锁类型读锁:对内存做读操作; 写锁:对内存做写操作。1.3 读写锁的特性线程A加读锁成功,又来了三个线程,做读操作,可以加锁成功。(读共享 - 并行处理) 线程A加写锁成功,又来了三个线程,做...

2020-05-06 09:35:19 349

Using Kalman Filter for Object Tracking.rar

MATLAB中单目标跟踪说明文档创建的程序(.m文件),翻译了部分英文注释,并添加了部分注释,程序可直接运行,可以保存结果视频。

2020-04-22

空空如也

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

TA关注的人

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