Алгоритм поиска оличий

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

11 мар 2008, 16:10

Встала проблема сранения двух строк, но не просто нужно их сравнить, а найти отличия. Входные данные: эталонная строка и строка вводимая пользователем. В строке введённой пользователем нужно найти ошибки. Как подойти к решению? Нужно учесть что строки могут отличаться и по длине и по содержанию (от пользователя можно всего ожидать), возможны и "механические" ошибки при вводе, например, пропущен пробел между словами. Да, пользователю даётся возможность полностью ввести и, если нужно, отредактировать текст, проверка должна производиться только тогда, когда пользователь решил, что можно проверять. То есть, я хочу сказать, что ошибки не должны отлавливаться в процессе ввода. STL-вский алгоритм mistmatch, может быть и можно применить, но в контексте другого алгоритма.
Uphiander
Сообщения: 0
Зарегистрирован: 07 ноя 2007, 09:59

12 мар 2008, 13:19

Albor писал(а):Встала проблема сранения двух строк, но не просто нужно их сравнить, а найти отличия. Входные данные: эталонная строка и строка вводимая пользователем. В строке введённой пользователем нужно найти ошибки. Как подойти к решению? Нужно учесть что строки могут отличаться и по длине и по содержанию (от пользователя можно всего ожидать), возможны и "механические" ошибки при вводе, например, пропущен пробел между словами. Да, пользователю даётся возможность полностью ввести и, если нужно, отредактировать текст, проверка должна производиться только тогда, когда пользователь решил, что можно проверять. То есть, я хочу сказать, что ошибки не должны отлавливаться в процессе ввода. STL-вский алгоритм mistmatch, может быть и можно применить, но в контексте другого алгоритма.
Э-э... нужно создавать полный список ошибок? Скажем, тстовая строка "Ещё", пользователь ввел "Исчо" - что должно быть на выходе?
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

12 мар 2008, 14:35

Нет, реакция на столь хорошее знание языка будет считаться как ошибка и данное слово будет зачёркнуто. Пончалу, мне эта задача казалась довольно простой, но именно пример со словом ЕЩЁ, почему-то тоже влез в голову и ослажнил жизнь. Кстати, это слово некоторые пишут как ЕСЧЁ.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

13 мар 2008, 11:09

Тогда напишите, что должно быть выходными данными.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

13 мар 2008, 15:27

Алгоритм должен определить все позиции в которых нет совпадения текста, естественно слова должны анализироваться на порядок следования. Если слово полностью не совпадает это ошибка одного типа, если пропущена буква, то другого и т.д. Нужно найти ошибки. Вопрос не стоит в том чтобы выдать готовый алгоритм. Больше нужны идеи как это решить.
Хыиуду
Сообщения: 2388
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

17 мар 2008, 11:43

Ну, вариант может быть такой: рекурсивно разбивать строку на токены, каждый из которых присутствует в исходной строке, и то, что находится вне их.
Например, исходная строка - "алгоритм", проверяемая - "алгобитм". Первый токен будет "алго", второй "б", третий "итм". Потом уже смотрим взаимное расположение, определяем, что за ошибка была допущена: если два токена слиты вместе - пропущена буква и т.д.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

17 мар 2008, 16:48

Собственно, к подобному я и пришёл: поиск самой длинной совпадающей подстроки, а после - рекурсивный вызов для двух подстрок до и после найденной. Спасибо.
Albor
Сообщения: 482
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

07 апр 2008, 18:18

Если кому интересно, то полностью удовлетворяет данную тему алгоритм, называемый "Расстояние Левенштейна". Почитать о нём можно в Википедии, там и исходники есть на разных языках программирования. Снимаю шляпу перед математиками. Решение просто и гениально.
Ответить