叮当快药
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了叮当快药相关的知识,希望对你有一定的参考价值。
参考技术A 常用4种限流算法介绍及比较
面试官:你知道的限流算法有哪些?
拓展: Hystrix的原理和使用
ZK数据同步方式
在初始化阶段,zk 的 learner会优先初始化以全量同步方式来同步数据
learner先向leader注册,上报peerLastZxid
zk是CP系统
不能保证可用性 也就是在极端环境下,ZooKeeper可能会丢弃一些请求,消费者程序需要重新请求才能获得结果
在Java中,我们的垃圾回收机制回收垃圾的时候就会根据对象的引用,判断对象是否可以被垃圾回收,这里有两种:
对象的引用被划分为4种级别,从而使程序能 更加灵活地控制对象的生命周期 。这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
key是ThreadLocal类的实例对象,value为用户的值
wait()方法的作用是将当前运行的线程挂起(即让其进入阻塞状态),直到notify或notifyAll方法来唤醒线程.
有了对wait方法原理的理解,notify方法和notifyAll方法就很容易理解了。既然wait方式是通过对象的monitor对象来实现的,所以只要在同一对象上去调用notify/notifyAll方法,就可以唤醒对应对象monitor上等待的线程了。notify和notifyAll的区别在于前者只能唤醒monitor上的一个线程,对其他线程没有影响,而notifyAll则唤醒所有的线程
sleep方法的作用是让当前线程暂停指定的时间(毫秒),sleep方法是最简单的方法,在上述的例子中也用到过,比较容易理解。唯一需要注意的是其与wait方法的区别。最简单的区别是,wait方法依赖于同步,而sleep方法可以直接调用。而更深层次的区别在于sleep方法只是暂时让出CPU的执行权,并不释放锁。而wait方法则需要释放锁。
yield方法的作用是暂停当前线程,以便其他线程有机会执行,不过不能指定暂停的时间,并且也不能保证当前线程马上停止。yield方法只是将Running状态转变为Runnable状态。
join方法的作用是父线程等待子线程执行完成后再执行,换句话说就是将异步执行的线程合并为同步的线程。
零拷贝技术,
两种零拷贝方案 MMap sendfile
MMap三次拷贝 sendfile两次拷贝,多出的一次是CPU拷贝 从内核拷贝到用户进程
rocketMQ使用MMAP Kafka使用sendfile 所以rocketmq能达到十万级别,kafka能达到百万级别
但为什么rocketmq不适用sendfile 因为rocketmq可以处理消息的顺序,消息的过滤
Kafka不能完成,因为sendfile压根就没有到达数据应用层,内核中无法处理这些操作。
codevs 2495 水叮当的舞步
水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~
地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。
每个测试点包含多组数据。
每组数据的第一行是一个整数N,表示地摊上的格子有N行N列。
接下来一个N*N的矩阵,矩阵中的每个数都在0~5之间,描述了每个格子的颜色。
N=0代表输入的结束。
对于每组数据,输出一个整数,表示最少步数。
2
0 0
0 0
3
0 1 2
1 1 2
2 2 1
0
0
3
对于30%的数据,N<=5
对于50%的数据,N<=6
对于70%的数据,N<=7
对于100%的数据,N<=8,每个测试点不多于20组数据。
第二组样例解释:
0 1 2 1 1 2 2 2 2 1 1 1
1 1 2 --> 1 1 2 --> 2 2 2 --> 1 1 1
2 2 1 2 2 1 2 2 1 1 1 1
本题解直接搜索过了
剪枝见注释
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 using namespace std; 6 struct Node 7 { 8 int x,y; 9 }q[100001]; 10 const int dx[5]={0,1,-1,0,0}; 11 const int dy[5]={0,0,0,1,-1}; 12 int a[11][11],n,color[6],ans=2e9; 13 bool v[6],vg[11][11]; 14 void find() 15 {int h,t,i; 16 memset(v,0,sizeof(v)); 17 memset(vg,0,sizeof(vg)); 18 h=0;t=1; 19 int c=a[1][1]; 20 q[1]=(Node){1,1}; 21 vg[1][1]=1; 22 while (h<t) 23 { 24 h++; 25 for (i=1;i<=4;i++) 26 { 27 int x=q[h].x+dx[i],y=q[h].y+dy[i]; 28 if (x>=1&&x<=n&&y>=1&&y<=n) 29 { 30 if (!vg[x][y]) 31 {if (a[x][y]==c) 32 { 33 t++; 34 q[t]=(Node){x,y}; 35 } 36 else if (a[x][y]!=c) v[a[x][y]]=1; 37 vg[x][y]=1; 38 } 39 } 40 } 41 } 42 } 43 int change(int c) 44 {int h,t,i,cnt; 45 h=0;t=1; 46 q[1]=(Node){1,1}; 47 int cc=a[1][1]; 48 a[1][1]=c; 49 cnt=1; 50 while (h<t) 51 { 52 h++; 53 for (i=1;i<=4;i++) 54 { 55 int x=q[h].x+dx[i],y=q[h].y+dy[i]; 56 if (x>=1&&x<=n&&y>=1&&y<=n&&a[x][y]==cc) 57 { 58 a[x][y]=c; 59 t++; 60 q[t]=(Node){x,y}; 61 cnt++; 62 } 63 } 64 } 65 return cnt; 66 } 67 void dfs(int step) 68 {int i,j,map[11][11]; 69 bool vis[6]; 70 int cnt=0; 71 for (i=0;i<=5;i++) 72 if (color[i]) cnt++; 73 if (cnt==1) 74 { 75 ans=min(ans,step); 76 return; 77 } 78 if (cnt+step>ans) return;//最优性剪枝,当剩下种类+当前步数>ans则明显舍去 79 find();//只变成有在周围存在的颜色 80 memcpy(map,a,sizeof(map)); 81 memcpy(vis,v,sizeof(vis));//重点,因为深搜会改变v 82 for (i=0;i<=5;i++) 83 if (vis[i]) 84 { 85 int c=a[1][1]; 86 int x=change(i); 87 color[c]-=x;color[i]+=x; 88 dfs(step+1); 89 memcpy(a,map,sizeof(a)); 90 color[c]+=x;color[i]-=x; 91 } 92 } 93 int main() 94 {int i,j; 95 while (cin>>n&&n) 96 {ans=2e9; 97 memset(color,0,sizeof(color)); 98 for (i=1;i<=n;i++) 99 for (j=1;j<=n;j++) 100 { 101 scanf("%d",&a[i][j]); 102 color[a[i][j]]++; 103 } 104 dfs(0); 105 cout<<ans<<endl; 106 } 107 }
以上是关于叮当快药的主要内容,如果未能解决你的问题,请参考以下文章