1С 8.3 Бинарный поиск в Таблице значений
Данные > Примеры кода 1С > 1С 8.3 Таблица значений
Перейти в раздел примеры кода 1С 8.3:
Более быстрый вариант поиска по таблице значений
Бинарный поиск (по половинам) в Таблице значений в 1С 8.3 (от пользователя Signum1s-up):
&НаСервере
Процедура БинарныйПоискВТЗ(ТаблицаДляПоиска, ЧислоПоиска)
ТЗ = ТаблицаДляПоиска.Выгрузить();
КоличЭлементов = ТЗ.Количество();
ПервоеЗначениеТЗ = ТЗ[0].Индекс;
ПоследнееЗначениеТЗ = ТЗ[КоличЭлементов - 1].Индекс;
ИскомаяСтрокаТЗ = Неопределено;
КоличИтерацийТЗ = 0;
Пока КоличИтерацийТЗ < КоличЭлементов Цикл
КоличИтерацийТЗ = КоличИтерацийТЗ + 1;
ПоловинноеЗначение = Цел((ПервоеЗначениеТЗ + ПоследнееЗначениеТЗ)/2);
Если ЧислоПоиска > ПоловинноеЗначение Тогда
ПервоеЗначениеТЗ = ПоловинноеЗначение;
ИначеЕсли ЧислоПоиска < ПоловинноеЗначение Тогда
ПоследнееЗначениеТЗ = ПоловинноеЗначение;
Иначе
ИскомаяСтрокаТЗ = ТЗ[ПоловинноеЗначение -1];
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ИскомаяСтрокаТЗ = Неопределено Тогда
Сообщить("Строка найдена, значение поля индекс " + ИскомаяСтрокаТЗ.Индекс + "
|Количество итераций в цикле ТЗ: " + КоличИтерацийТЗ);
КонецЕсли;
КонецПроцедуры
Процедура БинарныйПоискВТЗ(ТаблицаДляПоиска, ЧислоПоиска)
ТЗ = ТаблицаДляПоиска.Выгрузить();
КоличЭлементов = ТЗ.Количество();
ПервоеЗначениеТЗ = ТЗ[0].Индекс;
ПоследнееЗначениеТЗ = ТЗ[КоличЭлементов - 1].Индекс;
ИскомаяСтрокаТЗ = Неопределено;
КоличИтерацийТЗ = 0;
Пока КоличИтерацийТЗ < КоличЭлементов Цикл
КоличИтерацийТЗ = КоличИтерацийТЗ + 1;
ПоловинноеЗначение = Цел((ПервоеЗначениеТЗ + ПоследнееЗначениеТЗ)/2);
Если ЧислоПоиска > ПоловинноеЗначение Тогда
ПервоеЗначениеТЗ = ПоловинноеЗначение;
ИначеЕсли ЧислоПоиска < ПоловинноеЗначение Тогда
ПоследнееЗначениеТЗ = ПоловинноеЗначение;
Иначе
ИскомаяСтрокаТЗ = ТЗ[ПоловинноеЗначение -1];
Прервать;
КонецЕсли;
КонецЦикла;
Если Не ИскомаяСтрокаТЗ = Неопределено Тогда
Сообщить("Строка найдена, значение поля индекс " + ИскомаяСтрокаТЗ.Индекс + "
|Количество итераций в цикле ТЗ: " + КоличИтерацийТЗ);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура БинарныйПоискНаКлиенте(Команда)
Если ТаблицаДляПоиска.Количество() = 0 Тогда
Сообщить("Таблица для поиска пустая");
Возврат;
КонецЕсли;
БинарныйПоискВТЗ(ТаблицаДляПоиска, ЧислоПоиска);
Процедура БинарныйПоискНаКлиенте(Команда)
Если ТаблицаДляПоиска.Количество() = 0 Тогда
Сообщить("Таблица для поиска пустая");
Возврат;
КонецЕсли;
БинарныйПоискВТЗ(ТаблицаДляПоиска, ЧислоПоиска);
КонецПроцедуры
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник