【问题标题】:merge sorted lists合并排序列表
【发布时间】:2014-12-02 12:12:44
【问题描述】:

我正在尝试提出一种分而治之的算法,用于将 j 个排序列表与 n 个元素合并,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望它比这样的合并算法更有效:

合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表等合并,这需要 O(j * jn)。

【问题讨论】:

    标签: algorithm merge divide-and-conquer


    【解决方案1】:

    你可以在 O(j*log(j)n) 时间内完成

    while(n!=1)
        for i=0 to n/2
            merge list(i) with list list(n)
        n = n/2
    

    这样你将整个组合并成对,然后成对成对,依此类推

    【讨论】:

      【解决方案2】:

      不知道为什么需要分而治之来实现这一目标。您可以只创建一个无序的大列表,然后使用内置排序对大列表进行排序,即 O(jn*Log(jn))

          List<int> returnList(List<List<int>> lists)
          {
              List<int> ret = new List<int>();
              for(int i=0;i<lists.Length;i++)
              {
                  for(int j=0;j<lists;j++)
                  {
                      ret.Add(lists[i][j]);               
                  }
              }
              ret.Sort();
          }
      

      【讨论】:

        【解决方案3】:

        这与标准的归并排序没有什么不同。考虑一个大小为jn 的列表,其中包含未排序的项目。在大小为jn 的项目列表上进行log(n) 迭代后,您将拥有j 排序列表,每个列表中有n 项目。因此,请继续使用归并排序来解决您的问题。

        请查阅归并排序,这是一种分而治之的算法,并理解它。这样你就可以轻松解决这个问题了。

        【讨论】:

          猜你喜欢
          • 2012-01-18
          • 2020-10-25
          • 1970-01-01
          • 2010-09-05
          • 2011-05-17
          • 2015-05-12
          • 2015-12-17
          • 2010-11-12
          • 1970-01-01
          相关资源
          最近更新 更多