Ruby中+ = Array的复杂度是多少?

时间:2013-10-22 10:48:37

标签: ruby arrays big-o time-complexity

假设我有一个长度为n的数组a,我希望再添加另一个长度为m的数组b。即

a+=b

此类操作的复杂程度是多少?我知道在PERL中,它有一个缓冲区,所以如果m不大,则为~o(m)。让我们来看两个案例:
1. m< ñ
2. m~n
感谢。

1 个答案:

答案 0 :(得分:1)

可能我不会给你完整的答案,但对于初学者来说,检查C中Array#+的实现:

VALUE rb_ary_plus(VALUE x, VALUE y)
{
    VALUE z;
    long len;

    y = to_ary(y);
    len = RARRAY_LEN(x) + RARRAY_LEN(y);
    z = rb_ary_new2(len);
    MEMCPY(RARRAY_PTR(z), RARRAY_PTR(x), VALUE, RARRAY_LEN(x));
    MEMCPY(RARRAY_PTR(z) + RARRAY_LEN(x), RARRAY_PTR(y), VALUE, RARRAY_LEN(y));
    ARY_SET_LEN(z, len);
    return z;
}

正如您可以看到它定义新实例,复制数组X,然后复制数组Y. MEMCPY是一个宏,应该包裹memcpy()。由于这个答案表明C memcpy是O(N) - How do realloc and memcpy work?

所以在我们的例子中它将是~O(N + M)。我建议你进一步检查Ruby源代码。很可能在+=的情况下,它只执行单memcpy。我们也有不同的Ruby实现。