Ruby Array#assoc是否使用线性搜索?

时间:2013-01-23 15:28:32

标签: ruby

嗯......还没有看过这个......但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;
}

2 个答案:

答案 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。)