k-way合并分而治之?

时间:2012-09-15 23:49:41

标签: algorithm divide-and-conquer

  

这个想法是递归地合并第一个k / 2列表和第二个   k / 2列表,然后将两个合并列表合并为一个列表并返回。

我对将第一个k / 2与第二个k / 2列表递归合并意味着什么感到困惑。 任何人都可以澄清这一点,或者可以通过一些解释这种递归的伪代码吗?

1 个答案:

答案 0 :(得分:3)

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))。