You are given a dictionary of all valid words. You have the following 3 operations permitted on a word: delete a character, insert a character, replace a character. Now given two words - word1 and word2 - find the minimum number of steps required to convert word1 to word2. (one operation counts as 1 step.)
У кого нибудь есть идеи красивого решения? У меня кроме некой реализации перебора нету
convert word1 to word2
-
- Уже с Приветом
- Posts: 268
- Joined: 29 Dec 2006 12:03
convert word1 to word2
-- who says a penguin can't fly? http://www.youtube.com/watch?v=9dfWzp7rYR4
-
- Уже с Приветом
- Posts: 367
- Joined: 22 Feb 2005 02:14
- Location: New York
Re: convert word1 to word2
jms wrote:You are given a dictionary of all valid words. You have the following 3 operations permitted on a word: delete a character, insert a character, replace a character. Now given two words - word1 and word2 - find the minimum number of steps required to convert word1 to word2. (one operation counts as 1 step.)
У кого нибудь есть идеи красивого решения? У меня кроме некой реализации перебора нету
-Лёгко, в одно касание! Применяя операцию replace a character, меняем единицу на двойку: word1 -> word2 - готово!
Даже словарь не понадобился...
-
- Уже с Приветом
- Posts: 11475
- Joined: 20 Nov 2000 10:01
- Location: Escondido, CA
Re: convert word1 to word2
Промежуточные состояния должны быть valid words, или нет?
Если не должны, то зачем нужен словарь?
Если не должны, то зачем нужен словарь?
Протоукр
-
- Уже с Приветом
- Posts: 367
- Joined: 22 Feb 2005 02:14
- Location: New York
Re: convert word1 to word2
Ну, разумеется, должны. Иначе и задачи не было бы: удаляй/дописывай буквы - и вся недолга. Так, кстати, мы слова и пишем: по буковке, начиная с "пустого слова".Hamster wrote:Промежуточные состояния должны быть valid words, или нет?
Если не должны, то зачем нужен словарь?
Но, похоже, в общем случае такую цепочку от одного произвольного слова к другому, прыгая только по словам из словаря, выстроить невозможно. Допустим, наш словарь содержит слово "шшшшш", а все остальные слова - "нормальные". (Возражение, что такого слова нет - несущественное: возьмём обычный словарь и пополним его этим словом, сказав, что оно означает команду замолчать, вести себя тихо - почему нет?) Так вот, стартуя от этого слова и применяя только указанные преобразования, уже после первого шага никак не получить ни одного "нормального" слова из словаря. - Мостик не строится, приэхали!
-
- Уже с Приветом
- Posts: 11475
- Joined: 20 Nov 2000 10:01
- Location: Escondido, CA
Re: convert word1 to word2
Deynekin wrote:Ну, разумеется, должны. Иначе и задачи не было бы: удаляй/дописывай буквы - и вся недолга. Так, кстати, мы слова и пишем: по буковке, начиная с "пустого слова".Hamster wrote:Промежуточные состояния должны быть valid words, или нет?
Если не должны, то зачем нужен словарь?
Но, похоже, в общем случае такую цепочку от одного произвольного слова к другому, прыгая только по словам из словаря, выстроить невозможно. Допустим, наш словарь содержит слово "шшшшш", а все остальные слова - "нормальные". (Возражение, что такого слова нет - несущественное: возьмём обычный словарь и пополним его этим словом, сказав, что оно означает команду замолчать, вести себя тихо - почему нет?) Так вот, стартуя от этого слова и применяя только указанные преобразования, уже после первого шага никак не получить ни одного "нормального" слова из словаря. - Мостик не строится, приэхали!
Если не должны, алгоритм нахождения произвольного пути word1->word2 за max(len(word1),len(word2)) операций тривиален, а алгоритм нахождения _кратчайшего_ - отнюдь. Попробуйте привести алгоритм, способный сгенерировать путь от слова "стол" до слова "тополь" за 4 операции, не пользуясь полным перебором. Учтите, что полный перебор в общем случае не канает, потому что пространство всех буквосочетаний, полученных из слова "стол" всего за 4 операции, включает что-то типа 10^8 элементов, а для перебора всех сочетаний, удаленных на 8 шагов, нужен суперкомпьютер.
Если должны, подавляющее большинство слов длиннее ~5 букв в словаре будут находиться в изолированных кластерах в 2-10 слов, и для большинства пар слов задача не будет иметь решения.
Протоукр
-
- Уже с Приветом
- Posts: 268
- Joined: 29 Dec 2006 12:03
Re: convert word1 to word2
Я думаю что можно рассматривать две задачи -- с словарем и без.
Давайте остановимся на первой для начала.
Вторая -- что мне приходит в голову, это на этапе предобработки мы строим граф -- вершины слова из словаря, вершины соеденены, если одно слово можно преобразовать в другое. Понятно что граф строится за O(n^2), где n -- количество слов в словаре. Дальше когда нам дают word1 и word2, мы их включаем в граф, и ищем кратчайший путь в нем. Как то так.
А вот для первой, я могу сконструировать достаточно сложный перебор, но хотелось бы элегантное рещение.
Давайте остановимся на первой для начала.
Вторая -- что мне приходит в голову, это на этапе предобработки мы строим граф -- вершины слова из словаря, вершины соеденены, если одно слово можно преобразовать в другое. Понятно что граф строится за O(n^2), где n -- количество слов в словаре. Дальше когда нам дают word1 и word2, мы их включаем в граф, и ищем кратчайший путь в нем. Как то так.
А вот для первой, я могу сконструировать достаточно сложный перебор, но хотелось бы элегантное рещение.
-- who says a penguin can't fly? http://www.youtube.com/watch?v=9dfWzp7rYR4
-
- Уже с Приветом
- Posts: 605
- Joined: 14 Feb 2002 10:01
- Location: Russia
Re: convert word1 to word2
Имхо формулировка не совсем полная, в частности вопросы:
словарь конечный или необязательно?
для заданных word1 и word2 известно ли нам заранее, что решение существует?
чем плох и перебор и что значит "элегантное" решение? требуется некая скорость алгоритма или некие ограничения на ресурсы?
словарь конечный или необязательно?
для заданных word1 и word2 известно ли нам заранее, что решение существует?
чем плох и перебор и что значит "элегантное" решение? требуется некая скорость алгоритма или некие ограничения на ресурсы?
-
- Уже с Приветом
- Posts: 27652
- Joined: 15 Jul 2002 17:05
- Location: MD
Re: convert word1 to word2
Задача ( если без словаря ) - типический sequence alignment.
Для коротких слов решается просто, полным перебором.
Для коротких слов решается просто, полным перебором.
-
- Уже с Приветом
- Posts: 11756
- Joined: 10 Feb 2005 16:08
- Location: CMH
Re: convert word1 to word2
Что такое "короткое слово"? Адна буква? Ни адной? Две-три? Или про терабайты-петабайты речь?!vaduz wrote: Для коротких слов решается просто, полным перебором.
-
- Уже с Приветом
- Posts: 3009
- Joined: 14 Apr 2004 01:11
- Location: SFBA (было: Минск, Беларусь)
Re: convert word1 to word2
Странно, что до сих пор никто не произнес правильного термина. Это называется Levenshtein distance (http://en.wikipedia.org/wiki/Levenshtein_distance) и именно так - динамическим программированием - решается эта задача без словаря.
И, если я ничего не упускаю, нет ничего сложного в том, чтобы ограничиться рассмотрением в соответствующей матрице только тех путей, которые ведут по словам из словаря.
P.S. Последнее, к сожалению, не даст решения задачи в общем случае, ибо алгоритм Levenshtein distance, например, не пытается удлинить исходное слово, если целевое слово не длиннее. А ограниченный словать может заставлять нас идти и по пути удлинения. Хм...
И, если я ничего не упускаю, нет ничего сложного в том, чтобы ограничиться рассмотрением в соответствующей матрице только тех путей, которые ведут по словам из словаря.
P.S. Последнее, к сожалению, не даст решения задачи в общем случае, ибо алгоритм Levenshtein distance, например, не пытается удлинить исходное слово, если целевое слово не длиннее. А ограниченный словать может заставлять нас идти и по пути удлинения. Хм...
Best regards,
Андрей
Андрей
-
- Уже с Приветом
- Posts: 27652
- Joined: 15 Jul 2002 17:05
- Location: MD
Re: convert word1 to word2
vm__ wrote:Что такое "короткое слово"? Адна буква? Ни адной? Две-три? Или про терабайты-петабайты речь?!vaduz wrote: Для коротких слов решается просто, полным перебором.
Короткие слова, это когда самое длинное слово - из книги рекордов Гиннеса.
-
- Уже с Приветом
- Posts: 1377
- Joined: 14 May 2003 20:37
- Location: NY, USA
Re: convert word1 to word2
AndreyT wrote:P.S. Последнее, к сожалению, не даст решения задачи в общем случае, ибо алгоритм Levenshtein distance, например, не пытается удлинить исходное слово, если целевое слово не длиннее. А ограниченный словать может заставлять нас идти и по пути удлинения. Хм...
Есть еще одна проблема. Этот алгоритм проходит оба слова по буквам слева направо, пройденные буквы больше не рассматриваются. Но может найтись такая цепочка, что на последнем шаге меняется начальная буква, например:
муха-мура-тура-тара-кара-каре-кафе-кафр-каюр-крюк-урюк-урок-срок-сток-стон-слон
на последнем шаге меняется вторая буква.
Можно, скажем, построить граф связей между словами, описав все возможные ребра. Потом ходить по нему, запоминая пройденный путь и на каждом шаге проверяя, не проходилось ли уже данное слово. Если мы уже здесь были, возвращаемся назад по рекурсии до ближайшей развилки, где есть еще неисследованные ребра. И так далее, пока случайно не наткнемся на нужное слово. Если вернулись в исходный пункт и нет неисследованных ребер, то цепочка невозможна. Так можно найти какой-то путь, но он не будет кратчайшим. Короче, понятно, что задача нетривиальная.
-
- Уже с Приветом
- Posts: 12258
- Joined: 20 Dec 2000 10:01
- Location: Bellevue, WA
Re: convert word1 to word2
Граф связей это правильная идея. Имея граф связей, найти кратчайшее расстояние уже не проблема.
Создаем массив достижимых из Word1 узлов с расстояниями и кратчайшей цепочкой ведущей к ним. На каждой итерации расширяем список, обновляя кратчайшие расстояния и цепочки. Как только найдется Word2, убеждаемся что после очередной итерации все добавленные в список узлы имеют расстояния больше чем расстояние от Word1 до Word2, тогда цепочка от Word1 к Word2 будет оптимальной.
Если слово Word2 так и не появилось в списке достижимых узлов и список стабилизировался, то выдаем ответ что пути от Word1 к Word2 нет.
Создаем массив достижимых из Word1 узлов с расстояниями и кратчайшей цепочкой ведущей к ним. На каждой итерации расширяем список, обновляя кратчайшие расстояния и цепочки. Как только найдется Word2, убеждаемся что после очередной итерации все добавленные в список узлы имеют расстояния больше чем расстояние от Word1 до Word2, тогда цепочка от Word1 к Word2 будет оптимальной.
Если слово Word2 так и не появилось в списке достижимых узлов и список стабилизировался, то выдаем ответ что пути от Word1 к Word2 нет.