Ruby中Array的两种不同初始化方式之间的复杂性差异是什么?

时间:2017-09-03 07:44:04

标签: arrays ruby time-complexity

Ruby中Array的两种初始化方式之间的复杂性差异是什么?

我需要将我的新数组初始化为0。

我可以做任何一种方式:

newArray = Array.new(a,0)

newArray = Array.new(a){|i| i*0}

我需要知道时间复杂度之间的差异吗?

1 个答案:

答案 0 :(得分:0)

有趣的问题。让我们使用benchmark模块,看看这两个版本在规模上的表现如何。

Benchmark.realtime do |x|
  10_000.times { Array.new(1000, 0) }
end
#=> 0.032521000131964684
Benchmark.realtime do |x|
  10_000.times { Array.new(1000) { 0 } }
end
#=> 0.49374799989163876

如您所见,第一个实现比块初始化快n倍。根据{{​​1}} description,最后一个表单通过将元素的索引传递给块并存储返回值来填充每个元素。在这个版本中,应该有中间变量创建和存储,它占用空间和CPU。

Array.new

VS

    if (rb_block_given_p()) {
        long i;

        if (argc == 2) {
            rb_warn("block supersedes default value argument");
        }
        for (i=0; i<len; i++) {
            rb_ary_store(ary, i, rb_yield(LONG2NUM(i)));
            ARY_SET_LEN(ary, i + 1);
        }
    }

ary_memfill(ary, 0, len, val); 在O(n)中迭代并设置值[ref]ary_memfill(前者)使用rb_ary_modify来执行自己的计算。