Вот решение, которое позволило бы определить, похожи ли 2 запроса в почти постоянное время (O(size of queries)
), с предварительным вычислением в O(number of words in database)
.
Предварительным вычислением: мы предполагаем, что у вас есть список списки синонимов L
function build_hashmap(L):
H <- new Hashmap()
i <- 0
for each synonyms_list in L do:
for each word in synonyms_list do:
H[word] <- i
i <- i+1
return H
Теперь мы можем проверить, являются ли два слова синонимами, используя H
function is_synonym(w1, w2, H):
if H[w1] == H[w2]:
return true
else:
return False
Оттуда должно быть довольно легко определить, имеют ли два запроса то же значение.
Редактировать:
Быстрое решение может заключаться в реализации алгоритма union-find ' для построения хэш-карты.
Другим способом было бы сначала смоделировать слова как вершины графа и добавить ребра для отношений синонимичности. Затем вы можете построить свою хэш-карту, найдя связанные компоненты графика . Найти связанные компоненты в графе можно, пройдя его.