Быстрый алгоритм

1. scientes 295 03.05.23 14:07 Сейчас в теме
Какой самый быстрый способ определить средствами 1С, что в строке есть повторяющиеся символы ?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. user-z99999 71 03.05.23 14:39 Сейчас в теме
(1)
повторяющиеся символы

какие символы?
верхний и нижний регистр, числа, разная раскладка клавиатуры (анг, рус)
3. user-z99999 71 03.05.23 14:41 Сейчас в теме
(1)
Попробуй отсортировать строку, и сравнивать соседние символы.
(если алгоритмы сортировки в 1с "правильные" т.е. не занимают много ресурсов памяти)
4. spacecraft 03.05.23 14:43 Сейчас в теме
(1) самый быстрый в цикле перебрать символы строки и использовать соответствие.
Что-то в таком виде:
ЕстьПовторы = Ложь;
СимволыСтроки = Новый Соответствие;
Для К=1 По СтрДлина(ВхСтрока) Цикл
	Если СимволыСтроки[Сред(ВхСтрока,К,1)]=Истина Тогда
		ЕстьПовторы = Истина;
		Прервать;
	Иначе
		СимволыСтроки[Сред(ВхСтрока,К,1)]=Истина;
	КонецЕсли;
КонецЦикла;
Сообщить(ЕстьПовторы);
Показать
5. SlavaKron 03.05.23 15:01 Сейчас в теме
(4) Подушню. В среднем, Сред(ВхСтрока,К,1) будет выполняться дважды - текущий символ лучше сохранять в переменную.

Еще можно потестить СтрЧислоВхождений, но вряд ли оно будет быстрее.
6. spacecraft 03.05.23 15:03 Сейчас в теме
(5) это уже оптимизация :)
7. scientes 295 03.05.23 15:53 Сейчас в теме
(4) По моим наблюдениям это самый быстрый.
Нашел еще такой хитрый способ.
Функция ЕстьПовторения(стр) экспорт
	н=СтрДлина(стр);
	если н<=1 тогда
		возврат ложь;
	конецесли;	
	
	н=цел(н/2);
	
	т=СтрРазделить(Лев(стр,н),Сред(стр,н+1));
	если т.Количество()<>1 тогда
		возврат истина;
	иначе	
		возврат ЕстьПовторения(Лев(стр,н)) или ЕстьПовторения(Сред(стр,н+1));
	конецесли;
	
КонецФункции




Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот