Lab1
我们需要实现一个Reassembler,来对乱序的字节流重排,问题可以抽象为:在世界上存在一个字符串,我们叫这个字符串为本源字符串,最初时我们无法观测到这个字符串,现在给出若干个[l,r]区间,每次提供字符串[l,r]区间内字符的信息
一个信息三元组:(l:int,r:int,data:string),表示我观测到了这个本源字符串的[l,r]区间内的子串是data,如果在某个时刻,本源字符串的某个前缀已经被我全部观测到了,那么就可以把这一段前缀交给Writer了
例如:
[1,2]: bc // *bc***
[4,5]: ef // *bc*ef
[1,1]: b // *bc*ef
[0,1]: ab // abc*ef
向Writer中写入abc
实现
可以用set维护每一个已知连续区间[l,r]以及这一段区间对应的字符串data,支持新加入一个区间时对区间进行合并操作
更劣的实现
尝试把字符串映射到[0,capacity)
这个区间上,用一个循环数组维护,每一次添加字符时,遍历整个字符串,把字符一个一个搬运到循环数组对应位置上
效果
在我的虚拟机上:
措施 | 吞吐量 |
---|---|
平凡的实现 | 3.56 Gbit/s |