嗯......还没有看过这个......但Ruby Array#assoc是否使用线性搜索?
rb_ary_assoc(VALUE ary, VALUE key)
{
long i;
VALUE v;
for (i = 0; i < RARRAY_LEN(ary); ++i) {
v = rb_check_array_type(RARRAY_PTR(ary)[i]);
if (!NIL_P(v) && RARRAY_LEN(v) > 0 &&
rb_equal(RARRAY_PTR(v)[0], key))
return v;
}
return Qnil;
}
答案 0 :(得分:4)
就我个人而言,我发现Rubinius源代码很多比YARV源代码更容易阅读。 (实际上,我发现所有其他Ruby实现的源代码比YARV或MRI更容易阅读。)
这是the implementation of Array#assoc
from Rubinius:
def assoc(obj)
each do |x|
if x.kind_of? Array and x.first == obj
return x
end
end
nil
end
所以,是的,很容易看出确实使用线性搜索。
但是你真的不需要查看源代码来解决这个问题。还有什么呢?与搜索树或排序数组不同,没有可用于加速的结构或顺序。
答案 1 :(得分:3)
是;它正在迭代数组:RARRAY_PTR(ary)[i]
这是唯一有意义的事情,因为数组可能会或可能不会被排序。
(注意Ruby 2将引入bsearch
,如果您关注速度,则至少有2-3个宝石用于二进制搜索。有关详细信息,请参阅https://stackoverflow.com/a/8672512/438992。)