C Ruby方法的大O表示法?
我如何找到Ruby方法的复杂性 比如说?如果我看一下源代码,我会看到:C Ruby方法的大O表示法?,c,ruby,time-complexity,C,Ruby,Time Complexity,我如何找到Ruby方法的复杂性 比如说?如果我看一下源代码,我会看到: static VALUE rb_ary_length(VALUE ary) { long len = RARRAY_LEN(ary); return LONG2NUM(len); } 但是我不知道如何读它来找到大O符号 您无法从中获得相关信息。您必须查看RARRAY_LEN和LONG2NUM的源代码 估计方法复杂度的一个简单方法是,使用沿您感兴趣的维度不同的参数运行基准测试,并
static VALUE
rb_ary_length(VALUE ary)
{
long len = RARRAY_LEN(ary);
return LONG2NUM(len);
}
但是我不知道如何读它来找到大O符号 您无法从中获得相关信息。您必须查看
RARRAY_LEN
和LONG2NUM
的源代码
估计方法复杂度的一个简单方法是,使用沿您感兴趣的维度不同的参数运行基准测试,并将其绘制在图形上。对于长度方法来说,这只是O(1)
。数组的长度存储在变量中,无需进一步计算即可返回
如何找到答案?通过阅读源代码并分析实现和算法。没有关于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
不是线性的,而是次线性的minitest/benchmark
非常灵活,您可以将其应用于您自己的代码以及内置资产。我认为可能会有一些资源可以提供每个Ruby定义方法的复杂性。我从未见过任何编程语言都有这样的资源。我怀疑开发人员是否能够维护这样一个列表并使其保持最新……我在埃菲尔铁塔的文档中看到了这一点。在那里,方法的复杂性也被公布。但是Eiffel/s已经很久了,几乎没有人知道它是什么……C++标准文档描述了各种方法的复杂性要求(例如向量随机存取是O(1),具有O(n)插入(除了矢量的末尾)。 etc@FrederickCheung:有时甚至更进一步。IIRC,std::sort
甚至不仅要求随着集合大小变为无穷大的渐进复杂性,而且要求每个n
允许的精确比较次数。为什么这个标记为c?Ruby是用c编写的?它是用c实现的。@FiddlingBits:是的,Ruby是是用C写的。不,不是。Ruby的许多实现中有一个是用C写的。其他的是用Java.或C#或Ruby.或RPython.或NQP写的。它们可能有不同的方法实现。
def bench_foo_size
assert_performance_linear 0.99 do |n| @foo_arrays[ n ].size end
end