【发布时间】:2014-12-02 12:12:44
【问题描述】:
我正在尝试提出一种分而治之的算法,用于将 j 个排序列表与 n 个元素合并,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望它比这样的合并算法更有效:
合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表等合并,这需要 O(j * jn)。
【问题讨论】:
标签: algorithm merge divide-and-conquer
我正在尝试提出一种分而治之的算法,用于将 j 个排序列表与 n 个元素合并,但我被卡住了;我不知道如何把这个问题分成更小的子问题。我希望它比这样的合并算法更有效:
合并前两个列表;然后将结果列表与第三个列表合并;然后将结果列表与第四个列表等合并,这需要 O(j * jn)。
【问题讨论】:
标签: algorithm merge divide-and-conquer
你可以在 O(j*log(j)n) 时间内完成
while(n!=1)
for i=0 to n/2
merge list(i) with list list(n)
n = n/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();
}
【讨论】:
这与标准的归并排序没有什么不同。考虑一个大小为jn 的列表,其中包含未排序的项目。在大小为jn 的项目列表上进行log(n) 迭代后,您将拥有j 排序列表,每个列表中有n 项目。因此,请继续使用归并排序来解决您的问题。
请查阅归并排序,这是一种分而治之的算法,并理解它。这样你就可以轻松解决这个问题了。
【讨论】: