假设我有一个长度为n的数组a,我希望再添加另一个长度为m的数组b。即
a+=b
此类操作的复杂程度是多少?我知道在PERL中,它有一个缓冲区,所以如果m不大,则为~o(m)。让我们来看两个案例:
1. m< ñ
2. m~n
感谢。
答案 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实现。