自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 线程安全(锁)

并发程序,多进程与多线程是会并发访问这些共享数据,为了避免多进程访问共享数据冲突,我们要学会资源访问互斥:锁,保证资源一个时刻内被一个线程访问。数据库自带锁机制。互斥锁等待队列:系统向某个线程发送标记,受到标记的线程等待唤醒。就近原则,如果线程释放资源后立即请求资源,系统会根据就近原则把资源分配给此线程。你叫早期的互斥锁,当锁被释放,所有等待锁的线程都被唤醒,而后争抢互斥锁。惊群问题,资源有限却将所有等待资源的单位唤醒,只有少数能得到资源,但是却有庞大的控制开销,需要系统承担。

2024-08-05 10:07:06 610

原创 线程(Pthread)

线程是大多数操作系统支持的调度单位,执行单元,某些系统不支持线程技术。一般情况下进程包含线程,线程比进程更轻量(体积更小,开销更小)。进程是最小的分配资源单位,线程是最小的调度单位。线程创建于进程中,于进程共享资源,完成特定任务,如果在意内存开销,使用多线程技术是一个很好的选择。进程创建时,系统分配内存资源,执行单元(默认),线程访问进程内存。线程就是寄存器和栈(线程可以占用时间片使用cpu,可以通过保存和恢复处理器现场避免寄存器冲突,所以线程是一个合格的调度单位)

2024-08-03 15:43:45 1189

原创 信号(SIGNAL)

信号的传递过程信号是Linux unix系统下经典的消息机制,系统利用信号完成处置进程(杀死与挂起)kill -l 查看系统下支持的信号1~31Unix经典信号(软件开发) 34~64自定义信号(驱动层开发) 32 33系统隐藏信号(NPTL)系统预留给线程使用。

2024-07-31 10:28:51 930

原创 进程间关系

所有孤儿进程结束后托管进程(upstart user可视化进程,在ubuntu14.04的版本为1init进程后续版本是init的子进程)负责处理这些僵尸进程,避免内存泄漏。亲缘关系主要体现于父子进程,子进程父进程创建,代码继承于父进程,父进程负责回收,子进程诞生至结束父进程全程参与,这种称为强亲缘关系。孤儿进程的危害是弹性的,取决于孤儿进程的工作,如果孤儿进程持续申请系统资源,危害较大。创建进程,组长不允许使用,组员进程可以set(getpid(),getpid()),组员申请组,组id是自己id。

2024-07-28 10:11:30 874

原创 进程间通讯(IPC)

可以利用这种技术完成多个进程间的数据传递,消息收发。有以下几种方式:匿名管道(pipe),有名管道(fifo),Posix消息队列,SystemV消息队列,MMAP内存共享映射,Signal信号,Socket套接字技术。绝大多数的进程间通讯技术都是利用内核层实现的(内核层共享内存)。

2024-07-26 23:31:51 591

原创 进程与进程函数

用户层->命令行参数(int argc char** argv),环境变量(系统默认),栈(0xc3000),库,堆,DATA(已初始化的全局静态变量),BSS(未初始化的全局数据),Text 代码段------------------------(概括一下就是:存储进程业务逻辑和任务数据)->映射机制,虚拟内存映射到物理内存,内存管理器有一个虚拟内存映射表。内核层(系统层)->PCB(进程控制块)pid-----------------------------(概括一下就是:存储进程信息)

2024-07-23 21:27:54 1007

原创 c++一些知识点

函数重载的特点:相同函数名,不同参数列表,返回类型不影响函数重载,一个类中定义了两个同名且参数列表也相同的函数,但其中一个是常成员函数也是函数重载,一个类中定义了两个同名且参数列表也相同的函数,但其中一个是静态成员函数。一个类对象可以包含虚函数列表的入口地址,不能包括静态成员属性,因为静态成员属性是类的属性,不是对象的属性,成员函数定义的变量是局部变量,类中虚函数成员函数的入口地址存在类的虚函数表中,而不是对象本身。即使子类定义了一个新的虚函数,而没有在基类中声明,该虚函数仍然会出现在子类的虚函数表中。

2024-07-15 19:37:05 315

原创 五种网络IO模型

首先我们了解一下文件描述符是什么:在linux下一切皆文件,进程是通过文件描述符(file descriptors)来访问文件的,。默认有三个文件描述符:0(标准输入),1(标准输出),2(标准错误)。再打开一个新的文件的话,它的文件描述符就++。

2024-06-06 13:53:21 571 1

原创 十个排序算法

稳定:排序前后相对位置未发生改变,保证多次排序结果相同,最稳定的就是基数排序,其余的(判断条件>=可能就不稳定了)名称最优时间复杂度平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序稳定选择排序------------不稳定插入排序稳定希尔排序--------------------不稳定快速排序不稳定归并排序稳定堆排序不稳定基数排序稳定(注:k是最大值位数)O%28n%29O%281%29O%281%29O%28n%29O%281%29。

2024-04-05 14:46:18 1533 3

原创 图Graph及相关算法(Dijkstra,Kruskal)

图是多对多关系,是顶点和边的二元组和。

2024-03-21 15:57:39 784 3

原创 B树B+树,字典树详解,哈夫曼树博弈树

2.ceil(m/2)-1,兄弟节点上移一个记录至父亲层,父亲记录下移至当前节点,结束。2.>m-1裂变,前m/2个成为左子树,剩余的记录成为右子树,指针从左侧叶子节点指向右侧叶子节点,第m/2+1个记录的索引复制一份至父亲层。 =ceil(m/2)-1,父亲索引下移,与当前节点和兄弟节点合并成一个新节点,讨论父亲层索引个数,同(3)。这里删除25,替换后,兄弟节点是第一种情况,兄弟节点上移一个记录至父亲层,父亲记录下移至当前节点,结束。

2024-03-18 11:36:51 1242 3

原创 二叉搜索树 红黑树

(7)父亲红叔叔黑,父亲在爷爷的左,node在父亲的右,左旋,父亲为node,以node为旋转点左旋,父亲在爷爷的左,node在爷爷的左,父亲变黑,爷爷变红,也爷爷为旋转点,右旋,结束。(5)父亲红叔叔黑,父亲在爷爷右侧,node在父亲左侧,右旋,父为node,以node为旋转点右旋,node在父右,父亲变黑爷爷变红,以爷爷为旋转点左旋结束。(8)父亲红叔叔红,父亲叔叔变红,爷爷变红,爷爷为node重新讨论,父亲红,叔叔黑,父亲在爷爷左,node在爷爷左,父亲变黑爷爷变红,以爷爷为旋转点右旋。

2024-03-15 21:59:34 1065 1

原创 二叉树习题详解

写个递归,来算每个节点的最大贡献值,一个节点的最大贡献值是它自己的值+max(左孩子贡献值,右孩子贡献值),叶子节点贡献值就是他们本身的值,最大路径的和=当前结点的值+左孩子最大贡献值+右孩子最大贡献值。用前序遍历遍历所有路径,每遍历一个节点target=target-节点的值,把当前节点值存入path,这个是上一题变体,从左往右从右往左输出,来回交替,只需要加个int记录,奇数层原样,偶数层翻转一下。满足条件的路径应该是当前节点是叶子节点且target=0,递归左右节点,回溯,把当前节点弹出。

2024-03-11 20:04:56 393 2

原创 二叉树,树的基础

树:Tree。路径:从根到叶子,例如A->C->F。路径长度:边的数目。度:孩子数目。

2024-03-11 12:32:24 1073 2

原创 字符串,KMP,SUNDAY

(2)当前字符和前一个字符的Next数组的数对应的字符相比,假设字符串s,当前字符就和s[0]相比,如果相同则Next得前一个Next数加1,如果不相等则跳到当前位置的前一个位置的Next的值的位置的字符去比对。如果我们匹配错了就从下一个开始找,就很麻烦,所以我们想在匹配失败中吸取些有用的东西,避免我们从头开始匹配,那么Next数组就记录了主串与匹配串匹配失败时,匹配串应该从哪里开始匹配。注: sizeof(*str1) str1是首元素地址,*str1是首元素H,字符sizeof为1。

2024-03-03 20:05:54 819 1

原创 栈和队列习题详解(有deque,priority_queue)

我们还能进一步优化,因为上一个代码只从队列前面维护了最大值,我们也可以在队列后面进行维护,也就是说如果新进来的值,比队尾的值大,那么队尾就可以弹出,直到比新进来的数大,或者队列为空。其次还剩下nums.size()-k个数需要求,它最大值的i应该小于等于i-k,不满足条件的已经不在窗口里了,所以前k个数的最大值是q.top().first。一个一个入栈,如果与栈顶相同就不能入栈,且栈顶弹出,如果栈是空的或者与栈顶元素不同就可以入栈。求最小栈的时候我们借助辅助栈,找出最小值后再放回去。

2024-03-03 11:37:31 354 1

原创 队列(Queue)

Push:栈s2是否为空:(1)是:s2的数出栈给s1,新的数据再给s1。(2)否:新的数据给s1。Pop:栈s1是否为空:(1)是:s1的数出栈给s2,s2弹出。(2)否:s2弹出。例:输入1 2 3 4,队列出来应该还是1 2 3 4,下面我们用栈实现一下。(2)想要以1 2 3 4顺序出栈那我们应该把s1里数据放s2中,按顺序出栈。(1)1 2 3 4,进入一个非空队列(如果两个都是空的进q1).例:1 2 3 4输出:4 3 2 1.重复(2)(3)步,直到为空。(1)1 2 3 4入栈s1。

2024-03-02 16:06:35 550 1

原创 哈希表习题

思路:首先判断两个字符串长度是否相等,如果不相等return false,如果相等,设置一个数组,a~z用0~25表示,字符串s中出现就++,t中出现就--,当有元素为负数时说明s中没有这个字符,返回false。用unordered_set取找现在的和是不是出现过,出现过说明死循环了。思路:输出两个数组交集且去重,用哈希。

2024-02-23 21:19:05 349 2

原创 栈Stack

例:(((3+6)*5)-(8/4)) ->(((3 6)+5)*(8 4)/)- -> 3 6 + 5* 8 4 / -)。(3)遇到符号,比较当前元素和栈顶元素优先级,如果当前元素优先级高,直接入栈,如果当前元素优先级低,则将栈内元素依次出栈,直到栈顶元素比当前元素优先级低为止,再将元素入栈,如果优先级相同,出栈入栈都行。(4)遇到“( ”无条件入栈,遇到“ )”栈内元素依次出栈直到“( ”为止。结构体:(1)List(2)封装:top,count。中缀表达式:例如:(3+6)*5-8/4。

2024-02-22 21:17:08 830 2

原创 哈希表(hashtable)

趋近1扩容,把对应的节点迁移过来,原来的节点没开辟新空间,如果某一个位置产生冲突特别多,链表很长,就需要扩桶(M),所有数据按新的规则重新分桶。哈希表(c++里叫unordered_map),O(1)时间内完成,利用数组索引快速搜索的特性,哈希表依赖于数组。趋近于0.8扩容,旧表向新表分批次迁移,所以可能同时存在,查的时候先查新表,再查旧表。(2)哈希冲突(两个数据抢占同一个位置):开放定址法,拉链法(最常用的解法)。(4)搜索:找到当前元素的组,链表的遍历。(1)定义一个链表结构体。是素数且>元素个数。

2024-02-20 22:05:57 609 1

原创 链表习题详解

我们用快慢指针算法,链表中环外部分的长度为a,快慢指针在紫色点相遇,相遇时慢指针走了b长度,相遇时快指针已经走完了环的 n 圈,快指针走过的长度为 a+n(b+c)+b。=b,那么当指针pa走过路程a+b+c时,指针pb走过b+c+a时,两指针相遇,指向链表交点,这个过程就是pa走到表尾时指向B链表表头,然后等到pb走到表尾时指向A链表表头。(2)如果两链表长度不相等时,pa走到表尾时指向B链表表头,然后等到pb走到表尾时指向A链表表头,她两走了相同的路程后都指向了NULL。所以分两种情况来看,

2024-02-15 22:14:27 508 2

原创 链表习题及详解

1.找到后半部分的链表表头:快慢指针做法,快指针一次走两步,慢指针一次走一步,快指针不能再继续走的时候慢指针正好走到中点。思路:在需要反转的区间里,每遍历到一个新的节点,就把新节点插到前面去,举个例子,蓝色是需要翻转的区间。1.需要四个位置的节点,left的前一个结点,left节点,right节点,right的后一个节点。定义left的前一个节点preleft,向后移动的节点back,向前移动的节点front。3.重新连接,left前一个结点连right节点,left节点连right后一个节点。

2024-02-13 23:55:04 650 1

原创 链表及跳表详解

首先链表有数据域和指针域,其次链表在内存中不是连续分布的,链表查找慢,增删灵活。链表有以下几种类型:(1)单向链表: 头增头删快,因为一般都是给链表表头没有表尾的概念了。(2)双向链表: 每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点,既可以向前查询也可以向后查询。(3)循环链表:链表首尾相连。

2024-02-07 21:32:10 1198 2

原创 二分习题详解

把目标数的算术平方根二分,二分法找到等于目标数的算术平方根,如果没有等于的找小于它的最大数。这里n的范围是2*1e9,所以r=200000。这题和上一题差不多,就不描述了。

2024-02-06 13:14:38 338 2

原创 二分习题与详解

首先最先考虑的就是情况(3),searchRanger函数是找最右区域的,searchRangel函数是找最左区域的,这个就是根据之前的二分题目可以很简单推出来,他的结果也就是{a,b}其次考虑的是情况(2)这种情况,他的左边界会比右边界大,因为这连个函数在l=r的下一步,r会往左移一步所以造成左边界会比右边界大,所以a>b 答案是-1 -1。最后情况(4),由于未赋值,数组值是0,导致右边界值不会走rans=r,所以它还是会是初值-1,它也是a>b所以不用多加一个判断了得{-1,-1}

2024-02-04 21:53:57 520 1

原创 分治算法及例题,快速幂简单解释

二分法是从中间取,例如 1~100的数字,让你猜一个数,如果用二分最先想到的数字就是50,原因就是:等概率事件构成最优下界。将一个大问题分解成解决方案完全相同的子问题,(注:分治法不一定非用递归来完成)(4)子问题的解之间相互独立(答案互不干扰互不影响,斐波那契明显不是)如果mid>要找的数,则下次查找左侧部分,范围是(起始,mid-1)如果mid

2024-02-03 21:04:29 458 1

原创 递归算法与例题详解

(3)当有三阶楼梯时,如果我第一次迈一阶楼梯那就是1+(2)的步骤,如果我第一次迈二阶楼梯那就是2+(1)的步骤,也就是前两次步骤之和3。但是如果用递归会超时,所以我们利用滚动窗口思想,利用中间变量t实现优化。(2)讲将一个问题拆解成解决方案完全相同的子问题。(2)当有两阶楼梯时,有两种方法 1 1,2。同理四阶楼梯是三阶楼梯+二阶楼梯步骤之和5。(1)当只有一阶楼梯时,只有一种方法 1。(4)到终点后计算结果原路返回。因为一次能爬1 或 2级楼梯。(3)必须有一个明确的终点。当第一个数和第二个数为1时。

2024-02-03 19:20:54 487 1

空空如也

空空如也

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

TA关注的人

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