Сравнение строк. Наибольшая общая последовательность

14.11.16

Разработка - Универсальные функции

Заданы две строки Строка1 и Строка2. Требуется найти наибольшую общую подпоследовательность (НОП) этих строк.

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
НаибольшаяОбщаяПоследовательность.epf
.epf 6,42Kb
2
2 Скачать (1 SM) Купить за 1 850 руб.

Задача нахождения наибольшей общей подпоследовательности (англ. longest common subsequence, LCS) — задача поиска последовательности, которая является подпоследовательностью нескольких последовательностей (обычно двух). Статья на вики (Пример взят оттуда)

Один из вариантов получения степени схожести двух строк.  

Подпоследовательность отличается от подстроки. Например, если есть исходная последовательность "ABCDEF", то "ACE" будет подпоследовательностью, но не подстрокой.

Используется метод динамического программирования.

Функция НаибольшаяОбщаяПоследовательность(Стр1, Стр2)
	
	МСтр1 = МассивИзСтроки(Стр1);
	МСтр2 = МассивИзСтроки(Стр2);
	
	м = МСтр1.Количество();
	н = МСтр2.Количество();
	
	Т = Новый ТаблицаЗначений;
	
	Для ит = 0 По н Цикл
		Т.Колонки.Добавить("К" + ит);		
	КонецЦикла;
	
	Для ит = 0 По м Цикл
		НовСтр = Т.Добавить();		
	КонецЦикла; 
	
	Т.ЗаполнитьЗначения(0);
	
	Для итС = 1 По м Цикл
		Для итК = 1 По н Цикл
			
			Если МСтр1[итС-1] = МСтр2[итК-1] Тогда
				Т[итС][итК] = Т[итС-1][итК-1] + 1;
			Иначе
				Т[итС][итК] = Макс(Т[итС][итК-1], Т[итС-1][итК]);
			КонецЕсли; 
			
		КонецЦикла; 
	КонецЦикла; 
	
	Возврат ВывестиНОП(Т, МСтр1, МСтр2, м, н);	
	
КонецФункции

Функция ВывестиНОП(Т, МСтр1, МСтр2, итС, итК)

	Если итС = 0 ИЛИ итК = 0 Тогда
		Возврат "";
	ИначеЕсли МСтр1[итС-1] = МСтр2[итК-1] Тогда
		Возврат ВывестиНОП(Т, МСтр1, МСтр2, итС-1, итК-1) + МСтр1[итС-1];	
	Иначе
		Если Т[итС][итК-1] > Т[итС-1][итК] Тогда
			Возврат ВывестиНОП(Т, МСтр1, МСтр2, итС, итК-1);
		Иначе	
			Возврат ВывестиНОП(Т, МСтр1, МСтр2, итС-1, итК);
		КонецЕсли; 
	КонецЕсли; 
	
КонецФункции

Функция МассивИзСтроки(ИсходнаяСтрока)

	Результат = Новый Массив;
	Длина = СтрДлина(ИсходнаяСтрока);
		
	Для ит=1 По Длина Цикл
		Результат.Добавить(Сред(ИсходнаяСтрока, ит, 1));	
	КонецЦикла; 
	
	Возврат Результат;
	
КонецФункции

Получаем таблицу длин наибольших общих полседовательностей (таблица значений Т). 

Для строк "DCBA" и "ABCB"  таблица выглядит так:

Например пересечение Т[2][3]равно 1. Значит для строк "DC" и "ABC" длина НОП = 1 (подпоследовательность "C").

Для Т[4][4] равно 2 (подпоследвоательность "CB").

Для того, чтобы получить НОП, нужно пройти эту таблицу из нижнего правого угла в левый верхний, поднимаясь по стрелкам.

Как получаются стрелки:

итС - индекс строки таблицы Т

итК - индекс колонки таблицы Т

МСтр1, МСтр2 - массивы символов строки1 и строки2

Если МСтр1[итС-1] = МСтр2[итК-1] - диагональная стрелка, этот элемент входит в НОП. Т[3][4] соответствует 3-му символу строки "DCBA" ("B") и 4-му символу строки "ABCB" ("B") .

Если Т[итС][итК-1] > Т[итС-1][итК]  - стрелка влево

Если Т[итС][итК-1] <= Т[итС-1][итК]  - стрелка вверх
Поднимаясь из правого нижнего угла мы можем двигаться по диагонали (если символ входит в НОП), либо пропускаем символ в первой строке (стрелка вверх), либо пропускаем символ во второй строке (стрелка влево).

В приложенной обработке только описанная функция.

Наибольшая общая последовательность динамическое программирование

См. также

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Благодаря этим пяти строчкам можно больше не заморачиваться с загрузкой из внешних файлов. Пользуюсь везде, всегда и постоянно.

21.05.2024    32012    dimanich70    83    

153

Универсальные функции Программист Платформа 1С v8.3 1C:Бухгалтерия Абонемент ($m)

Задача: вставить картинку из буфера обмена на форму средствами платформы 1С.

1 стартмани

18.03.2024    5122    6    John_d    11    

57

Универсальные функции Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Пришлось помучиться с GUID-ами немного, решил поделиться опытом, мало ли кому пригодится.

12.02.2024    36577    atdonya    29    

62

Универсальные функции Программист Платформа 1С v8.3 Бесплатно (free)

На заключительных этапах, когда идет отладка или доработка интерфейса, необходимо много раз переоткрыть внешний объект. Вот один из способов автоматизации этого.

30.11.2023    6731    ke.92@mail.ru    17    

66

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    18487    YA_418728146    8    

172

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    4957    80    progmaster    11    

4

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 1C:Бухгалтерия 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    20088    192    sapervodichka    113    

137
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. artbear 1568 16.11.16 11:28 Сейчас в теме
Интересно. Подписался.
2. user840225 14.05.18 20:01 Сейчас в теме
Строка1 = "Отккровенние"
Строка2 = "Откровение"


НаибольшаяОбщаяПоследовательность возвращает "Откровение", а не "кровен"
(((
3. Alex_YAM 63 15.05.18 13:28 Сейчас в теме
(2)
Так и должно быть.

Подпоследовательность отличается от подстроки. Например, если есть исходная последовательность "ABCDEF", то "ACE" будет подпоследовательностью, но не подстрокой.
Поиск наибольшой подстроки это другая задача.
4. user840225 15.05.18 14:15 Сейчас в теме
(3) Спасибо. Не знал разницу.
Оставьте свое сообщение