Algorithm 算法通过在一个大数组中添加任意2个元素来获得一个不包含重复项的新列表

Algorithm 算法通过在一个大数组中添加任意2个元素来获得一个不包含重复项的新列表,algorithm,Algorithm,我只能想到这种幼稚的算法。还有更好的办法吗?C/C++,Ruby,Haskell还可以 arry = [1,5,.....4569895] //1000000 elements ,sorted , no duplicated newArray = Hash.new for (i = 0 ; i < arry.length ;i++ ) { for (j = 0 ; j < arry.length ;j ++ ) { elem

我只能想到这种幼稚的算法。还有更好的办法吗?C/C++,Ruby,Haskell还可以

arry = [1,5,.....4569895] //1000000 elements ,sorted , no duplicated
newArray = Hash.new
for (i = 0 ; i < arry.length ;i++ )
{
       for (j = 0 ; j < arry.length ;j ++ )
       {
                elem = arry[i] + arry[j]
                if (! newArray.key?(elem))
                {
                    newArray [elem] = arry[i] + arry[j]
                }

       }

}
arry=[1,5,…4569895]//1000000个元素,已排序,无重复
newArray=Hash.new
对于(i=0;i

编辑:对不起。我在数组中有离散值,而不是[1..1000000]

如果条件说您应该能够在范围中添加任何项,那么我能想到的唯一方法是检查总和是否还不在结果列表中。因为对于任何数字x,都有x个不同的加法导致x。(如果您认为1+2和2+1是相同的加法,则可以使用x/2)。

有一个明显的优化:将第二个循环从标记i开始,这样可以避免使用x+y和y+x


然后,如果您不想使用集合,您可以使用项目已排序的事实,这样您可以构建N个列表,并在删除重复项的同时合并它们。

恐怕最坏情况下的时间复杂度是O(n2)。对于输入{20,21,22,…},添加这些数字不会得到任何重复。假设散列插入是O(1),您已经有了最好的算法…

将算法分为两个不同的步骤会更有效。(警告:前面有伪代码)

首先通过将其余元素添加到第i个元素来创建n-1个列表。这可以为每个列表并行完成。请注意,结果列表将被排序

newArray = array(array.length);
for (i = 0 ; i < array.length ;i++ ) {
  newArray[i] = array(array.length - i - 1);
  for (j = 0; j < array.length - i; j++) {
    newArray[i][j] = array[i] + array[j + i];
  }
}
newArray=array(array.length);
对于(i=0;i

第二个用于合并结果列表。您可以并行执行此操作,例如合并newArray[0]-newArray[i]、newArray[2]-newArray[1-i]、。。。请注意,您可以为(j=i;…)优化内部

您应该更好地解释您拥有什么以及您想要什么在我的解释中:[1,3,5,7]->[1+3,1+5,1+7=3+5,3+7,5+7]=[4,6,8,10,12]这是一个非常有趣的问题。根据数组的值,您可以在新数组中获得少于最坏情况下的10^12个元素,对于给定的示例,它可以是大约9*10^6个元素。也许另一种方法是一种选择,首先生成最大值的所有数字,然后查找值paris,其和就是搜索值。在使用二进制搜索的最坏情况下,它有O(N^2*logn),但可能是(N*logn)。只需在列表中添加数字,就已经是O(n2)了,不是吗?