Структура данных в рубине, чтобы хранить только уникальные элементы? - PullRequest
1 голос
/ 05 января 2012

Мне нужна структура данных в Ruby, которая будет хранить строку только один раз и отклонять ее в следующий раз, когда я попытаюсь вставить ее (что-то вроде 'SET'). Реализация должна быть наиболее эффективной (например, лучше, чем линейный поиск в массиве).

Также я попытался использовать Hash для этой цели, но несколько строк с одинаковым значением (эти строки, которые я получаю из операции среза для некоторых существующих строк) попадают в Hash, похоже, что для них вычисляется другое значение хеш-функции.

Что может быть лучшим и наиболее эффективным выходом? Я не хотел бы использовать рубиновый драгоценный камень. Я работаю над решением головоломки от интернет-судьи, для которого я могу предоставить только свой собственный код.

Вот фрагмент кода, который я написал:

for string in @string_store do
  for c in 0...string.length
    index_to_sum=0
    while c+index_to_sum<string.length do
      substring=string[c..(c+index_to_sum)]         
      unless @hash_store[substring]=='X'
        @hash_store[substring]='X'
      end
      index_to_sum+=1
    end
  end
end   

Ответы [ 2 ]

6 голосов
/ 05 января 2012

Как насчет Ruby Set :)

require 'set'
s1 = Set.new [1, 2]                   # -> #<Set: {1, 2}>
s2 = [1, 2].to_set                    # -> #<Set: {1, 2}>
s1 == s2                              # -> true
s1.add("foo")                         # -> #<Set: {1, 2, "foo"}>
s1.merge([2, 6])                      # -> #<Set: {6, 1, 2, "foo"}>
s1.subset? s2                         # -> false
s2.subset? s1                         # -> true

Хотя он использует require, Ruby Set является частью стандартной библиотеки Ruby, поэтому он должен быть вполне приемлем для вашегопредоставление кода

0 голосов
/ 05 января 2012

Конечно, решение macek работает, но Hash определенно должен работать.Использование хэша для хранения уникальных списков - распространенная идиома в языках, в которых нет встроенной поддержки множеств.Можете ли вы привести небольшой пример кода, воспроизводящего проблему с дублирующимися строками?Я подозреваю, что при переходе на использование набора вы можете столкнуться с той же проблемой.

...