Ruby: хеш, который не запоминает ключевые значения - PullRequest
1 голос
/ 26 мая 2011

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

Edit:

Реализация хэша в Ruby хранит значение ключа. Я хотел бы хэш, который не помнит значение ключа. Он просто использует хеш-функцию для хранения вашего значения и забывает ключ. Причина этого заключается в том, что мне нужно создать хеш для примерно 5 ГБ данных, и мне все равно, какие значения ключей после его создания. Я только хочу иметь возможность искать значения на основе других ключей.

Редактировать Редактировать:

Язык немного запутанный. Под значением ключа я подразумеваю это:

hsh ['value'] = данные

Меня не волнует, что такое «значение» после того, как хеш-функция хранит данные в хэше.

Редактирование ^ 3

Хорошо, вот что я делаю: я генерирую каждый 35-буквенный (нуклеотидный) кмер для набора из нескольких генов. Каждый ген имеет идентификатор. Хеш выглядит так:

kmers = { 'A...G' => [1, 5, 3], 'G...T' => [4, 9, 9, 3]  }

Таким образом, хеш-ключом является kmer, а значением является массив, содержащий идентификаторы для гена (-ов) / string (s), которые имеют этот kmer.

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

>> kmers['A...G']
=> [1, 5, 3]

>> kmers.keys.first
=> "Sorry Dave, I can't do that"

Ответы [ 5 ]

4 голосов
/ 27 мая 2011

Полагаю, вам нужен набор , хотя он хранит уникальные ключи и не имеет значений.У него быстрое время поиска из хеша.Набор входит в стандартную библиотеку.

require 'set'
s = Set.new
s << 'aaa'
p s.merge(['ccc', 'ddd'])  #=> #<Set: {"aaa", "ccc", "ddd"}>
2 голосов
/ 26 мая 2011

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

 h[k] = k

... и назовите это днем ​​...

1 голос
/ 27 мая 2011

Я предполагаю, что строка в 5 Гб является геномом, а кмеры - это 35 нуклеотидных последовательностей пар оснований.

Что я, вероятно, сделал бы (немного упрощенно):

human_genome = File.read("human_genome.txt")
human_kmers = Set.new
human_genome.each_cons(35) do |potential_kmer|
  human_kmers << potential_kmer unless human_kmers.include?(potential_kmer)
end
unknown_gene = File.read("unknown_gene.txt")
related_to_humans = unknown_gene.each_cons(35).any? do |unknown_gene_kmer|
  human_kmers.include?(unknown_gene_kmer)
end
0 голосов
/ 26 мая 2011

Используйте массив.Массив индексирует по целым числам вместо ключей.http://www.ruby -doc.org / core / classes / Array.html

a = []
a << "hello"
puts a #=> ["hello"]
0 голосов
/ 26 мая 2011

Я должен сделать гигантский хеш, но мне все равно, что это за ключи.

Это называется массивом. Просто используйте массив. Хеш без ключей вообще не является хешем и теряет свою ценность. Если вам не нужен поиск по значению ключа, тогда вам не нужен хеш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...