zookeeper-分布式协调
Zookeeper中的分布式协调Watch机制和异步回调在分布式协调中的作用ZooKeeper是一个为分布式应用设计的高性能协调服务,它通过提供一致性的数据注册、配置管理、命名服务、分布式同步等功能,帮助分布式系统中的各个组件协同工作。ZooKeeper中的watch机制和异步回调是实现分布式协调的两个关键特性。
Watch机制Watch(观察者)机制允许客户端在ZooKeeper的节点上设置观察点。当这些节点上的数据变化或节点本身发生变化时(例如,节点创建、删除),设置了观察点的客户端会收到一个一次性的通知。这个机制非常适合用于实现配置更新通知、集群成员变化通知等场景。
使用Watch的步骤通常如下:
设置观察点:客户端在读取特定节点的数据或检查节点存在性时设置观察点。
接收通知:一旦被观察的节点发生了变化(数据变更、节点创建或删除等),客户端会收到一个通知。
采取行动:客户端在收到通知后,可以根据需要重新读取数据、更新本地状态或执行其他协调操作。
异步回调异步回调机制允许客户端在不阻塞当前线程的情况下执行ZooKeeper操作。客户端可以发起一个异步操作,并提供一个回调对象。一 ...
国际象棋
题目描述众所周知,“八皇后” 问题是求解在国际象棋棋盘上摆放 88 个皇后,使得两两之间互不攻击的方案数。
已经学习了很多算法的小蓝觉得 “八皇后” 问题太简单了,意犹未尽。作为一个国际象棋迷,他想研究在 N×M的棋盘上,摆放 K 个马,使得两两之间互不攻击有多少种摆放方案。
由于方案数可能很大,只需计算答案除以 1000000007 (即 109+7) 的余数。
如下图所示,国际象棋中的马摆放在棋盘的方格内,走 “日” 字,位于 (x,y) 格的马(第 x 行第 y 列)可以攻击 (x+1,y+2)、(x+1,y−2)、(x−1,y+2)、(x−1,y−2)、(x+2,y+1)、(x+2,y−1)(+2,−1)、(x−2,y+1)(−2,+1) 和 (x−2,y−1) 共 88 个格子。
输入格式输入一行包含三个正整数 N,M,K分别表示棋盘的行数、列数和马的个数。
输出格式输出一个整数,表示摆放的方案数除以 1000000007 (即 109+7) 的余数。
数据范围对于 5%的评测用例,K=1;对于另外 10%的评测用例,K=2;对于另外 10%的评测用例, ...
毕业履行问题
题目描述小明目前在做一份毕业旅行的规划。
打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。
由于经费有限,希望能够通过合理的路线安排尽可能的省些路上的花销。
给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销。
注意:北京为 1号城市。
输入格式城市个数 n。
城市间的车票价钱 n行 n列的矩阵 m[n][n]。
输出格式输出一个整数,表示最小车费花销。
数据范围1<n≤20,包括北京车票价格均不超过 1000元。
输入样例:
1234540 2 6 52 0 4 46 4 0 25 4 2 0
输出样例:
113
说明共 4个城市,城市 1和城市 1的车费为 0,城市 1和城市 2之间的车费为 2,城市 1和城市 3之间的车费为 6,城市 1和城市 4之间的车费为 5,以此类推。假设任意两个城市之间均有单程票可买,且价格均在 1000元以内,无需考虑极端情况。
解题思路使用状态压缩dp,需要注意我们最后还需要走回1号城市。闫式dp
代码123456789101112131415161718192 ...
数星星
题目描述天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标。
如果一个星星的左下方(包含正左和正下)有 k 颗星星,就说这颗星星是 k 级的。
例如,上图中星星 5 是 3 级的(1,2,4在它左下),星星 2,4 是 1 级的。
例图中有 1个 0 级,2 个 1 级,1 个 2 级,1 个 3 级的星星。
给定星星的位置,输出各级星星的数目。
换句话说,给定 N 个点,定义每个点的等级是在该点左下方(含正左、正下)的点的数目,试统计每个等级有多少个点。
输入格式第一行一个整数 N,表示星星的数目;
接下来 N 行给出每颗星星的坐标,坐标用两个整数 x,y,表示;
不会有星星重叠。星星按 y 坐标增序给出,y 坐标相同的按 x 坐标增序给出。
输出格式N行,每行一个整数,分别是 0 级,1 级,2 级,……,N−1 级的星星的数目。
数据范围1≤N≤15000,0≤x,y≤32000
输入样例:12345651 15 17 13 35 5
输出样例:1234512110
解题思路这个题目如果暴力做就是根据每个星星,遍历判断所有星星,最后得到结果,这样时间复杂度就是O(n ...
城市游戏
题目描述有一天,小猫 rainbow 和 freda 来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地。
这片土地被分成 N×M个格子,每个格子里写着 R 或者 F,R 代表这块土地被赐予了 rainbow,F 代表这块土地被赐予了 freda。
现在 freda 要在这里卖萌。。。它要找一块矩形土地,要求这片土地都标着 F 并且面积最大。
但是 rainbow 和 freda 的 OI 水平都弱爆了,找不出这块土地,而蓝兔也想看 freda 卖萌(她显然是不会编程的……),所以它们决定,如果你找到的土地面积为 S,它们将给你 3×S两银子。
输入格式第一行包括两个整数 N,M,表示矩形土地有 N行 M 列。
接下来 N行,每行 M 个用空格隔开的字符 F 或 R,描述了矩形土地。
每行末尾没有多余空格。
输出格式输出一个整数,表示你能得到多少银子,即(3×最大 F 矩形土地面积)的值。
数据范围1≤N,M≤1000
输入样例:1234565 6R F F F F FF F F F F FR R R F F FF F F F F FF F F F F ...
直方图中最大的矩形
题目直方图是由在公共基线处对齐的一系列矩形组成的多边形。
矩形具有相等的宽度,但可以具有不同的高度。
例如,图例左侧显示了由高度为2,1,4,5,1,3,3的矩形组成的直方图,矩形的宽度都为1:
通常,直方图用于表示离散分布,例如,文本中字符的频率。
现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。
图例右图显示了所描绘直方图的最大对齐矩形。
输入格式输入包含几个测试用例。
每个测试用例占据一行,用以描述一个直方图,并以整数n开始,表示组成直方图的矩形数目。
然后跟随n个整数$h_1,…,h_n$。
这些数字以从左到右的顺序表示直方图的各个矩形的高度。
每个矩形的宽度为1。
同行数字用空格隔开。
当输入用例为n=0时,结束输入,且该用例不用考虑。
输出格式对于每一个测试用例,输出一个整数,代表指定直方图中最大矩形的区域面积。
每个数据占一行。
请注意,此矩形必须在公共基线处对齐。
数据范围$1≤n≤100000,0≤h_i≤1000000000$
输入样例1237 2 1 4 5 1 3 34 1000 1000 1000 10000
输出样例1284000
解 ...
星空之夜
题目链接思路:floodfill每一个星空,然后将联通快hash.**hash:**我们通过计算两点之间的欧式距离,来确定hash**double精度问题:**如果直接计算的话,double会有精度损失问题,我们默认两者之差小于1e7就相同
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105import java.io.*;import java.util.*;class Main{ public static int N = 100,n,m; public static char[][] g = new char[N][N],pg = new char[N][N]; public static in ...
Double精度损失与浮点数二进制表示问题
在Java语言和计算机组成原理中,浮点数的处理和表示都遵循IEEE 754标准。这个标准定义了浮点数在计算机内部如何存储,以及如何转换成二进制形式。下面是关于这两个领域中浮点数处理的总结:
Java中的浮点数Java主要通过两种数据类型来处理浮点数:float和double。
float:
单精度32位IEEE 754浮点数。
提供了大约6-7位十进制的精度。
主要用于节省存储空间,在精度要求不是非常高的场合使用。
double:
双精度64位IEEE 754浮点数。
提供了大约15位十进制的精度。
是Java中处理小数时的默认类型,用于需要高精度的计算。
计算机组成原理中的浮点数存储浮点数在计算机中的存储遵循IEEE 754标准,包含三个部分:符号位、指数位和尾数位。
符号位:决定浮点数的正负。
指数位:表示浮点数的指数部分,使用偏移量(bias)表示以覆盖正负指数。
尾数位:表示浮点数的有效数字部分,通常包含一个隐含的最高位1(对于规范化数)。
浮点数的二进制转换将浮点数转换为二进制涉及以下步骤:
确定符号位:正数为0,负数为1。
将浮点数分解为二进制科学计数 ...
redis实现分布式锁
Redis实现分布式锁这句话基本上是正确的,但是需要一些小的澄清和补充以更准确地描述分布式锁和Redis在其中的作用。
分布式锁锁的作用域和分布式环境确实,传统的Java锁(如synchronized关键字或java.util.concurrent.locks包中的锁)设计用于单个JVM进程内多线程之间的同步。这些锁不能直接用于多个JVM进程之间(即分布式环境中)的同步,因为每个进程拥有自己的内存空间和锁状态,它们之间无法共享这种状态。
Redis实现分布式锁引入Redis来实现分布式锁是一种流行的做法,确实可以利用Redis的某些特性来实现跨多个进程的同步。Redis的操作通常是原子性的,这意味着每个命令在执行过程中不会被其他命令中断。加之Redis是单线程的,保证了在任何给定时间内只执行一个命令,这为实现分布式锁提供了基础。
Redis单线程的特点虽然Redis是单线程的,但是“利用Redis单线程的特点来实现分布式锁”这句话可能会造成一些误解。实现分布式锁的关键不仅仅在于Redis的单线程模型,而更在于它提供的命令可以被用来原子性地创建锁。例如,SET key value NX ...
限流器
lua实现分布式限流器这一部分主要是整理一下使用redis实现限流器的功能。因为我们限流功能可能会涉及到多个redis语句使用,虽然redis是单线程的,但是在分布式环境下还是会出问题。所以这里我们使用了lua脚本执行redis语句保证操作的原子性。
固定窗口限流器固定窗口限流器是最简单粗暴的一种限流器实现方法,其实就是在固定时间点之间只允许固定的访问次数,但是在临界时间点会出问题,在临界一秒内可能发送两倍固定次数的问题。
代码实现
主要思想就是使用incr key来一步步增加对应key的值,只要超过了那就超过访问次数了。如果是第一次访问,也就是incr key的时候返回1,这个时候我们就需要设置一下这个键的过期时间。需要注意,我们读取文件需要隔绝空字符,不然的话lua脚本会报错。
1234567891011121314151617181920212223242526272829303132333435363738public class LimitRequest { @Autowired JedisPool jedisPool; public boo ...