CS144-Lab1

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