工作的时候遇到一个倒排序列的归并问题。当然:每个序列都是有序的,这里我们令有序为从小到大排序。思考时,其主要有几点归并要求:
1、归并求不同路的交集的时候交集个数越大越好。
2、只有当结果数不满足排序需求的时候才去求归并的并集。
3、在每一路中可能存在相同的元素。
代码中在归并的时候使用了 败者树 这一思想来实现。具体:(假设归并的路数为N,每一路的元素个数为M)
1、建立一个大小为N的败者树T。
2、扫描T中的root节点,记录与root节点key相同的节点数。中序遍历。存入 *TempData中。
3、计算 *TempData 的权重值,更新TopK中的K数组(参考上一篇文章:TopK算法及实现)。
4、更新败者树T。
5、直到数据全部处理完成。
上述的时间复杂度为 N * M * logN。