Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Ruby方法的大O表示法?_C_Ruby_Time Complexity - Fatal编程技术网

C Ruby方法的大O表示法?

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的源代码 估计方法复杂度的一个简单方法是,使用沿您感兴趣的维度不同的参数运行基准测试,并

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

比如说?如果我看一下源代码,我会看到:

               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