Arrays Ruby—检查数组中两个数字之和是否等于一个值的有效方法

Arrays Ruby—检查数组中两个数字之和是否等于一个值的有效方法,arrays,ruby,performance,loops,Arrays,Ruby,Performance,Loops,这是我的问题:我有一个28123个需要迭代的数字的列表,还有一个6965个其他数字的数组,用于检查两个数字的总和(可以是相同的数字)是否与28123个数字中的每一个都相等。我想将它们放入一个新数组中,或者将它们标记为true/false。到目前为止,我提出的任何解决方案都是极其低效的 因此,我想要的是一个简化版本,如果我有以下内容:array=[1,2,5],数字1到5将返回result=[2,3,4]或result=[false,true,true,true,false] 我读到了这个问题:但

这是我的问题:我有一个28123个需要迭代的数字的列表,还有一个6965个其他数字的数组,用于检查两个数字的总和(可以是相同的数字)是否与28123个数字中的每一个都相等。我想将它们放入一个新数组中,或者将它们标记为
true
/
false
。到目前为止,我提出的任何解决方案都是极其低效的

因此,我想要的是一个简化版本,如果我有以下内容:
array=[1,2,5]
,数字
1到5将返回
result=[2,3,4]
result=[false,true,true,true,false]

我读到了这个问题:但我需要一些更有效率的东西,或者是一种不同的方法来解决这个问题。对于两个相同的数字加在一起似乎也不起作用

非常感谢您的帮助

非富足数(n)
是一个返回前n个非富足数的函数。它几乎是瞬间执行的

我的代码:

def contains_pair?(array, n)
  !!array.combination(2).detect { |a, b| a + b == n }
end

result = []
array = non_abundant(6965)

(1..28123).each do |n|
  if array.index(n) == nil
    index = array.length - 1
  else
    index = array.index(n)
  end
  puts n
  if contains_pair?( array.take(index), n)
    result << n
  end
end
def包含_对?(数组,n)
!!数组.组合(2).检测{| a,b | a+b==n}
结束
结果=[]
数组=非冗余(6965)
(1..28123)|
如果数组索引(n)=nil
index=array.length-1
其他的
索引=数组。索引(n)
结束
放n
if包含_对?(数组.take(索引),n)

结果算法最低效的部分是,您正在重新计算许多可能的组合和,28123次。您只需执行一次

下面是对代码的一个非常简单的改进:

array = non_abundant(6965)
combination_sums = array.combination(2).map {|comb| comb.inject(:+)}.uniq

result = (1..28123).select do |n|
  combination_sums.include? n
end
您的算法的其余部分似乎是试图补偿重新计算总和这一原始性能错误,而这一错误不再需要

您还可以进行进一步的优化,例如使用二进制搜索。但我猜这种改进已经足够满足你的需要了

numbers = [1, 2, 5]
results = (1..10).to_a

numbers_set = numbers.each_with_object({}){ |i, h| h[i] = true }

results.select do |item|
  numbers.detect do |num|
    numbers_set[item - num]
  end
end
#=> [2, 3, 4, 6, 7, 10]
您可以通过对数字进行排序并检查
num
是否大于
item/2
来添加一些优化

复杂性为
O(n*m)
,其中
n
m
是两个列表的长度


另一个优化是,如果数字列表长度小于结果列表(
n),这似乎是一个集合的工作,因为你可以获得比使用数组更高效的查找。我对ruby相当陌生,还没有使用过集合。我在集合上寻找什么方法?通过“两个数字”你指的是两个数字的总和,对吗?是的。打字错误。现在已修复。标题上写着“两个不同的数字”,这与“任意两个数字(可以是同一个数字)”相矛盾。我将
uniq
改为
改为\u set
(并且
在开始时需要“set”
),这可以极大地提高性能。