有效排序的笛卡尔积的2个排序整数数组

时间:2010-11-28 22:20:14

标签: arrays algorithm cartesian-product sorted

需要提示来设计一种有效的算法,该算法采用以下输入并吐出以下输出。

输入:两个整数A和B的排序数组,每个长度为n

输出:一个排序数组,由数组A和B的笛卡尔积组成。

For Example: 

Input:
A is 1, 3, 5
B is 4, 8, 10
here n is 3.

Output:
4, 8, 10, 12, 20, 24, 30, 40, 50

以下是我尝试解决此问题的方法。

1)鉴于输出为n ^ 2,有效算法不能比O(n ^ 2)时间复杂度更好。

2)首先,我尝试了一种简单但效率低下的方法。生成A和B的笛卡尔积。它可以在O(n ^ 2)时间复杂度下完成。我们需要存储,所以我们可以对它进行排序。因此O(n ^ 2)空间复杂度也是如此。现在我们排序n ^ 2个元素,这些元素不能比O(n ^ 2logn)做得更好,而不对输入做任何假设。

最后我有O(n ^ 2logn)时间和O(n ^ 2)空间复杂度算法。

必须有更好的算法,因为我没有使用输入数组的排序特性。

2 个答案:

答案 0 :(得分:3)

如果有一个比O更好的解决方案( n ²log n ),它需要做的不仅仅是利用A和B已经排序的事实。请参阅我对this question的回答。


Srikanth想知道如何在O( n )空间中完成此操作(不计算输出的空间)。这可以通过懒惰地生成列表来完成。

假设我们有A = 6,7,8且B = 3,4,5。首先,将A中的每个元素乘以B中的第一个元素,并将它们存储在列表中:

  

6×3 = 18,7×3 = 21,8×3 = 24

找到此列表中的最小元素(6×3),输出它,用A中的元素替换为B中的下一个元素:

  

7×3 = 21, 6×4 = 24 ,8×3 = 24

找到此列表的新最小元素(7×3),输出并替换:

  

6×4 = 24,8×3 = 24, 7×4 = 28

等等。我们只需要O( n )空间用于此中间列表,如果我们将列表保存在{{},那么在每个阶段找到最小元素需要O(log n )时间{3}}

答案 1 :(得分:0)

如果将A的值与B的所有值相乘,则结果列表仍会排序。在您的示例中:

A是1,3,5

B是4,8,10

1 *(4,8,10)= 4,8,10

3 *(4,8,10)= 12,24,30

现在您可以合并两个列表(与合并排序完全相同)。您只需查看两个列表头并将较小的一个放在结果列表中。所以在这里你会选择4,然后是8然后是10等。 结果= 4,8,10,12,24,30

现在你对结果列表做同样的事情,下一个剩余的列表合并4,8,10,12,24,30与5 *(4,8,10)= 20,40,50。

如果两个列表具有相同的长度,合并最有效,则可以通过将A分为两部分来修改该模式,对两个部分进行递归合并,并合并两个结果。

请注意,您可以使用合并方法节省一些时间,因为不需要对A进行排序,只需要对B进行排序。