【发布时间】:2013-12-03 15:52:33
【问题描述】:
我有这样的功能:
(0..Float::INFINITY).lazy.take_while {|n|(n**2+ 1*n+41).prime?}.force[-1]
我将此用作优化练习。这很好用,但它的内存顺序为 O(n),因为它将创建整个数组,然后取最后一个元素。
我试图在不构建整个列表的情况下得到这个,因此是惰性枚举器。除了使用while 循环之外,我想不出任何办法。
(0..Float::INFINITY).lazy.take_while {|n|(n**2+ 1*n+41).prime?}.last.force
有没有办法以 O(1) 的空间顺序而不是 O(n) 的枚举数来做到这一点?
编辑:这里的示例不需要惰性,但我认为降低函数的空间复杂度可能更有用?
【问题讨论】:
-
这与删除
lazy和force有何不同? 39 双向。为什么1*n? -
好点,在这种情况下懒惰不是必需的,因为我们使用的是 take_while,我只是习惯于在处理无穷大时使用它,即将编辑问题以反映这一点。
-
Err... 你已经在使用枚举器了,不是吗?
-
是的,想在不建立列表的情况下这样做,现在问题中已经澄清了这一点。 :)
-
请注意,实际构建数组可能有好处,具体取决于您真正在做什么:有了它,垃圾收集器不太可能在您处于中间状态时启动寻找价值。
标签: ruby optimization lazy-evaluation