【问题标题】:Using memoization for storing values in ruby array使用 memoization 在 ruby​​ 数组中存储值
【发布时间】:2016-10-24 17:16:46
【问题描述】:

对于短数组,以下函数运行良好。它应该返回总和等于给定整数的第一个数组对。但是,如果数组的长度超过 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 的第一对。

【问题讨论】:

  • 什么是INTEGERARRAY 是什么?你在那儿做什么?为什么不用find 而不是select + first
  • 我修改了代码。我没有使用检测或查找,因为一旦找到第一个 true,它们就会停止迭代。
  • 但无论如何你都想找到第一次出现。如果只是首先需要的话,找到所有有什么意义?
  • 因为我实际上需要以最低值开头的那对。
  • 如果你“知道你必须使用 memoization”,但不知道如何使用它......这意味着你不知道它的作用;你怎么知道你必须使用它?

标签: arrays ruby memoization


【解决方案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

【讨论】:

    【解决方案2】:
    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) vs. O(rest.size))。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      相关资源
      最近更新 更多