使用memoization在ruby数组中存储值

时间:2016-10-24 17:16:47

标签: arrays ruby memoization

对于短阵列,以下功能运行良好。它应该返回第一个数组对,其中和是等于给定的整数。但是,如果数组的长度超过1000万个元素,则请求超时,因为(我认为)在第一行中创建的变量中存储了数千个值。我知道我必须使用memoization(|| =)但不知道如何使用它。

array1 = [1,2,3,4,5,6,7]
number = 3
array2 = [1,2,3.....n] # millions of elements
combos = array1.combination(2).to_a
(combos.select { |x,y| x + y == number }).sort.first

我需要收集所有可能的对来对它们进行排序,我使用select遍历整个列表而不是停在第一对返回true的对。

2 个答案:

答案 0 :(得分:1)

这是可能的解决方案之一。

def sum_pairs(ints, s)
  seen = {}
  for i in ints do
    return [s-i, i] if seen[s-i]
    seen[i] = true
  end
  nil
end

答案 1 :(得分:0)

def find_smallest(arr, nbr) 
  first, *rest = arr.sort
  until rest.empty?
    matching = rest.bsearch { |n| n == nbr - first }
    return [first, matching] unless matching.nil?
    first, *rest = rest
  end
  nil
end

arr = [12, 7, 4, 5, 14, 9]

find_smallest(arr, 19) #=> [5, 14]
find_smallest(arr, 20) #=> nil

我使用方法Array#bsearch(而不是Enumerable#find来加速搜索等于nbr - first(O(log rest.size)与O的元素(rest.size))。