数组中的 NoMemoryError#max

NoMemoryError in Array#max

我正在研究一个代码战问题来解析一个整数并按降序重新排列它的数字。我的工作解决方案如下;我决定使用字符串方法来快速解析数字(而不是 mods 或 log_10s):

# descending_order : int => int
# Takes an int, re-orders its digits in descending order, and returns that

# ex. descending_order(1234) => 4321

def descending_order(n)
  n.to_s.chars.sort.reverse.join.to_i
end

但是,在尝试解决方案时,我还尝试了以下变体,它为相当小的输入抛出了 NoMemoryError

def descending_order(n)
  n.to_s.chars.max(n).join.to_i
end

产量:

descending_order(456454576895645)
NoMemoryError: failed to allocate memory
from (pry):129:in `max'

显然,sort 是在 max(<array_length>) 上对数组进行排序的正确方法,但我很好奇为什么 max 在这里占用了这么多内存。是什么导致了这种行为,我是否需要小心处理类似情况(例如,从 100 个整数的数组中取出 max(20))?

如文档所述here,如果给定 n,则返回最多 n 个元素,本质上也是分配大小为 n 的数组,这就是 NoMemoryError 的原因。

def descending_order(n)
  str_num_arr = n.to_s.chars
  str_num_arr.map(&:to_i).max(str_num_arr.length)
end

请参阅 ruby​​docs 了解传递给 max 的内容,它应该是 return 可枚举项数的整数。无法解释内存错误,除非您通过传递一个长于可枚举长度的数字来滥用该方法。

http://ruby-doc.org/core-2.4.2/Enumerable.html#max