当前位置: 首页 > 知识库问答 >
问题:

为什么分而治之比归并K排序表更快

姬高澹
2023-03-14

我正在使用方法5:合并和分治来解决leetcode中的合并K排序问题。该算法速度非常快,大约需要100毫秒。但是,我不明白为什么reduce方法的运行时间要慢得多(4000毫秒)。

这里是代码差异:

# reduce
import functools
return functools.reduce(_mergeTwoLists, lists)

# divide and conquer
step = 1
while step < num:
   for i in range(0, num - step, step * 2):
       lists[i] = _mergeTwoLists(lists[i], lists[i + step])
   step *= 2
   return lists[0]

如果分而治之是在并行中运行,我可以理解分而治之为什么更快,但我想它应该仍然是线性运行的,对吗?

我还写了另一个昂贵的版本的合并测试差异:

  def add(a, b):
       tmp = 0
       for i in range(1, 5000):
           tmp += i
       return a + b 

这个减少分治的版本运行时间几乎相同。

是否存在reduce无法处理的合并K排序列表测试用例?在《分而治之》中,我缺少了什么吗?

共有1个答案

西门靖琪
2023-03-14

这两种方法的复杂性是不同的。二次合并是O(mn),其中m和n是两个列表的长度。

分而治之需要O(log N-log J)次迭代(N=元素总数,J=我们开始的子列表长度),每次迭代都是O(N),因为每个元素正好涉及一个合并-

reduce需要N/J-1步的复杂度O(2J),O(3J),O(4J)。所以总的复杂度是O(N^2/J)

请注意,在这两种情况下,两次合并的总数是相同的,不同之处在于分治合并的平均成本更低。

这与您的观察一致,即用加法替换二重合并会产生大致相等的运行时间,因为加法的成本基本上与操作数无关(我想你是在加数,而不是列表?)尤其是当它被燃烧时间循环淹没时。

 类似资料:
  • 我有一个问题,试图实现一个算法使用分而治之。 给定一个未排序的数组tv[]查找该数组的de v[k]元素,就好像该数组已排序,但没有对数组v排序一样。 例如,如果k=3且v={2,-1,-6,7,4},则该数组的k元素为2。 因为我无法编辑传递的数组,所以我无法想出另一种方法来对数组进行排序,而不将其保存在另一个局部变量上,或者尝试像快速排序一样分割数组,并返回v的最后一个元素的位置。 如果有帮助

  • 我正在维基百科上阅读关于外部排序的文章,我需要理解为什么两阶段合并比一阶段合并更有效。 Wiki:但是,单次合并有一个限制。随着区块数量的增加,我们将内存分成更多的缓冲区,因此每个缓冲区都较小,因此我们必须进行许多较小的读取,而不是较少的较大读取。 因此,对于100 MB内存中的50 GB的排序,使用单个合并过程是没有效率的:磁盘需要用500个数据块中的每个数据块(我们一次从每个数据块读取100M

  • 本文向大家介绍C#递归算法之分而治之策略,包括了C#递归算法之分而治之策略的使用技巧和注意事项,需要的朋友参考一下 1.分而治之的概念       分而治之是一种使用递归解决问题的算法,主要的技巧是将一个大的复杂的问题划分为多个子问题,而这些子问题可以作为终止条件,或者在一个递归步骤中得到解决,所有子问题的解决结合起来就构成了对原问题的解决 2.分而治之的优点和缺点   分而治之算法通常包括一个或

  • 归并排序 思路说明 归并操作过程: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针达到序列尾 将另一序列剩下的所有元素直接复制到合并序列尾 上述说法是理论表述,下面用一个实际例子说明: 例如一个无序数组[6,2,3,1

  • 本文向大家介绍C#排序算法之归并排序,包括了C#排序算法之归并排序的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C#实现归并排序具体代码,供大家参考,具体内容如下 代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我发现 比 Python 2 和 3 中的函数慢。 Python 2 蟒蛇 3 为什么<code>max</code>(<code>O(n)</code>)比<code>sort</code>函数(<code<O(nlogn)</code>)慢?