合并排序文件所需的比较总数

时间:2011-09-06 06:52:17

标签: algorithm merge mergesort

鉴于包含15,3,9和8条记录的4个已排序文件,将它们合并到单个已排序文件中所需的比较总数是多少?

假设我们正在使用合并步骤(来自合并排序)。

我知道合并步骤需要O(N)时间才能执行。但它做了多少次比较?

7 个答案:

答案 0 :(得分:3)

如果您假设您使用典型合并排序中的合并步骤,则意味着您一次只能合并2个列表,这会使事情变得更简单。我们需要至少3次合并才能将4个列表转换为1.我们可以拆分列表,但这会丢弃信息,我们最终只需将它们合并,所以我怀疑这有帮助(没有证明它。)

唯一的问题是合并列表的顺序。合并来自两个列表的总共k个元素的最坏情况的比较数是k-1 [*],因此我们希望最小化所有合并中的元素总数。我认为(再次,没有证明)在这种情况下,这是通过从最小到最大的成对合并来完成的,即8+3然后11+9然后20+15。在最坏的情况下,这总共是10+19+34 = 63个记录比较。

一个不那么狡猾的合并选择,比如15+3然后8+9然后18+17,在最坏的情况下需要更多的比较(67),但你不会在开始之前需要知道列表的长度。

[*]归纳证明:

当k = 1时,需要进行0次比较,因为我们有一个空列表和一个长度为1的列表。

假设对于总长度j的列表是正确的(对于某些j> = 1)。然后在最坏的情况下,要合并两个长度为j + 1的排序列表,我们首先比较两侧的最小元素,删除较小的元素并将其推入输出列表。剩下的就是合并两个列表中剩下的内容,即总长度j。我们可以通过归纳假设在最坏的j-1比较中做到这一点。因此,总共j + 1个元素在最坏的情况下需要j比较,从而完成归纳。

答案 1 :(得分:0)

每一步都需要知道4个文件中当前最小的元素。换句话说,我们需要知道四个元素a,b,c,d中最小的一个。因此,一种天真的方式是对每一步使用三个比较(a和b,c和d,ab和cd中较小的一个)。所以总体比较是 3 * N (N是记录总数)。

答案 2 :(得分:0)

如同Mu Qiao的回答(为方便起见,这里稍作重复),我们可以通过在每一步取最小值a,b,c,d来合并列表。这最多需要3次比较:比较a和b,比较c和d并比较{a,b}和{c,d}的最小值。我们可以简单地看到这是我们能做的最好的事情,因为2次比较是不够的。

假设我们耗尽了一个清单。让我们假设这个列表是d而不失一般性。现在比较a,b,c我们可以比较a和b然后比较最小值或{a,b}到c。我们可以看到,由于1比较不充分,我们不能做得更好。

当有两个列表时,我们显然需要1个比较,当有一个列表时,我们显然不需要比较。

从这里,我们可以做出最坏的案例分析。我们可以看到更多的非耗尽列表导致更多的比较,因此,我们可以看到最坏的情况是在列表耗尽之前处理大多数项目。

在这种情况下,在列表耗尽之前将进行最多14+2+8+7 = 31次比较。从那里开始,每个处理的项目都会有一个列表耗尽。因此,我们将最差情况下的比较数量设为31*3 + 2 + 1 + 0 = 96

答案 3 :(得分:0)

如果我们要合并两个列表,则合并过程最多需要n1 + n2个比较,其中n1n2是列表的长度。

有4个列表,总数将取决于我们在此合并中使用的顺序: 即我们可以合并list1和list2,然后将结果与list3合并,然后合并到list4;或者我们可以合并list1和list2,并合并list3和list4,然后合并2个结果。

在这种情况下,很容易确定这是最佳策略:

(list1 <-> list2) <-> (list3 <-> list4)          (<-> stands for merge)

哪个是最大比较数?很容易回忆起始公式:

(15 + 3) + (9 + 8) + ((15+3) + (9+8)) = 18 + 17 + 18 + 17 = 70

答案 4 :(得分:0)

两个大小为mn的文件所需的比较总数

m + n - 1 

因此,上面我们要求

15 + 3 -1 = 17 

8 + 9 -1 = 16

17 + 16 -1 = 32 

答案 5 :(得分:0)

合并2个排序列表的最坏情况发生在两个列表非空 最大时间的情况下。在这种情况下,使用15,3,9和8个元素,我们进行了3次比较以找到最小元素(4个元素和选择排序进行3次比较)。在最坏的情况下想象:我们在每个列表中留下了3,3,3和3个元素。直到这一点,比较次数为:(12 + 0 + 6 + 5)* 3 = 69.现在剩余的(3,3,3,3)列表将它们减少为(2,2,2,2)个元素(所以4 * 3 = 12次比较)。再次使用4 * 3 = 12比较将(2,2,2,2)减少到(1,1,1,1)。现在通过3次比较将(1,1,1,1)减少到(0,1,1,1)。现在通过2次比较将(0,1,1,1)减少到(0,0,1,1)。现在使用1比较将(0,0,1,1)减少到(0,0,0,1)。现在通过0比较将最后一个元素添加到排序列表中。因此总比较:69 + 12 + 12 + 3 + 2 + 1 + 0 = 99比较。

答案 6 :(得分:0)

我认为我们可以大致概括一下答案。给定n个长度为k1,k2,...,kn的列表,然后在Big Oh表示法中,最坏的情况以O((n-1)(k1 + k2 + k3 ... + kn))为界。我从CLRS的问题(第2章的问题2-1)中得到了这个想法。