2012-01-27 4 views
0

Для рубина, где x - это массив, как x.include?(y) проверить, y находится в x? Какой алгоритм?Что включает в себя алгоритм, который включает Array #? использует?

+2

вы можете найти источник функции http://ruby-doc.org/core-1.9.3/Array.html#method-i-include-3F – oldergod

+2

Это 'O (n)'. Для 'O (1)' вместо этого используйте 'Set'. –

ответ

3

Поскольку массив не нужно сортировать, алгоритм не может быть лучше, чем «посмотреть на каждый элемент и посмотреть, совпадает ли он».

+0

Gotcha, поэтому, если у вас есть отсортированный массив, используйте что-то еще ... – locoboy

+1

@ cfarm54 С большим отсортированным массивом в большинстве случаев бинарный поиск будет быстрее. http://0xcc.net/ruby-bsearch/index.html.en –

+0

yep, и я предполагаю, что для этого нет функций для ruby ​​ – locoboy

6

В дополнение к ответу Greg Hewgill, в исходный код Руби 1.9.3 для этого метода:

VALUE 
rb_ary_includes(VALUE ary, VALUE item) 
{ 
    long i; 

    for (i=0; i<RARRAY_LEN(ary); i++) { 
     if (rb_equal(RARRAY_PTR(ary)[i], item)) { 
      return Qtrue; 
     } 
    } 
    return Qfalse; 
} 

Таким образом, как Грег сказал, алгоритм просто линейный поиск по массиву.

+3

+1 за использование источника, Люк. –

Смежные вопросы