Решение на Search от Исмаил Алиджиков

Обратно към всички решения

Към профила на Исмаил Алиджиков

Резултати

  • 15 точки от тестове
  • 1 бонус точка
  • 16 точки общо
  • 5 успешни тест(а)
  • 0 неуспешни тест(а)

Код

use std::collections::HashSet;
use std::collections::HashMap;
pub fn extract_words(text: &str) -> Vec<String> {
text.split(|ch: char| !ch.is_alphabetic())
.filter(|s| !s.is_empty())
.map(String::from)
.collect()
}
pub struct TextIndex<'a> {
indexes: HashMap<String, HashSet<&'a str>>
}
impl<'a> TextIndex<'a> {
pub fn new() -> Self {
TextIndex {
indexes: HashMap::new()
}
}
pub fn push(&mut self, text: &'a str) {
let words = extract_words(text);
for word in words {
let matches = self.indexes.entry(word).or_insert(HashSet::new());
matches.insert(text);
}
}
pub fn search(&self, query: &str) -> HashSet<&str> {
let queries = extract_words(query);
let default = HashSet::new();
queries.iter()
.flat_map(|query| self.indexes.get(query).unwrap_or(&default))
.cloned().collect()
}
}

Лог от изпълнението

Compiling solution v0.1.0 (file:///tmp/d20180105-6053-1qwmzzi/solution)
    Finished dev [unoptimized + debuginfo] target(s) in 5.26 secs
     Running target/debug/deps/solution-3f98bfa5c86a5dd9

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-3d9e4ea2eafbbc82

running 5 tests
test solution_test::test_extract_words_basic ... ok
test solution_test::test_extract_words_extra ... ok
test solution_test::test_search_multiple_words ... ok
test solution_test::test_search_special_cases ... ok
test solution_test::test_search_word ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests solution

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

История (1 версия и 3 коментара)

Исмаил качи първо решение на 03.01.2018 00:00 (преди над 7 години)

Добра работа. Не съм сигурен доколко удобно е индексирането на текст, понеже &str-тата, които се запазват, трябва да се own-ват от неща извън TextIndex. Това значи, че например, ако четеш низове от файлове, трябва да си ги държиш някъде, докато е жив TextIndex, иначе ще получиш компилационна грешка.

Но предполагам, че не съм успял да измисля достатъчно стриктни тестове, за които това да е проблем, а и не съм го описал в условието. Предвид, че решението е ефективно, дори и да е малко по-трудно за практическа употреба, ще ти дам обещаната бонус точка за него.

Хм, не съм го видял навреме, изглежда. Но си уцелил правилния отговор :). Търсенето е по цели думи, не по части от тях. Тоест, HashSet{} е отговора. Имах доброто намерение да искам по-добър алгоритъм за търсене, но реших, че много ще се усложнят нещата.