Ruby方法的大O表示法?

时间:2014-08-11 02:38:06

标签: c ruby time-complexity

如何找到Ruby方法的复杂性?

例如length?如果我查看源代码,我会看到:

               static VALUE
rb_ary_length(VALUE ary)
{
    long len = RARRAY_LEN(ary);
    return LONG2NUM(len);
}

但我不知道怎么读它才能找到Big O符号。

3 个答案:

答案 0 :(得分:5)

没有维护Ruby方法的理论复杂性列表。您感兴趣的是minitest/benchmark,其使用方式如下:

require 'minitest/autorun'
require 'minitest/benchmark'

class TestFoobar < Minitest::Benchmark
  def setup
    @foo_arrays = ( 1 .. 10_000 ).map { |n| [ 42 ] * n }
    # Because default benchmarking range is [1, 10, 100, 1_000, 10_000]
  end

  def bench_foo_size
    assert_performance_constant 0.99 do |n| @foo_arrays[ n ].size end
  end
end

如果运行上述测试,您实际上可以看到Array#size方法的性能不变。如果您将#bench_foo_size更改为:

def bench_foo_size
  assert_performance_linear 0.99 do |n| @foo_arrays[ n ].size end
end

测试实际上会失败,因为Array#size不是线性的,而是次线性的。 minitest/benchmark非常灵活,您可以将其应用于您自己的代码以及内置资源。

答案 1 :(得分:2)

您无法从中获取相关信息。您必须查看RARRAY_LENLONG2NUM的来源。

估算方法复杂性的一种简单方法是使用您感兴趣的维度不同的参数运行基准,并在图表上绘制。

答案 2 :(得分:1)

O(1)方法只有length。数组的长度存储在变量中,无需进一步计算即可返回。

如何找出答案?通过阅读源代码并分析实现和算法。