Имя: Пароль:
1C
1С v8
Найти самую длинную повторяющуюся фразу в нескольких текстах. Ищу функцию или алгоритм
0 Мимохожий Однако
 
07.11.19
08:19
Есть ли готовая функция, чтобы прикрутить её в 1С или что-то близкое?
Например, есть 3 текстовых фрагмента.
1 Cyberhawk
 
07.11.19
08:57
http://algolist.manual.ru/ тут поищи
2 ads55
 
08.11.19
10:44
(0) вот так можно, как то делал:
&НаКлиенте
Функция РазложитьТекстВМассив(мТекст)
    Результат = Новый СписокЗначений;
    
    ДлинаТекста = СтрДлина(СокрЛП(мТекст));
    ПозицияКонец = 0;
    
    перемТекст = мТекст;
    
    Пока ПозицияКонец <= ДлинаТекста Цикл
        
        ПозицияКонец = НайтиБлижайшуюПозициюСимвола(перемТекст, ПолучитьСимволыКонцаПредложения());
        
        Если ПозицияКонец = 0 Тогда
            Прервать;
        КонецЕсли;
        
        Подстрока = Сред(перемТекст, 0, ПозицияКонец);
        
        перемТекст = СокрЛП(Сред(перемТекст, ПозицияКонец + 1));
        
        Результат.Добавить(СтрДлина(Подстрока), Подстрока);
        
    КонецЦикла;
    
    Результат.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
    
    Возврат Результат;

КонецФункции

&НаКлиенте
Функция НайтиБлижайшуюПозициюСимвола(сТекст, сСимвол)
    спПозиций = Новый СписокЗначений;
    
    Для каждого мСмв Из сСимвол Цикл
        ЧислоПозиции = СтрНайти(сТекст, мСмв);
        Если ЧислоПозиции > 0 Тогда
            спПозиций.Добавить(ЧислоПозиции);
        КонецЕсли;
    КонецЦикла;
    
    спПозиций.СортироватьПоЗначению(НаправлениеСортировки.Возр);
    
    Если спПозиций.Количество() > 0 Тогда
         Возврат (спПозиций[0].Значение);
    КонецЕсли;    
        
    Возврат 0;
    
КонецФункции

&НаКлиенте
Функция ПолучитьСимволыКонцаПредложения()
    мСимволы = Новый Массив;
    мСимволы.Добавить(". ");
    мСимволы.Добавить("! ");
    мСимволы.Добавить("? ");
    мСимволы.Добавить("... ");
    Возврат мСимволы;
КонецФункции

&НаКлиенте
Процедура кмСравнить(Команда)
    мТекст1 = "";
    мТекст2 = мТекст1;

    мРезультат1 = РазложитьТекстВМассив(мТекст1);
    мРезультат2 = РазложитьТекстВМассив(мТекст2);
    
    Если мРезультат1.Количество() = 0
        Или мРезультат2.Количество() = 0 Тогда
        Сообщить("Ничего не найдено.");
        Возврат;
    КонецЕсли;
    
    Если мРезультат2.НайтиПоЗначению(мРезультат1[0].Значение) <> Неопределено Тогда
        мРезультат = (мРезультат2.НайтиПоЗначению(мРезультат1[0].Значение).Представление);
    КонецЕсли;
    
КонецПроцедуры
3 Ёпрст
 
08.11.19
10:54
(0)
https://habr.com/ru/post/199190/

алгоритмы есть, но все они "тяжелые"
4 Ёпрст
 
08.11.19
10:56
(1) хороший сайт.. суфиксные деревья..ээх.
5 Cyberhawk
 
08.11.19
13:24
(4) Да, мне этот сайт как-то тоже помог натолкнуть на мысли в правильное русло) В закладках надежно схоронил.
6 bootini
 
08.11.19
13:31
МодельПрогнозаПоискПоследовательностей (PredictionModelSequentialPatterns)
:)
7 Cyberhawk
 
08.11.19
13:58
(6) Хренасебе что есть в 1С, никогда не курил это
https://its.1c.ru/db/v8316doc#bookmark:dev:TI000000690
8 Ёпрст
 
08.11.19
14:02
(7) ага,
Использование в версии:
Доступен, начиная с версии 8.0.

какой только хрени не понапихано  в платформу и никто не пользуется
9 Новиков
 
08.11.19
14:12
(0)
1. Теория с некоторой реализацией: https://www.geeksforgeeks.org/suffix-tree-application-3-longest-repeated-substring/
2. Разные реализации и дальнейшие ссылки для изучения: https://stackoverflow.com/questions/10355103/finding-the-longest-repeated-substring
10 Михаил Козлов
 
08.11.19
15:05
(8) Пробовали в 2007 г. Ничего достойного внимания не выявили.