TriMerge vs Merge Sort

时间:2015-10-12 19:21:36

标签: sorting time-complexity mergesort

有人可以告诉我两种算法TriMergeSortMergeSort哪个更好。
MergeSort的时间复杂度将是nlogn base 2.
TriMergeSort的时间复杂度是nlogn base 3.

由于TriMergeSort是基数3而MergeSort是基数2,我认为TriMergeSortMergeSort更快。

如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:2)

虽然你是正确的,在常规mergesort的情况下递归结构中的级别数是log 2 n,而在三个情况下是log 3 n方式mergesort,重要的是要记住每个级别完成的工作随着级别数量的增加而增加。具体来说,在合并步骤中,您需要从普通的双向合并切换到特殊的3向合并。在合并的每个步骤中,您需要确定哪个列表具有最小的未使用元素。在双向合并中,您只需将两个列表的前面元素相互比较。在三向合并中,需要进行更多的比较,因为您必须找到三个元素中的最低元素。

将其推广到k-way mergesort,层数将为log k n,但合并的工作量将高于此值。通过使用二进制堆,可以在时间O(n log k)中对n个元素进行k路合并,因此随着k的增加需要做更多的工作。

有趣的是,如果我们谈论整体所需的工作量,那么我们可以看到我们需要跨log k n级别进行O(n log k)工作。这给了我们总运行时间O(n log k log k n)。使用对数的基数变化公式,即log k n = log 2 n / log 2 k,我们看到运行时将是

  

O(n log k log k n)

     

= O(n log k(log n / log k))

     

= O(n log n)

换句话说,当你选择不同的k值时,算法之间没有渐近的差异。由于较高的分裂因子导致的水平下降被每个级别的工作量增加所抵消。

要确定哪种算法最好,最好的选择是运行它们,看看会发生什么。由于缓存效果和参考位置,我怀疑答案可能在某种程度上取决于您使用的特定架构。

答案 1 :(得分:1)

就Big-O的复杂性而言,它并不重要。

常规合并排序为n * log_2(n),相当于n * (log(n) / log(2))log(2)是常量,因此合并排序只是n * log(n)

三合并排序是n * log_3(n),它使用相同的逻辑进行常规合并排序,只是n * log(n)

鉴于两者都减少到O(n * log(n)),实际上不可能说更好

另一种方式来证明为什么你不能假设三合并更好:

假设3向合并优于双向合并 通常,假设(N + 1)-way合并优于N路合并。

如果这是真的,最好使用N路合并,其中N是您要排序的元素数量。但是,合并步骤需要从N个源中选择最少的元素,这需要O(N)时间 这意味着N路合并排序在O(N^2)时间内运行,有效地使其成为selection sort