自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(662)
  • 资源 (5)
  • 收藏
  • 关注

原创 【数据结构学习笔记】18:线段树(建树、单点修改、区间查询)

单点modify的线段树,不带懒标记push down

2022-11-26 03:33:33 958 1

原创 【Redis学习笔记】5:Redis常见数据结构实际应用场景

Redis为什么快?1. 内存操作、2. 多路复用、3. 高效数据结构,这节学习的就是Redis底层的数据结构应用场景。1 全局哈希表在Redis里set一个key-value时,会存储到Redis里的全局哈希表里。Redis的key一定是一个字符串,使用哈希函数对这个key取一个哈希值,然后对哈希表的长度取模,然后就能分到哈希表的一个表项(桶)里。Redis底层有渐进式的rehash和动态扩容机制,把发生哈希碰撞的概率降得很低,所以Redis的全局哈希表性能很高。key都是字符串,但是value

2021-05-29 16:31:39 752

原创 【Redis学习笔记】4:Redis缓存数据库双写不一致问题

1 问题描述如果有两个线程都要给某个字段落盘(先写数据库再写缓存),按照下面的顺序执行不会有问题:但是如果按照下面的顺序就会出现数据库中的数据和缓存中的数据不一致的情况:这就是缓存数据库双写不一致问题。在更多时候,真实场景下,写入数据库之后往往不会直接去写缓存(浪费资源),而是会去把缓存删除掉,而是当另一个线程读数据库之后顺便把读的数据写入到缓存里。在这种情况下,如果“查数据库”和“更新缓存”这两个操作之间有延时,那么也会出现缓存数据库双写不一致问题:因此这个问题本质上是对数据库的操作和其

2021-05-29 11:18:50 1173 1

原创 【Redis学习笔记】3:Redis主从架构的分布式锁失效问题 & 高并发量下性能优化

1 Redis主从架构的分布式锁失效问题1.1 问题描述在Redis主从架构中,写入都是写入主Redis实例,主实例会向从实例同步key。一个业务线程A通过向主Redis实例中写入来实现加分布式锁,加锁后开始执行业务代码。这时如果主Redis实例挂掉了,会选举出一个从Redis实例成为主的,如果刚刚加锁的key还没有来得及同步到从Redis中,那么选举出来的新的主Redis实例中就没有这个key,这个时候业务线程B就能加锁来获取分布式锁,执行业务代码了,而这个时候A还没有执行结束,所以就会出现并发安全

2021-05-28 22:19:18 4455 2

原创 【Redis学习笔记】2:认识Redisson及其分布式锁RLock.lock()

Redisson和Jedis类似,都是用Java实现的操作Redis的客户端,但是使用场景不同。Redisson更多用在分布式场景下(功能可以看wiki),Jedis更多用在单机场景下。1 Java接入Redisson以Spring Boot为例,接入Redisson的依赖:和使用Jedis类似,需要初始化一个Redisson客户端,使用提供的API来创建Redisson对象(指定了配置,以及要操作的是哪个Redis实例),然后注入到容器中:上面的代码里是单机模式,也支持其他的配置方法,如集群、

2021-05-28 16:39:31 1537 1

原创 【Java学习笔记】70:借助Redis实现分布式锁

这节学习Java用Redis做分布式锁,来做秒杀场景卖货减库存的案例。最原始的减库存写法这里库存也存Redis里面,调减库存接口的时候判断一下大于0(还有库存)就拿出来减1。这里StringRedisTemplate是Spring Boot对Redis的封装,27行和30行的写法就等同于注释里面的用Jedis的写法,就是去调Redis的GET和SET命令。这样的代码中存在并发问题,在高并发的场景下,只要多个线程都执行读库存的操作,那么读出来的库存数目就是一样多的。比如三个线程都读出来200,然后都

2021-05-28 13:25:53 321

原创 【ProVerif学习笔记】8:更多密码学特性

1 扩展的destructor将解构器的能力扩展,现在它可以被定义为:相当于有一系列的重写规则(rewrite rule),对于实际拿到的一个析构操作,到析构器里从上到下看,如果某一条重写规则是可应用的(applied,其实就是命中了这条规则,就是所有的项都能正确的match上),那么就用这条规则。如果所有的重写规则都遍历完一遍没有能应用上的,那么这个destructor就失败(fail)了。比如对于:在这个定义下,eq(M, N)都是string并且是同一个东西的时候被规约成true,都是st

2021-05-16 19:32:39 941

原创 【ProVerif学习笔记】7:基本建模特性

1 constants常量(constant)可以用参数量为0的函数(fun关键字声明的,在ProVerif里其实应该叫constructor )来表示,也就是有一个类型名有一个返回值类型(就是常量的类型),也可以直接用const关键字来描绘常量。const c1, ... , ck : t.2 data constructors和type conversion2.1 [data]constructor就是用fun声明的函数,用来对一系列数据做构造。data constructor是一种将构造器

2021-05-06 00:24:31 1095

原创 【ProVerif学习笔记】6:握手协议(handshake protocol)建模

这节先不继续往下看,巩固一下对ProVerif建模握手协议的理解。握手协议的流程如下:ex_handshake.pv(只验证保密性)手册里在引入security性质之前,握手协议的模型如下:(* ------------------------对称加密相关------------------------ *)(* 对称密钥 *)type key.(* 对称加密:传入要加密的内容和密钥,返回加密结果 *)fun senc(bitstring, key): bitstring.(* 对称解密

2021-05-04 13:26:26 1701 5

原创 【算法学习笔记】27:区间DP

1 区间DP区间DP指的是状态表示是某个区间的DP问题。在区间DP里循环的顺序不太好写,因为要在计算时确保所需要的状态都计算过了,顺序一般可以先按区间长度从小到大来枚举。2 模板题:石子合并分析如下图。只要考虑最后一步,合并的是左右的哪两个区间,也就是枚举分界点kkk,最后一步合并的就是区间[i,k][i, k][i,k]和[k+1,r][k + 1, r][k+1,r]。不管分界点kkk怎么选,合并代价都是区间[i,j][i, j][i,j]的区间和,这里用前缀和来维护,所以就是s[j]−s[

2021-02-17 17:27:48 337

原创 【算法学习笔记】26:匈牙利算法(二分图最大匹配)

1 简述给定一个二分图,例如:匈牙利算法能够快速的计算出一种匹配方式,使得匹配的数量最多。注意,一个成功的匹配方式中,没有两条边是共用了同一个点的。形象的说,这个问题可以理解成二分图两边分别是男生和女生,有连线的表示可以凑成一对,匈牙利算法就是用来计算最多能够凑成多少对(不存在脚踏多条船的情况)。例如左边是男生,右边是女生,可以任选一方为主动方,比如是男生方,那么流程如下。对于每个男生结点,对所有与之有连线的女生结点,检查对应的女生是不是单身,如果是就直接凑成一对。那么在上图的例子中,前两个男

2021-02-16 16:07:30 391

原创 【算法学习笔记】25:染色法(判定二分图)

1 简述要判断一个图是不是二分图,可以用两种颜色对图上的所有结点进行染色。染色法的基本思路是,如果一个图是二分图,那么一个结点所连接的所有结点都一定和这个结点属于不同侧,也就应该染上不同的颜色。所以只要先将一个结点染成颜色111,然后检查它的所有邻接结点jjj。如果jjj已经染过颜色了,而且和本结点的颜色一样,那么就发生了冲突,说明不能形成二分图。如果jjj结点没有染过颜色,就将其染成和自己这个结点颜色不一样的(比如自己是111,那么就把jjj结点染色成222),这是一个递归的过程,如果这个过程

2021-02-14 00:24:59 1944

原创 【算法学习笔记】24:Prim算法与Kruskal算法(最小生成树)

Prim算法和Dijkstra算法很相似,而且也按照是不是稀疏图分成了两种:对于稠密图,用朴素版的Prim算法,时间复杂度O(n2)O(n^2)O(n2)对于稀疏图,用堆优化版的Prim算法,时间复杂度O(mlogn)O(mlogn)O(mlogn)Kruskal算法的时间瓶颈在于它需要对所有边从小到大排序,所以时间复杂度是O(mlogm)O(mlogm)O(mlogm),由于m<n2m < n^2m<n2,所以mlogm<mlog(n2)=2mlognmlogm <

2021-02-13 00:15:33 669

原创 【算法学习笔记】23:Floyd算法(多源汇最短路)

1 简述Floyd算法用于求多源汇最短路,时间复杂度O(n^3)。首先用邻接矩阵里的d[i,j]d[i, j]d[i,j]存储所有的边(重边的时候取minminmin),然后就是三重循环,思路也是如果从iii到kkk,再从kkk到jjj,这个距离能比d[i,j]d[i, j]d[i,j]小,就更新一下:d[i,j]=min(d[i,j],d[i,k]+d[k,j])d[i, j] = min(d[i, j], d[i, k] + d[k, j])d[i,j]=min(d[i,j

2021-02-10 14:23:10 324

原创 【算法学习笔记】22:SPFA算法(带负权边单源点最短路、检测负权回路)

1 简述SPFA算法是对Bellman-Ford算法的优化,也是用于在存在负权边的图上,求单源点最短路,一般情况下时间复杂度可以看作O(m)O(m)O(m)的,最坏情况下时间复杂度是O(nm)O(nm)O(nm)。虽然SPFA算法是对Bellman-Ford算法的优化,但是不是所有用Bellman-Ford算法的问题都能用SPFA来代替。例如,对最短路经过的边数做一个限制,要求经过的边数≤k\leq k≤k的最短路,这个时候能用Bellman-Ford算法,但是不能用SPFA算法来做。SPFA算法是单

2021-02-10 00:21:12 1228

原创 【算法学习笔记】21:Bellman-Ford算法(有边数限制的单源点最短路)

1 应用:计算有边数限制的单源点最短路Bellman-Ford算法用于在存在负权边的图上,求单源点最短路,时间复杂度O(nm)O(nm)O(nm)。但是因为该算法的改进版SPFA,在求单源点最短路的问题上几乎总是优于Bellman-Ford算法,所以Bellman-Ford算法一般只应用在对边的数量有限制的最短路问题,即限制经过边的数量不超过kkk。Bellman-Ford算法属于动态规划算法。Bellman-Ford算法的基本思想是,如果要求最短路的长度最多为kkk(如果不限制,那其实就是k=n−1

2021-02-08 17:26:10 524

原创 【算法学习笔记】20:朴素Dijkstra与堆优化Dijkstra(无负权边单源点最短路)

Dijkstra算法用于在所有边权都非负的图上,求单源点最短路。设nnn是图上结点的数量,mmm是边的数量。则朴素Dijkstra算法的时间复杂度是O(n2)O(n^2)O(n2),适合稠密图(点少边多);堆优化版的Dijkstra算法的时间复杂度是O(mlogn)O(mlogn)O(mlogn),适合稀疏图(点多边少)。如果是稠密图,那么边的数量mmm和点数的平方n2n^2n2基本是一个规模的。如果用堆优化版的Dijkstra,那么复杂度就可以视为O(n2logn)O(n^2logn)O(n2logn

2021-02-08 00:17:08 1680

原创 【算法学习笔记】19:拓扑排序

1 简述计算拓扑序列的一个方式是,用BFS来尝试访问所有的节点,但是有一个约束就是只有入度为000的节点才能被加入到扩展队列里。每次从队列里取出一个节点,也就同时在图中将这个节点拆除,所以它的所有后继的节点都减少111,如果已经减少到000,那么就可以加入到队列中。在上面的例子中,一开始只有aaa的入度是000,所以先把aaa加入到队列中,队列中:aaa然后取出队头aaa并在图中拆除,然后它的后继ccc的入度变成111,bbb的入度变成000,把bbb加入到队列里,队列中:bbb然后取出队头b

2021-02-06 18:07:47 334

原创 【算法学习笔记】18:树与图的DFS与BFS

1 邻接表树和图的DFS和BFS,可以将树也看成图来存储,存储图的一个常用的存储结构就是邻接表。对于有向图而言,只存这个方向的边,对于无向图而言,存两个方向的边。在邻接表的实现中,用数组h来记录每个节点向外的边的链表头指针,初始时都是空(即-1)。用idx来表示链表节点的分配位置。数组e表示节点的值,即是目标节点的编号。数组ne表示节点的nextnextnext指针,也就是链表节点的下一节点被分配的下标。注意,当用邻接表去存无向图(或者树)的时候,因为a→ba \to ba→b和b→ab \to ab

2021-02-06 17:23:50 459

原创 【算法学习笔记】17:DFS与BFS

1 DFS深度优先搜索常用于解决需要给出所有方案的问题,因为它的搜索顺序就是能够得到一个完整的搜索路径(方案)后回退再去搜索其它的方案。1.1 例题:排列数字由于要求所有排列的方案,可以每次从1..n1..n1..n里拿一个数字,然后记录一下这个数拿过了,再递归地搜索下一个数字,当所有数字都取完之后,就得到了一种方案,将这种方案输出,回退之后去搜下一个方案。“回退之后去搜下一个方案”,其实就是在每层DFS的时候遍历一下所有的允许使用的数字,作为下一个位置的数字。需要注意的是在进入下一层DFS之前要把

2021-02-06 00:21:47 308

原创 【数据结构学习笔记】17:模拟散列表

哈希表通过空间换时间的方式,能够实现平均在O(1)O(1)O(1)的时间里插入和删除元素,它能够将较大的空间的数据映射到一个小范围里。手写哈希表的时候,哈希函数一般就是将数值关键字对一个数取模,由于取模的结果就是000到这个数,所以这个模数其实就是数组哈希表的长度NNN,取模结果对应到数组模拟哈希表中从零开始的一个下标。为了处理数值关键字是负数的情况,xxx对NNN的取模运算(计算哈希值kkk)是:k=(x%N+N)%Nk = (x \% N + N) \% Nk=(x%N+N)%N在这种方式中,

2021-02-05 21:16:07 285

原创 【数据结构学习笔记】16:模拟堆与堆排序

1 简述1.1 堆的性质与操作大根堆(小根堆)是一棵完全二叉树,其性质是每一个结点都是≥\geq≥(≤\leq≤)左右儿子结点的,因此满足每棵子树都是一个大根堆(小根堆)。特别要注意这里加粗的地方才是根本性质,即大根堆每个结点≥\geq≥左右儿子,小根堆每个结点≤\leq≤左右儿子,绝对不是“最大(最小)元素在根节点”这种导出性质。由于这个特性的存在,堆顶元素就是整个大根堆(小根堆)中的最大(最小)元素,可以快速取出。朴素的堆至少要支持:获取堆顶元素取出堆顶元素,然后在log(n)log

2021-02-05 00:58:24 319

原创 【数据结构学习笔记】15:并查集

1 简述并查集可以用来描述集合,能够做集合合并操作,检查两个元素是否属于同一个集合等。并查集用森林中的每棵多叉树来表达一个集合,初始时,每个元素单独在一个集合,也就是自己是一棵树:合并两个集合时,只要把一个集合的树根挂到另一个集合的根上。例如,合并元素111所在的集合和元素222所在的集合(图中以黄色结点为树根,绿色为非根):以一个更加一般的例子来说明合并的过程,例如这样两棵树(代表两个集合):合并时,把一棵树的树根挂到另一棵树上:并查集几乎都是用树的数组表示来实现,用一个int型数组p

2021-02-04 22:29:50 270

原创 【数据结构学习笔记】14:Trie树

1 简述Trie树是能够高效存储和查找字符串集合的数据结构,比较适合字符种类较少的问题,例如如果字符串中只可能出现262626种小写字符,那么Trie树长成这样:也就是说Trie树的树根是一个虚拟结点,然后它会分叉出262626个结点,分别对应每个小写字母,每个结点又分叉出262626个结点,这样往下不断展开。这样看起来Trie树的空间是指数级别的,非常大,但是实际上Trie树一开始只需要有一个虚拟的根节点,然后每次插入字符串只需要把字符串上的每个字符对应的结点创建好就行了,实际的空间占用很小。例

2021-02-04 16:35:14 176

原创 【算法学习笔记】16:单调栈与单调队列

单调栈和单调队列都是一类算法思想,是栈和队列在算法里很常见的应用。单调栈算法一般用模拟栈或者程序语言给实现的栈都可以,因为只要求在栈顶入栈和退栈,以及取栈顶元素。单调队列算法很多时候用手写的模拟队列比较方便,因为很多时候需要双口出队的队列,主要是在队尾也有删除元素的需求。而模拟队列都是游标移动来限定队列中的所有元素,所以用模拟队列很自然的可以做到双端队列的操作。1 单调栈单调栈是栈中的元素按照一个单调性来排列,每次入栈一个元素xxx时,如果加入这个元素会使得单调性被破坏,就不停的弹出栈顶元素,直到可

2021-02-03 23:42:54 415

原创 【数据结构学习笔记】13:模拟栈与模拟队列

这节学习用数组模拟栈和队列,这种方法相比内置的栈和队列,一方面比较通用,不受语言限制,另一方面速度也比较快。而且因为是用数组模拟的,所以可以对任意位置进行修改(如果有办法知道要修改的位置的下标的话)。1 模拟栈模拟栈比较简单, 将数组的扩展方向作为栈的入栈扩展方向,并记录一下栈中的元素数量(其实也就是当前栈顶的位置),每次入栈的时候,先将栈顶位置+1+1+1,然后在这个位置填入要入栈的数据即可。需要注意数组的长度至少需要开到栈最大容量+1+1+1的大小,因为000位置是不存数据的,用来标识栈是否是空的

2021-02-03 20:11:22 277

原创 【数据结构学习笔记】12:静态单链表与静态双链表

链表可以用指针+结构体的实现方式,也可以用数组模拟,也就是静态链表。相比之下静态链表的效率比较高,因为指针+结构体的方式,每次创建一个新的结点的时候都要new一块结点空间,这个操作是比较耗时的。1 静态单链表静态单链表用的最多的地方就是在邻接表的链的实现上,因为邻接表实际上就是若干个单链表,邻接表用的最多的就是存储树和图。所以涉及树和图的问题的时候,如果需要读入数据存到邻接表里,就需要这部分知识了。在单链表里,每个结点都要存一个值valvalval和指向下一个结点的nextnextnext指针,然后有

2021-02-03 13:43:56 408

原创 【算法学习笔记】15:区间合并

1 简述区间合并问题也是一个贪心问题,由于比较常用所以单独拿出来。区间合并的解决方法是,把所有区间按照左端点lll从小到大排序,然后维护一个当前正在处理的区间[st,ed][st, ed][st,ed],如果遍历到区间和维护的区间有交集,就合并(能合则合),没有交集的时候,当前维护的区间就变成这个遍历到的区间。这里按照左端点排序好之后,每次遍历到的区间和当前区间[st,ed][st, ed][st,ed]只会有三种状态:情况(1)(1)(1)是l≤edl \leq edl≤ed并且r≤edr \le

2021-02-01 23:52:17 521

原创 【算法学习笔记】14:离散化操作

1 简述离散化是一种辅助解决问题的操作,当问题中涉及的数据范围非常大,但是实际使用到的数据是比较少的。并且问题的求解是和它范围里的其它数据有关系的,那么可以将这些可能使用到的数据放到一起,排序去重,就将它们映射到了一个新的较小的范围里。例如,下面几个数是在(−∞,∞)(-\infty, \infty)(−∞,∞)范围里的,实际用到的数:6、−10000、114514、1919、−123、19196、-10000、114514、1919、-123、19196、−10000、114514、1919、−

2021-02-01 21:43:50 534

原创 【算法学习笔记】13:双指针算法

双指针算法的核心思想就是在序列上找到这样一个性质,序列上的一个指针jjj随着另一个指针iii的移动,是单向移动的,不会发生回退,这样就能在移动指针iii的时候去移动指针jjj。由于两个指针都最多只会把序列遍历一遍,所以时间复杂度往往是从O(n2)O(n^2)O(n2)优化到O(n)O(n)O(n)的,也就是双指针算法能够优化掉时间复杂度上的一个维度。双指针算法中,两个指针可能是同向移动的(类似滑动窗口),也可能是对向移动的。1 例题:最长连续不重复子序列在这个问题里,试想用sis_isi​表示以a[i

2021-01-31 22:59:33 184

原创 【算法学习笔记】12:前缀和与差分

1 一维前缀和前缀和可以用于快速计算一个序列的区间和,也有很多问题里不是直接用前缀和,但是借用了前缀和的思想。用s[i]s[i]s[i]表示a[0]+a[1]+...+a[i]a[0]+a[1]+...+a[i]a[0]+a[1]+...+a[i]的和(所以称为前缀和),那么要计算区间[l,r][l, r][l,r]的和,也就是计算a[l]+a[l+1]+...+a[r]a[l]+a[l +1]+...+a[r]a[l]+a[l+1]+...+a[r],只需要计算s[r]−s[l−1]s[r] - s[

2021-01-31 16:12:25 505

原创 【算法学习笔记】11:高精度整数A+B、A-B、A*b、A/b

高精度算法是在计算问题涉及的数据范围超过该程序语言的表示能力时,用数组模拟数学运算的一类算法。本节学习高精度的整数四则运算,其中乘法只要求一个因子是高精度,除法只要求被除数是高精度。以下,用大写字母(如AAA、BBB)表示高精度的整数,用小写字母(如bbb)表示用编程语言自带的整数类型就能表达的整数。以下默认是十进制数表示下的整数四则运算操作,在其它进制表示下也是类似的。1 高精度整数A+B模板题:高精度加法。要计算两个高精度整数AAA和BBB的和,可以用列竖式的思想,从最低位开始,将低位加起来然后

2021-01-30 17:47:56 1420

原创 【算法学习笔记】10:整数二分与浮点数二分

二分法用于解决这样一类问题:一个区间能分成左右两部分,左半部分满足性质AAA,右半部分不满足性质AAA。问题的目标是求解这两部分的分界点。所以二分法和区间里有没有单调性其实没什么关系,但是很多问题里是从单调性导出了上面的性质,上面的性质才是一个问题能用二分法求解的最本质的性质。二分法每次取区间的中间元素,通过判断区间中点元素a[mid]是否满足性质AAA就能断定求解目标是在mid的左边还是右边,从而每次把求解区间长度缩减一半。1 整数二分1.1 特点在整数二分问题里,需要考虑缩减区间时是否要保留m

2021-01-29 20:31:44 563 3

原创 【算法学习笔记】9:归并排序与统计逆序对

归并排序归并排序的思想是基于分治法,其思路是:将待排序区间平分成左右两半,左右两侧分别递归地做归并排序。将这两个有序的区间合并(每次落一个较小的下来),就将这个区间排好序了。#include <iostream>using namespace std;const int N = 1e5 + 10;int a[N], tmp[N];void merge_sort(int q[], int l, int r) { // 如果区间里已经<=1个数了,就直接返回

2021-01-28 22:46:22 500

原创 【数据结构学习笔记】11:树状数组

树状数组,也叫Binary Indexed Tree(很多国内资料翻译成二叉索引树,但是树状数组显然不是二叉的),主要应用在一定规模地同时存在这两个问题的场景下:求数组中某个区间的和修改数组中的某一个数使用树状数组做这两个操作的时间复杂度都是O(logn)O(logn)O(logn)的。想一下和已经学过的做法的比较,对于上面两种操作。一个做法是直接用数组来存每一个数,那么求区间和的操作时间复杂度是O(n)O(n)O(n)的,修改数组中的某一个数的时间复杂度是O(1)O(1)O(1)的。另一个做法

2021-01-02 22:10:18 281

原创 【模型检测学习笔记】10:有限状态迁移系统上的IC3算法

IC3算法全称是Incremental Construction of Inductive Clauses for Indubitable Correctness,可以用来检测迁移系统上的不变性性质。1 术语约定1.1 clause和literal这里逻辑公式(logic formula)一律用合取范式(conjunctive normal form,CNF) 来表示,CNF中的每一项是一个clause,每个clause是若干literal的析取,每个literal是一个逻辑变量或者逻辑变量的非,例如

2020-11-23 15:13:20 1762 4

原创 【nuXmv学习笔记】4:模型检测实例

例子1:带有请求操作的四位加法器在笔记2最后例子里的四位加法器之上添加了请求操作的模型。在这个模型里,一开始加法器在闲置状态,请求来了之后,加法器的最低位工作得到结果,同时将请求信号和这一位计算时产生的进位信号送给高一位,如果反复,直到四位加法器的最高位完成计算时,整个加法器的计算就完成了。在计算完成之前,要一直保持请求信号的存在,这样才能保持操作数不变,这样每一位的加法结果才能不丢失。-- 一位加法器(请求,操作数1,操作数2,进位)MODULE bit-adder(req, in1, in2,

2020-11-21 16:17:35 1378 1

原创 【算法学习笔记】8:快速排序中的边界问题

基本思路快排的思想是基于分治法,其思路是:确定分界点:给定要排序的数组q,先在数组中找一个数作为分界点值x,分界点可以取左边界值x = q[l],可以取右边界值x = q[r],可以取数组中间的数x = q[l + r >> 1],也可以随机取一个。调整区间:将数组划分成两个区间,使得左半部分所有的数都<= x,右半部分所有的数都>= x。递归处理左右两个区间。快排有多种实现方法,在y总的模板里,分界点的位置不一定是x,因为x参与交换之后仍然会被留在左右区间中的一个里。

2020-11-20 13:54:51 4725 22

原创 【nuXmv学习笔记】3:模型检测流程

1 对程序建模例如,给出一个使用更相减损术求最大公约数的程序:#include <bits/stdc++.h>using namespace std;int main() { int a = 10, b = 15; while (a != b) { if (a > b) a = a - b; else b = b - a; } cout << a <

2020-11-19 19:00:19 1725

原创 【nuXmv学习笔记】2:约束式建模和多模块模型

1 约束式建模前面学习的建模方式都是赋值式(Assignment Style) 的,可以将这些模型转换成一种约束式(Constraint Style) 的,多数时候都会让模型的表达更方便。例如,下面的模型表达的是某种机器在就绪(ready)时,如果有请求来了,就会开始忙碌(busy),否则接下来既可以就绪也可以忙碌:MODULE mainVAR request : boolean; state : {ready, busy};ASSIGN init(state) := re

2020-11-18 22:34:44 1195 8

算符优先分析法

设有文法G[S]:S→SaF | F F→FbP | P P→c | d (1) 构造G[S]的算符优先关系表 (2) 分别给出cadbdac# 和 dbcabc# 的分析过程

2018-05-22

已经整合好的小型S2SH框架(完全注释+依赖jar包)

已经将Struts2和Hibernate与Spring整合,测试可用。含三个框架的核心依赖jar包,不含JDBC驱动,测试例子是用MySQL作为数据库的。请自行更换数据库,添加驱动,修改Hibernate设置和数据库配置。 含有大量注释,适合学生立即上手开发课程项目。

2018-05-13

举例说明汇编语言子程序递归调用过程中堆栈内容的变化过程

上海大学课程研讨,题目是举例说明汇编语言子程序递归调用过程中堆栈内容的变化过程。上海大学课程研讨,题目是举例说明汇编语言子程序递归调用过程中堆栈内容的变化过程。

2017-12-03

有关ADSL与调制技术

有关ADSL和相关的调制技术,计算机网络研讨课演讲PPT。

2017-10-04

有关Linux进程家族树

操作系统课程研讨PPT,有关Linux进程家族树的形成,服务的自动开启。操作系统课程研讨PPT,有关Linux进程家族树的形成,服务的自动开启。操作系统课程研讨PPT,有关Linux进程家族树的形成,服务的自动开启。

2017-10-03

空空如也

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

TA关注的人

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