|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
31.10.2019, 13:39 | #1 | |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Найти общую подстроку в строках
Здравствуйте.
Есть списки слов вида: Цитата:
В данном случае будет "владе". Чтото никак не могу сообразить эффективный алгоритм. Может кто нибудь знает как можно это решить быстренько.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
|
31.10.2019, 13:46 | #2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
31.10.2019, 13:50 | #3 | |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Цитата:
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
|
31.10.2019, 23:36 | #4 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,551
|
Нужно чтобы быстро работало? Потому что можно решить в лоб, неэффективно, зато просто.
E-Mail: arigato.freelance@gmail.com
|
01.11.2019, 07:57 | #5 |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Ну подскажите как? Именно для множества строк а не только для двух.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
01.11.2019, 09:27 | #6 |
Высокая репутация
СуперМодератор
Регистрация: 27.07.2008
Сообщений: 15,551
|
Для двух строк находим общую подстроку. Далее находим общую подстроку для этой подстроки и третьей строки. Повторяем по всем строкам.
Есть нюанс, общих подстрок у двух строк может быть несколько. Следовательно такое надо проделывать с каждой общей подстрокой. Тут может помочь рекурсия, ну или просто их в стек загонять. Это самое простое решение в лоб. Оно нерационально и может быть довольно затратно по ресурсам. E-Mail: arigato.freelance@gmail.com
|
02.11.2019, 00:50 | #7 |
Старожил
Регистрация: 23.10.2010
Сообщений: 2,309
|
Могу предложить версию поиска, но вот насколько она подходит, хз.
Идея: 1. Найти минимальное слово из группы - контрольное слово. 2. Всем словам в группе добавить префиксы и постфиксы (расширить слова). Длина префикса и постфикса - это длина минимального слова - 1. 3. Выполняем корреляционный поиск. а) Посимвольно вычитаем значение символа слова и символа контрольного слова. б) разность по модулю суммируем в) ищем минимальную сумму и позицию контрольного слова г) формируем подстроку из символов, которые начинаются с позиции контрольного слова и составляют нулевую разность с символами контрольного слова. 4. Собираем подстроки в список (массив) 5. Находим минимальную подстроку. PS: На примере вашей группы слов написал решение на Питоне. Я не программист, просто попробовал, так что если что не ругайте Текст скрипта и файл с набором слов вашего примера во вложении.
Как-то так, ...
|
04.11.2019, 17:23 | #8 |
МегаМодератор
СуперМодератор
Регистрация: 27.11.2012
Сообщений: 5,657
|
1. Для слов можно попробовать пойти от максимина сумм минимумов до краев слова у общих букв. У примера в #1 для {в, л, а, д, е} максимально возможные подстроки в 7 букв.
2. Далее можно искать в порядке минимума суммарного числа общих букв. Тогда будет поиск от "д". Или по наиболее "средней", тогда от а (по 3 справа и слева). Или просто с первой, тогда "в". а) В проходе или его конце надо учесть поглощение других максиминов из п1. б) Или построить какое-то другое правило, например, если общая буква единственная то без нее распад строки на подстроки, берется минимакс. Например, для поиска от "д" это будет "овла", она короче чем "владе" значит, максимальная строка уже найдена. Простая эвристика может сработать не всегда, но всегда можно вернуться к перебору вариантов из п1. Лучше посмотреть статистику отсеянного эвристикой. Еще легко ускорить обрезкой необщих букв по краям.
Благими намерениями устлана дорога на programmersforum.ru
Последний раз редактировалось MihalNik; 04.11.2019 в 18:04. |
05.11.2019, 13:24 | #9 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Набросок с суффиксным автоматом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
05.11.2019, 14:46 | #10 |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Спасибо всем за оперативную помощь. Буду разбираться дальше. ))
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Найти подстроку в строке и записать в переменную | 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 |