【问题标题】:Does Ruby Array#assoc use linear search?Ruby Array#assoc 是否使用线性搜索?
【发布时间】:2013-01-23 23:53:23
【问题描述】:

嗯..还不能阅读这个..但是 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;
}

【问题讨论】:

    标签: ruby


    【解决方案1】:

    就个人而言,我发现 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
    

    所以,是的,很容易看出它确实确实使用了线性搜索。

    但您实际上并不需要查看源代码来弄清楚这一点。还能是什么?与搜索树或排序数组不同,没有可以利用的结构或顺序来加速它。

    【讨论】:

      【解决方案2】:

      是的;它正在遍历数组:RARRAY_PTR(ary)[i]

      鉴于数组可能已排序,也可能未排序,这是唯一有意义的事情。

      (注意 Ruby 2 将引入 bsearch,并且至少有 2-3 个 gem 用于二进制搜索,如果您关心速度。有关详细信息,请参阅 https://stackoverflow.com/a/8672512/438992。)

      【讨论】:

      • 需要注意的是,二进制搜索需要对数组进行预排序,这有其自身的相关成本。唔。在bsearch的介绍中,我们还会看到一个SortedArray类型吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2013-02-01
      • 1970-01-01
      • 2021-06-07
      • 2022-09-26
      相关资源
      最近更新 更多