Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2019, 13:39   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Найти общую подстроку в строках

Здравствуйте.
Есть списки слов вида:
Цитата:
завладение
завладел
завладела
завладело
завладели
завладев
завладевая
овладев
овладевая
Нужно найти общую подстроку для всех слов.
В данном случае будет "владе".

Чтото никак не могу сообразить эффективный алгоритм. Может кто нибудь знает как можно это решить быстренько.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 31.10.2019, 13:46   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

https://e-maxx.ru/algo/suffix_automata
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.10.2019, 13:50   #3
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
прикольно конечно .. а реализации есть какие нибудь?
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 31.10.2019, 23:36   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Нужно чтобы быстро работало? Потому что можно решить в лоб, неэффективно, зато просто.
Arigato вне форума Ответить с цитированием
Старый 01.11.2019, 07:57   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Нужно чтобы быстро работало? Потому что можно решить в лоб, неэффективно, зато просто.
Ну подскажите как? Именно для множества строк а не только для двух.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 01.11.2019, 09:27   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Именно для множества строк а не только для двух.
Для двух строк находим общую подстроку. Далее находим общую подстроку для этой подстроки и третьей строки. Повторяем по всем строкам.

Есть нюанс, общих подстрок у двух строк может быть несколько. Следовательно такое надо проделывать с каждой общей подстрокой. Тут может помочь рекурсия, ну или просто их в стек загонять.

Это самое простое решение в лоб. Оно нерационально и может быть довольно затратно по ресурсам.
Arigato вне форума Ответить с цитированием
Старый 02.11.2019, 00:50   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Могу предложить версию поиска, но вот насколько она подходит, хз.
Идея:
1. Найти минимальное слово из группы - контрольное слово.
2. Всем словам в группе добавить префиксы и постфиксы (расширить слова).
Длина префикса и постфикса - это длина минимального слова - 1.
3. Выполняем корреляционный поиск.
а) Посимвольно вычитаем значение символа слова и символа контрольного слова.
б) разность по модулю суммируем
в) ищем минимальную сумму и позицию контрольного слова
г) формируем подстроку из символов, которые начинаются с позиции контрольного слова и составляют нулевую разность с символами контрольного слова.
4. Собираем подстроки в список (массив)
5. Находим минимальную подстроку.

PS: На примере вашей группы слов написал решение на Питоне.
Я не программист, просто попробовал, так что если что не ругайте
Текст скрипта и файл с набором слов вашего примера во вложении.
Вложения
Тип файла: rar Work.rar (758 байт, 15 просмотров)
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 04.11.2019, 17:23   #8
MihalNik
МегаМодератор
СуперМодератор
 
Регистрация: 27.11.2012
Сообщений: 5,657
По умолчанию

1. Для слов можно попробовать пойти от максимина сумм минимумов до краев слова у общих букв. У примера в #1 для {в, л, а, д, е} максимально возможные подстроки в 7 букв.
2. Далее можно искать в порядке минимума суммарного числа общих букв. Тогда будет поиск от "д". Или по наиболее "средней", тогда от а (по 3 справа и слева). Или просто с первой, тогда "в".
а) В проходе или его конце надо учесть поглощение других максиминов из п1.
б) Или построить какое-то другое правило, например, если общая буква единственная то без нее распад строки на подстроки, берется минимакс. Например, для поиска от "д" это будет "овла", она короче чем "владе" значит, максимальная строка уже найдена. Простая эвристика может сработать не всегда, но всегда можно вернуться к перебору вариантов из п1. Лучше посмотреть статистику отсеянного эвристикой.

Еще легко ускорить обрезкой необщих букв по краям.
Благими намерениями устлана дорога на programmersforum.ru

Последний раз редактировалось MihalNik; 04.11.2019 в 18:04.
MihalNik вне форума Ответить с цитированием
Старый 05.11.2019, 13:24   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Набросок с суффиксным автоматом
Вложения
Тип файла: zip Новая папка (6).zip (11.0 Кб, 12 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.11.2019, 14:46   #10
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Спасибо всем за оперативную помощь. Буду разбираться дальше. ))
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти подстроку в строке и записать в переменную bober123 Общие вопросы C/C++ 0 07.07.2018 09:51
Найти подстроку заключенную в скобки? kkk-it C# (си шарп) 1 05.07.2017 11:48
в строке найти подстроку gylayko Помощь студентам 0 10.11.2012 17:14
Найти общую сумму romanln2012 Microsoft Office Access 1 17.10.2012 09:38
Ось с прямоугольниками, найти общую площадь sp.caster Паскаль, Turbo Pascal, PascalABC.NET 30 23.04.2011 08:27