Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сколько нужно перестановок, из слова А в слово Б 
V
    Опции темы
xTr1m
Дата 10.12.2011, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Доброго времени суток. Есть такая задача. Есть слово А и слово Б, можно удалить или добавить букву в А. Нужно определить можно ли двумя такими операциями из А делать Б. То есть из слова "Кто" можно сделать "Кот" (убрать букву "т" и поставить букву "т" в конец) 

В голову пришло только

1) проверить на количество букв, если разница больше, чем один символ, то нельзя.
2) проверить пересечение букв, если разница больше, чем в одну букву, то нельзя.
3) сделать из слов два набора (уникальных множества) букв, пройтись по набору и узнать количество несоответствий.

Но мне кажется, должен быть путь короче =)) Спасибо.
PM MAIL WWW ICQ   Вверх
maxdiver
Дата 10.12.2011, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Ну количества букв - это хорошее отсечение, но, так или иначе, решение должно сводиться к сравнению строк: одни только количества букв не говорят о равенстве строк.


Достаточно быстрое решение может быть таким: сгенерируем два множества: множество всех слов, которые можно получить из А, и множество всех слов, которые можно получить из Б. Если у этих двух множеств есть общий элемент - то ответ ДА, иначе - НЕТ.


Если говорить о скорости решения (хотя автор не озвучил никаких ограничений на длину слов), то прямо в таком "наивном" виде оно имеет асимптотику O (n^2 log n) - если явным образом строить всевозможные строки и сортировать их. (где n - длина строк)
Т.е. для строк длины порядка 1000 это решение сгодится.


Впрочем, это решение нетрудно довести до оптимального времени O(n) в среднем, воспользовавшись техникой хеширования:
1) строки будем хешировать обычным полиномиальным хешом:
Код

HASH(А) = (А[1] + A[2] * p + A[3] * p^2 + A[4] * p^3 + ... + A[n] * p^{n-1}) MOD q,

где A[i] - это код i-го символа строки А, p - некоторое небольшое число, q - некоторое большое число.
2) легко научиться считать за O(1) хеш от строки, полученной вставкой в какую-либо позицию какого-либо символа (для этого достаточно только предпосчитать HASH от всех префиксов и суффиксов строки A)
3) построив за O(n) два множества хешей, нам надо проверить, есть ли в них совпадающие элементы. Для этого можно воспользоваться структурой данных hash-set, которая обеспечивает нам O(1) в среднем на одну операцию, что и даст нам итоговые O(n).
PM MAIL WWW ICQ   Вверх
xTr1m
Дата 11.12.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Спасибо огромное.

Это сообщение отредактировал(а) xTr1m - 11.12.2011, 13:14
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0602 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.