社区讨论
关于fhq随机merge的复杂度?
学术版参与者 8已保存回复 12
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 12 条
- 当前快照
- 1 份
- 快照标识符
- @m0ohqbvj
- 此快照首次捕获于
- 2024/09/05 07:29 2 年前
- 此快照最后确认于
- 2025/11/05 00:25 4 个月前
mnzn写平衡树时突发奇想,觉得左偏树既然可以通过随机数来随机合并,是否fhq merge时也可以通过随机数来决定merge顺序
CPPint merge(int x,int y) {
if(!x || !y) return x | y;
down(x); down(y);
if(rd() & 1) {tr[x].r = merge(tr[x].r,y); up(x); return x;}
else {tr[y].l = merge(x,tr[y].l); up(y); return y;}
}
然后他就 TLE 了,更改为
CPPif((tr[x].rk > tr[y].rk))
就不会TLE,考虑过是否是因为取随机数常数太大,因此写过提前生成随机数序列
CPPif(rd[ctr = (ctr + 1 >= N ? 0 : ctr + 1))
还是会TLE,又尝试了有些直接 0 / 1轮流merge,反而会更快 ?
CPPif(rdg ^= 1)
输出了一下,发现以上三种方式构造的平衡树都极度不平衡
所以这和提前用 rk 规定好顺序有什么区别 ?
为什么左偏树可以随机合并但平衡树不行 ?
回复
共 12 条回复,欢迎继续交流。
正在加载回复...