+;=Ruby中的数组?

+;=Ruby中的数组?,ruby,arrays,big-o,time-complexity,Ruby,Arrays,Big O,Time Complexity,假设我有一个长度为n的数组a,我想再加一个长度为m的数组b。即 a+=b 这种操作的复杂性顺序是什么?我知道在PERL中,它有一个缓冲区,所以如果m不大,它就是~o(m)。让我们举两个例子: 1.m可能我不会给出完整的答案,但对于初学者,请检查Array++在C中的实现: VALUE rb_ary_plus(VALUE x, VALUE y) { VALUE z; long len; y = to_ary(y); len = RARRAY_LEN(x) + R

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

a+=b
这种操作的复杂性顺序是什么?我知道在PERL中,它有一个缓冲区,所以如果m不大,它就是~o(m)。让我们举两个例子:

1.m可能我不会给出完整的答案,但对于初学者,请检查
Array++
在C中的实现:

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)——


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

可能我不会给出完整的答案,但对于初学者,请检查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)——


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

为什么要把这个问题复杂化?你可以问一下
数组的复杂性#+
。那是因为我是Ruby新手。你为什么要把这个问题复杂化?你可以问一下
数组的复杂性#+
,那是因为我对Ruby是新手。