+;=Ruby中的数组?
假设我有一个长度为n的数组a,我想再加一个长度为m的数组b。即+;=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
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是新手。