1 给一棵树,查询任意两个结点是否有祖先关系,
1)只查一次
lca,如果返回值是给定的两个结点之一,有祖先关系,否则无祖先关系。
2)任意多次查询
DFS 序,做dfs,记录每个结点进入和离开的时间(不必是真的时间戳,一个整数就好)
time = 0
def dfs(v):
l[v] = ++time
for child in G[v]:
dfs(child)
r[v] = time
def isParent(x, y):
return l[x] <= l[y] and r[x] >= r[y]
2 一个server 不停的处理请求,查询在一定时间范内(1周内,一天内)任意两个时刻之间的请求次数
用deque,保存一周内的请求时间戳,是一个有序数组。头用来过期,尾用来加新的request。所求 answer = ceiling(t2) - ceiling(t1)), 这里ceiling是大于等于t 的第一个值的下标
至于什么时候过期,可以单独一个线程,也可以查询时候或者加request的时候查询,O(1)的操作。其实这就是一个有序系统(排序数组,平衡树)的range Count问题
后续更新:request log是server的最基本的数据,天然按时间排序
3. 一个server 不停的处理请求,实时显示RPS (request per second),或者1分钟内、1小时内的请求数
也是维护一个deque,保存1秒/1分/1小时内的请求时间戳,answer = deque.size()。主要是过期什么时候做的问题,刷新RPS的时候或者单独一个线程。
更新:也是基于request log, rangeCount(now - 1, now)
4. 简单流控实现
class RPSControl {
private DateTime start = DateTime.MIN_VALUE;
private int maxRPS,count = 0;
public RPSControl(int maxRPS) {this.maxRPS = maxRPS;}
public boolean accept(DateTime requestTime) {
if (requestTime - start > 1000) {
start = requestTime;
count = 1;
return true;
}
else {
if (count == maxRPS) return false;
else {
++count;
return true;
}
}
}
}