Поскольку закрытие XY не включает в себя все атрибуты отношения, оно не может быть ключом-кандидатом. Ключ-кандидат - это минимальное количество атрибутов, которые можно использовать для уникальной идентификации кортежа. Закрытие XY будет включать только X и Y.
Если Ваша поддержка БД это, необходимо использовать полнотекстовый поиск. Иначе можно использовать индексатор как lucene и его различные реализации.
Данная статья, кажется, описывает точно, что Вы хотите.
Lucene ( http://lucene.apache.org/ ) также реализует расстояние редактирования Levenshtein.
Вычислите хеш SOUNDEX (который встроен во многие механизмы базы данных SQL), и индекс им.
SOUNDEX является хешем на основе звука слов, таким образом, орфографические ошибки того же слова, вероятно, будут иметь тот же хеш SOUNDEX.
Затем находят хеш SOUNDEX строки поиска и соответствие на нем.
Вы не упоминали свою систему баз данных, но для PostrgreSQL Вы могли использовать следующий contrib модуль: trgm - Триграмма, соответствующая для PostgreSQL
, pg_trgm contrib модуль обеспечивает функции и индексные классы для определения подобия текста на основе триграммного соответствия.
Так как объем данных является большим при вставке записи, я вычислил бы и сохранил бы значение фонетического алгоритма в индексированном столбце и затем ограничил бы (оператор Where) свои запросы Select в диапазоне на том столбце.
XHTML MP 1.2 DTD является текущей рекомендацией, доработанной в марте 2008 года.
Источник:
http://en.wikipedia.org/wiki/XHTML_Mobile_Profile
-121--1628879-Этот жадный алгоритм производит довольно короткие минимальные последовательности.
UPDATE: Обратите внимание, что для n ≥ 6 этот алгоритм не создает максимально короткую строку!
Любопытный шаг обвязки необходим для корректности; разрыв галстука случайным образом вместо этого, кажется, приводит к более длинным струнам.
Я подтвердил (написав гораздо более длинную, более медленную программу), что ответ, который этот алгоритм дает для длины 4, 123412314231243121342132413214321 действительно является самым коротким ответом. Однако для длины 6 он дает ответ длиной 873, которая длиннее, чем самое короткое известное решение.
Алгоритм O ( n ! 2).
Реализация в Python:
import itertools
def costToAdd(a, b):
for i in range(1, len(b)):
if a.endswith(b[:-i]):
return i
return len(b)
def stringContainingAllPermutationsOf(s):
perms = set(''.join(tpl) for tpl in itertools.permutations(s))
perms.remove(s)
a = s
while perms:
cost, next = min((costToAdd(a, x), x) for x in perms)
perms.remove(next)
a += next[-cost:]
return a
Длина строк, генерируемых этой функцией, равна 1, 3, 9, 33, 153, 873, 5913,... которая является этой целочисленной последовательностью .
У меня есть предчувствие, что вы можете сделать лучше, чем O ( n ! 2).
-121--3140546-Очень подробное объяснение соответствующих алгоритмов содержится в книге Алгоритмы на струнах, деревьях и последовательностях: информатика и вычислительная биология Дэна Гусфилда .