这个想法是递归地合并第一个 k/2 个列表和第二个 k/2 个列表,然后将两个合并的列表合并为一个列表并返回。
我对递归合并第一个 k/2 和第二个 k/2 列表意味着什么感到困惑。任何人都可以澄清这一点,或者可以查看一些解释这种递归的伪代码吗?
这个想法是递归地合并第一个 k/2 个列表和第二个 k/2 个列表,然后将两个合并的列表合并为一个列表并返回。
我对递归合并第一个 k/2 和第二个 k/2 列表意味着什么感到困惑。任何人都可以澄清这一点,或者可以查看一些解释这种递归的伪代码吗?
List recursiveMerge(List[] lists)
{
// Easy to solve problem for up to length 2
if (lists.length < 1)
{
return new List();
}
if (lists.length == 1)
{
return lists[0];
}
if (lists.length == 2)
{
return baseMerge(lists[0], lists[1]);
}
// For longer lengths split the array into two
int half = lists.length / 2;
List[] firstHalf = new List[half];
List[] secondHalf = new List[lists.length - half];
System.arraycopy(lists, 0, firstHalf, 0, firstHalf.length);
System.arraycopy(lists, firstHalf.length, secondHalf,
0, secondHalf.length);
// Solve the problem separately in each sub-array
List a = recursiveMerge(firstHalf);
List b = recursiveMerge(secondHalf);
// and produce a combined solution
return baseMerge(a, b);
}
如果您从 N 个列表 0,1,2,3... 开始,那么在递归树的底部,我们将 0 与 1 合并,将 2 与 3 合并,将 4 与 5 合并,等等。下一步将 0+1 与 2+3 合并,将 4+5 与 6+7 合并,以此类推。因此,如果有 N 个列表,则树中有 lg(N) 个级别,每个级别处理每个数据点一次。因此,如果有 N 个总长度为 L 的列表,则成本为 O(L log(N))。