2016-12-17 82 views
0

鉴于空数组的数组在红宝石:确定二维Ruby数组是否为空的最有效方法是什么?

a = [ [], [], [], [], [] ] 

可以使用确定是否所有子阵列的阵列是空的:

a.uniq.length == 1    # Ignoring the flaw where sub-arrays are identical 
a.index { |item| item != [] }.nil? 
a.flatten.empty? 
a.all? { |item| item.empty? }   # Fastest of the four 

以上方法中列出从最慢到最快的。有没有比使用a.all? { |x| x.empty? }更快的方法。

array.all? { |element| element.empty? } 

是什么让那种感觉如果我们看看它们是如何工作:

回答

3

当你找到一个更快的方法,因为我会感到很惊讶。这看看每个元素是否为空,但只要有非空元素就停下来。这意味着最多需要步骤并且不会更改该数组。

鉴于其他大多数示例都会更改数组。这意味着他们需要分配内存和复制数据。如果您先操作数据,那么您将需要正好n步骤加上之后的检查。

+0

是的,我想知道是否有一个聪明的方法来做到这一点比在最坏的情况下O(n)更快。 – ybakos

+0

我会争辩说,如果你有一个数组,并且需要检查是否有任何子数组不是空的,那么没有比'O(n)'更快的方法,因为在最坏的情况下你必须检查所有子数组。 – spickermann

+0

我看不出它会如何更快。 @spickermann:Minor nitpick:其他示例不会更改数组。他们创造一个新的,需要时间和记忆。 –

相关问题