一些系统设计题

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;
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值