通常将两个数组合并在一起

时间:2014-03-29 06:07:22

标签: arrays data-structures merge

如果A1 = {10, 20, 30, 40, 50, 60}A2 = {15, 25, 35, 45}是两个数组,那么合并两个数组所需的比较数是多少?

我的意见解决了这个问题

合并15,比较2就足够了, 所以它现在看起来像

A1 = {10, 15, 20, 30, 40, 50, 60}; A2 = {25, 35, 45}

合并25,比较4就足够了, 所以现在它看起来像

A1 = {10, 15, 20, 25, 30, 40, 50, 60}; A2 = {35, 45}

合并35,6比较就足够了, 所以现在它看起来像

A1 = {10, 15, 20, 25, 30, 35, 40, 50, 60}; A2 = {45}

合并45,8比较就够了, 所以现在它看起来像

A1 = {10, 15, 20, 25, 30, 35, 40, 45, 50, 60}

因此,20次比较就足够了。 但事实并非如此。

你怎么说?

2 个答案:

答案 0 :(得分:0)

它就像两行人,你是银行出纳员。只要在各自的前面有两个人,你必须比较它们来决定采取哪一个。在一行为空之后,您可以附加其他行中的所有剩余人员而不进行比较。 (这个比喻假设输入是链接列表。如果你要合并数组,那么必须复制另一行的尾部,答案是不同的。)

考虑到所有这些因素,不难发现比较的数量取决于您合并的价值。它至少是min(m,n),其中m和n是输入的长度。最大值是m + n - 1.

答案 1 :(得分:0)

您不会比较(每次)数组中的元素0.从合并两个数组时,您可以使用一个额外的数组来保存元素,因为它们是排序和合并的。

在您的情况下,您保留第三个数组 - B其中B.length = A1.length+A2.length

数组和相应的数字比较的合并如下所示: -

A1[0]<A2[0] --> B[0] = A1[0]
A1[1]>A2[0] --> B[1] = A2[0]  // total number of comparisons is 2

A1[1]<A2[1] --> B[2] = A1[1]
A1[2]>A2[1] --> B[3] = A2[1] // total number of comparisons is 4

A1[2]<A2[2] --> B[4] = A1[2]
A1[3]>A2[2] --> B[5] = A2[2] //total number of comparisons is 6

A1[3]<A2[3] --> B[6] = A1[3]
A1[4]>A2[3] --> B[7] = A2[3] //total number of comparisons is 8

在此之后,B中没有剩余元素。因此,我们复制B中的其余元素。

结果数组如下: -

B = {10,15,20,25,30,35,40,45,50,60}

因此,比较总数为8而不是20。