v7. Задачка по программированию. НайтиЭлементПоДате(Спр, ДатаДок)

Автор Пиит, 16 апреля 2024, 12:33

« назад - далее »

Злоп

Цитата: Пиит от 24 апреля 2024, 09:23положить ДатаЗнач в Наименование как ГодМесяцЧисло, 20240422, и с помощью НайтиПоНаименованию, по первым символам,
- открой для себя  СпрН.НайтиПоРеквизиту("ДатаЗнач",ИскомаяДата,1)
.
"Клюшки неисчерпаемы как атом"
(с) скромный Я

Пиит

Цитата: Злоп от 24 апреля 2024, 11:33- открой для себя  СпрН.НайтиПоРеквизиту("ДатаЗнач",ИскомаяДата,1)

Эээ, коллега, я таки не смотрел ещё Ваше решение, обуздал своё любопытство, но здесь имхо Вы себя обманываете, это поиск с операндом "=", а не какое-то регулярное выражение.
А если не равно?
Или я чего-то не допонял?

Злоп

Это поиск по индексу, быстро.
Если не равно - переходим к следующей дате.

Пиит

Цитата: Злоп от 24 апреля 2024, 19:06Это поиск по индексу, быстро.
Если не равно - переходим к следующей дате.
Так этож 10000 дат можно перебрать, не коллега, я потерплю до пятницы

Злоп

Цитата: Пиит от 24 апреля 2024, 19:30так этож 10000 дат можно перебрать,
- с чего бы это? по полному массиву данных - как выше писал - среднее колво итераций ~18.
10 тыс - это если ДатаДок = 01.01.2024, а ближайшая ДатаЗнач = 01.01.1994...

Все зависит от данных как я писал. В сильно разреженных ДатаЗнач - проще искать ДатаЗнач на совпадение с ДатаДок. В сильно наполненных ДатаЗнач - как выше тупой алгоритм.

xav

Приветствую!
Немного припозднился, но я только сегодня узнал о существовании задачи. Может и моё решение на что-нибудь сгодится)
ссылка

Пиит

Цитата: xav от 27 апреля 2024, 23:01Приветствую!
Немного припозднился,

Приветствую Вас, коллега!
Скажу честно, сам не знаю, обрадовался я или огорчился Вашему появлению. )
Хотел уже, как судья международной категории, поднять руку победителю с этой схватке, коллеге Злопу, с формулировкой "за неявку соперников".
У меня-то руки в этой ветке уже опустились.

Чтож, олимпиада по информатике продолжается, как организатор, отодвигаю срок ещё на неделю, вдруг кто-то ещё вспомнит молодость, и подключится к нашему мероприятию.
Сам я имею решение, на запросе, но не считаю его красивым, хочу разрешить задачу с помощью линейки и циркуля, на методах Спр и каких-нибудь хитросклёпанных индексах.

В общем, где-то, наверно, возможно, как будто, я таки рад Вам, коллега. )

Злоп

Ниче, ниче, ща я критиканства наведу и все опошлю ;-)

Злоп

Цитата: xav от 27 апреля 2024, 23:01Может и моё решение на что-нибудь сгодится)
Зачетно!

Даже вообще не думал в эту сторону, это как бы "сбоку" заход в базу ;-)
Но условия задачи не нарушены, все - штатно... ;-)

Вообще не подумал в эту сторону. А то, что режимы поиска по ключу есть - вообще только посмотрев "вспомнил" ;-)
Короче, однозначно, респект! Раз в 20 должно быть быстрее моего варианта.

По большому счету СпрТестовый Вообще не нужен можно сделать.
ЗначениеВстрокуВнутр(ПолучитьПустоеЗначение("Справочник.Тестовый")); // тоже даст что надо для вытаскивания имени таблицы, экономим на Спр.Выбрать/Спр.Получить и результат можно тоже собрать из найденого ключа в стандартную ссылку.

Недостатки:
1. не работает в монопольном режиме; // это имхо несущественно
2. имя индекса задано константой, по уму если - придется парсить DD/DDS..?
 

Злоп

Прогнал на режиме "меньше или равно"
Количество обрабатанных дат: 712328
Время выполнения чистое: 45.001
Среднее колво итераций: 2
Время выполнения на одну итерацию: 0.00006317454880336025 сек

xav

Цитата: Злоп от 28 апреля 2024, 13:06Зачетно!

;) А то сразу критиканством стращать)))

Цитата: Злоп от 28 апреля 2024, 13:06ЗначениеВстрокуВнутр(ПолучитьПустоеЗначение("Справочник.Тестовый")); // тоже даст что надо для вытаскивания имени таблицы, экономим на

Согласен, не подумал

Цитата: Злоп от 28 апреля 2024, 13:06и результат можно тоже собрать из найденого ключа в стандартную ссылку.

Так изначально и хотел сделать, но нужно было ID из 36ричной системы переводить в десятичную. Не знаю как это сделать штатными средствами. Да и поиск по индексированному полю достаточно быстрая история

Цитата: Злоп от 28 апреля 2024, 13:06Недостатки:

Ещё и в SQL работать не будет. И имя поля тоже константой задано...
Не стал с этим заморачиваться т.к. всё равно решение это не для прода. Правильное решение - прямой запрос имхо

Forum123

Цитата: xav от 28 апреля 2024, 13:27Не знаю как это сделать штатными средствами. Да и поиск по индексированному полю достаточно быстрая история
https://infostart.ru/1c/articles/65091/ 1С - Недокументированные возможности

xav

Вот с учетом критики и подсказок.
Новый вариант однозначно быстрее, правда, замерить толком у меня не получается т.к. на моей машине старый вариант 1-2 млсек, а новый 0-1 млсек.

Злоп

Цитата: xav от 28 апреля 2024, 13:27но нужно было ID из 36ричной системы переводить в десятичную.
это есть штатные функции или самому можно написать... Их есть...

Злоп

Цитата: xav от 28 апреля 2024, 14:47Вот замерить толком у меня не получается т.к. на моей машине старый вариант 1-2 млсек, а новый 0-1 млсек.
У меня по тестам на скорую руку выигрыш практически не значимый на большом количестве операций, процентов 5-6, но может я чего нахомутал, посмотрю позже