你如何保证Arrays具有最低级别的递归?

时间:2013-11-25 03:21:46

标签: ruby arrays recursion

我有一些不同长度的数组,它们在代码中早先生成,由有序对的子数组组成。如果有多对,则输出为阵列数组。如果只有一对,则输出为单个数组。

变换输出的简单,一致的方法是什么,它总是处于一个递归级别,而不会写一些过于狭窄的东西来测试那个确切的事件?现在我有:

output_array = [7, 5]
output_array = output_array.flatten.each_slice(2).to_a
=> [[7, 5]]

output_array = [[7, 5], [6, 2]]
output_array = output_array.flatten.each_slice(2).to_a
=> [[7, 5], [6, 2]]

2 个答案:

答案 0 :(得分:2)

不太可爱但更快的是检查内部元素是否为数组,如果不是将其插入空数组中。

oa1.first.kind_of?(Array) ? oa1 : [oa1]

Mudasobwa请原谅我使用你的优秀解决方案进行比较。

require 'benchmark'

n = 10_000
oa1 = [5,7]
oa2 = [[5,7],[6,8]]
c1 = c2 = c3 = 0 
Benchmark.bm do |x| 
  x.report {
    n.times do
      c1 += oa1.flatten.each_slice(2).to_a.first.first \
         +  oa2.flatten.each_slice(2).to_a.first.first
    end 
  }
  x.report {
    n.times do
      c2 += Hash[*oa1.flatten].to_a.first.first \
         +  Hash[*oa2.flatten].to_a.first.first
    end 
  }
  x.report {
    n.times do
      c3 += (oa1.first.kind_of?(Array) ? oa1 : [oa1]).first.first \
      +  (oa2.first.kind_of?(Array) ? oa2 : [oa2]).first.first \
    end 
  }
end

puts "c1 = #{c1}, c2 = #{c2}, c3 = #{c3}"

给出

   user     system      total        real
   0.063000   0.000000   0.063000 (  0.071007)
   0.062000   0.000000   0.062000 (  0.056006)
   0.016000   0.000000   0.016000 (  0.008001)
   c1 = 100000, c2 = 100000, c3 = 100000

答案 1 :(得分:1)

[编辑] 注意!此解决方案重复密钥[1,3,1,4])上失败,归功于Shawn Balestracci

请使用以下@peter建议的解决方案


出于好奇,切换2总是强制考虑哈希式结构,不是吗?因此,您可以使用:

Hash[*output_array.flatten].to_a

这至少要快两倍:

require 'benchmark'

n = 10_000
oa1 = [5,7]
oa2 = [[5,7],[6,8]]
c1 = c2 = 0 
Benchmark.bm do |x| 
  x.report {
    n.times do
      c1 += oa1.flatten.each_slice(2).to_a.first.first \
         +  oa2.flatten.each_slice(2).to_a.first.first
    end 
  }
  x.report {
    n.times do
      c2 += Hash[*oa1.flatten].to_a.first.first \
         +  Hash[*oa2.flatten].to_a.first.first
    end 
  }
end

puts "c1 = #{c1}, c2 = #{c2}"


user     system      total        real
  0.100000   0.000000   0.100000 (  0.117027)
  0.060000   0.000000   0.060000 (  0.064323)
c1 = 100000, c2 = 100000