- 博客(14)
- 收藏
- 关注
原创 二叉树的Morris遍历
二叉树的Morris遍历Morris遍历程序示例:Morris遍历实现二叉树先中后序遍历先序遍历中序遍历后序遍历Morris遍历Morris遍历就是用来遍历二叉树的一种算法,并且能够满足时间复杂度为O(N),额外空间复杂度为O(1)。算法的大致流程如下:使用一个指针cur,从二叉树的根节点出发遍历二叉树。直至cur指向空。判断cur是否有左子树:若没有左子树,直接让cur往右走(cur = cur->right)若有左子树,则找到左子树的最右结点。对最右结点进行判断若最右结点的右孩子为
2021-06-03 20:27:29
211
原创 单调栈 c++实现
单调栈 ---c++ 实现什么是单调栈,单调栈的作用单调栈原理数组无重复值时使用单调栈示例代码:数组有重复值时使用单调栈示例代码:完整代码演示:今天学了单调栈,然后自己用c++实现了一下什么是单调栈,单调栈的作用单调栈就是一个栈,并且栈内数据元素是从栈底到栈顶是单调递增或递减的。使用单调栈来解决求一个数组的每个元素的左边和右边离它最近的比它大的值。且时间复杂度为O(N),每个数仅仅入栈出栈1次。以下图为例:数组arr={5,4,6,7};L表示左边离下为i的数组元素最近比它大的值,R表示右边离下为
2021-06-01 22:19:35
1007
原创 Manacher算法
Manacher算法Manacher算法使用场景一般的求一个字符串的最长回文子串问题的方法Manacher算法详解Manacher算法使用场景Manacher算法用于解决求一个字符串的最长回文子串长度问题,且时间复杂度为O(N)。一般的求一个字符串的最长回文子串问题的方法Manacher算法详解...
2021-05-27 19:58:55
179
原创 KMP算法
KMP算法KMP使用场景一般的暴力方法KMP算法今天又学到了一个新的算法,KMP算法,是用来求子串的,即判断字符串str2,是否为字符串str1的子串。学过以后,自己总结一下,方便加深理解。KMP使用场景判断字符串str2,是否为字符串str1的连续子串。例如:str2 = “1234”,为str1=“ABC1234DE”的子串,但str3=“1234E”不为str1的子串。一般的暴力方法如下图:str1从i位置开始遍历,str2从0位置开始遍历。字符串str1从下标为i的位置一直遍历到下标为
2021-05-26 10:42:42
384
原创 linux系统7--线程同步
1.线程同步的概念所谓线程同步,就是多个线程同时访问同一资源,多个线程协同步调,先后处理某件事情。那么如何实现线程同步呢?就是利用"锁"来实现的。下图为实现线程同步的基本操作:如上图,线程在访问数据前必须加锁,加锁的目的是为了对线程进行阻塞,若锁已经被另外的线程锁上了,那么当前线程进入阻塞态,直到锁被打开,解除阻塞。若没有上锁,当前进行直接加锁。上图中,资源被线程1直接上锁,那么线程2就进入阻塞状态。直到线程1解锁,然后线程2解除阻塞,加锁。如此往复。2.锁综上所述,我们要使用线程同步,就必须使
2021-05-21 22:45:10
309
原创 跳表
今天花了差不多一天时间研究了一下跳表,参考帖子:https://blog.youkuaiyun.com/u013011841/article/details/39158585然后自己用c++写了一个跳表,如有不对还请纠正:#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include <time.h>using namespace std;#define MaxLevel 12//最大高度为12//构造一个跳表结点,属性包含:键值
2021-05-20 19:31:55
114
原创 排序算法汇总
排序算法汇总--c++实现1.三大基本排序1.1 冒泡排序1.2 选择排序1.3 插入排序2.希尔排序3.归并排序4.快速排序5.堆排序6.计数排序7.基数排序1.三大基本排序1.1 冒泡排序#include <iostream>using namespace std;int main(){ int arr[]={2,1,4,21,4,24,9,18}; int len = sizeof(arr)/sizeof(arr[0]); for(int i = 0;i < len
2021-05-18 15:31:38
347
原创 c++中的hash_map
c++中的hash_maphash相关哈希函数哈希表c++中的hash_map最近刷左神算法,hash_map经常被用到(hash_map的增删改查时间复杂度都能低至O(1))。但是左神用的都是java中的hash_map,苦于这个原因,只能自己研究一下C++中的hash_map。参考:https://blog.youkuaiyun.com/u010025211/article/details/46653519?utm_medium=distribute.pc_relevant_bbs_down.none-task
2021-05-14 23:21:41
6027
1
原创 Linux系统3---进程间通讯
Linux系统进程间通讯相关1.管道1.1匿名管道1.2有名管道为什么要实现进程间的通讯:因为进程都是相互独立的,但是在很多时候我们要完成一项任务需要进程之间是相互协调的(如,进程间的数据传输,数据共享,事件通知,资源共享和进程控制),这时我们就需要使用进程间通讯的技术。进程间常用的通讯方式有:管道,信号,信号量,共享映射区,本地套接字,消息队列1.管道管道的本质就是内核缓冲区,它是一个伪文件(不占用磁盘空间),如图:管道分为两部分:读端与写端,它们分别对应两个文件描述符,数据从写段流入,读端流出
2021-05-14 14:23:19
257
原创 Linux系统2--进程控制
linux系统的进程控制的一些函数1.fork()函数1.fork()函数函数原型 :pid_t fork(void);函数作用 :用于创建一个进程,所创建的子进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息;在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行初始化;如图:注意:当执行/a.out中有fork子进程时,shell进程将不知道a.out创建了子进程,因此在shell检测到父进程执行完毕后,shell会直接切换到前台。因此当父进程比子进程先抢到cp
2021-05-11 22:19:27
338
原创 Linux系统1----进程相关
Linux系统的进程相关进程相关的一些概念1.程序和进程2.并行与并发3.进程的五种状态及相互之间的关系4.关于PCB(进程控制块)进程相关的一些概念1.程序和进程程序:就是一个二进制文件,占用的是磁盘空间,没有运行进程:是一个启动的程序运行起来的程序与磁盘之间已经没有联系了所有的数据都在内存中需要占用更多的系统资源。如:CPU,物理内存等2.并行与并发并行:加入需要在1秒内处理n个进程,那么并行就是CPU将1秒分为n份。然后在一秒内处理这n个数据(CPU分时复用),如图:并发:并
2021-05-11 09:58:22
253
原创 哈夫曼问题
哈夫曼问题什么是哈夫曼树如何实现哈夫曼树参考:https://blog.youkuaiyun.com/qq_29519041/article/details/81428934http://c.biancheng.net/view/3398.html什么是哈夫曼树哈夫曼树,即最优二叉树,是一类带权路径长度最短的树所谓树的带权路径长度,就是树中所有的叶节点的权值,乘上其到根节点的路径长度(若根节点为0层,页结点到根节点的路径长度为叶节点的层数)。整个树的带权路径长度是从树根到每一结点的带权路径长度之和。怎么理解
2021-05-10 09:52:47
397
原创 数组相关2--小和问题的详解
数据结构与算法---c++实现数组相关--21.小和问题数组相关–21.小和问题问题描述:在一个数组中,每一个数的左边比当数小的数累加起来,称为这个数组的小和、例如:arr[] = {1,3,4,2,5};1左边比1小的数===》没有3左边比3小的数===》14左边比4小的数===》1,32左边比2小的数===》15左边比5小的数===》1,3,4,2故数组arr的小和为1+1+3+1+1+3+4+2 = 16根据题目意思,我们可以使用遍历的方式得到数组的小和,但是时间复杂度为O(N^
2021-05-09 20:03:58
333
原创 数组相关1--二分查找,递归的深入分析
数据结构与算法--c++实现数组相关1.二分查找法:因为写的东西很多,记在小本本上已经满足不了我的复习需求了,因此还是决定在这里整理一下(随着我的学习更新),方便以后的查看数组相关1.二分查找法:对于一个有序数组,采用二分的方式,查找数组中是否有待查找的元素。以数组arr[5]={4,7,9,12,21}为例。查找方法如下:·1.首先采用下标,将数组元素分为一半,arr中下标为0~4,因此首先按照 (0+4)/2 的方式将数组分为左右两部分,左部分为{4,7},右部分为{9,12 ,21}2.将
2021-05-09 15:00:22
318
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人