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

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

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

Злоп

Цитата: Пиит от 17 апреля 2024, 18:5818 итераций это имхо круто
имхо количество итераций зависит от равномерности/разреженности данных. Если данных много и они распределены более/менее равномерно то среднее будет ~15 и ниже... Но с меня слабый математик

Пиит

Цитата: Злоп от 17 апреля 2024, 18:57Снова уперся в то, что надо писать исходя что "один" - это частный случай "много", пришлось вызов расчета для конкретной даты в цикл оборачивать

Да, Вы правы, коллега, мой просчёт, нет опыта подобных мероприятий.
Как-то наскоком всё, нужно таки лучше готовиться.
Попробую наваять тесты на множество аргументов, обработку только потребуется всем заменить, для одинаковых условий.

Djelf

Цитата: Злоп от 17 апреля 2024, 18:58Ставки делать будем?
Не думаю, оба участника достаточно адекватные. Чуток воды на голову и усё успокоится.

Злоп

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

//_____________________________________________________________________________
Процедура Выполнить()
   ДатаНач = '01/01/0001'; ДатаКон = '27/12/2998'+1; // период дат массива данных
   Колво = 0; Итератор = 0;
   Пока ДатаНач < ДатаКон Цикл
      Хронометр1 = _GetPerformanceCounter();
      сч = 0; Результат = ПоискЭлементаПоДате(ДатаНач,сч); //ВыбДатаДок
      Хронометр2 = _GetPerformanceCounter();
      
      //Сообщение = "Замер: " + ТекущаяДата() + " " + ТекущееВремя();
      //Сообщение = Сообщение + ", аргумент = " + Формат(ДатаНач, "ДДДММГГГГ");
      //Сообщение = Сообщение + ", результат = " + Формат(Результат.ДатаЗнач, "ДДДММГГГГ");
      //Сообщение = Сообщение + ", итераций = "+сч+", время выполнения = " + (Хронометр2 - Хронометр1) + " млсек";
      //Сообщить(Сообщение);
      
      Итератор = Итератор + сч; Колво = Колво + 1; ДатаНач = ДатаНач + 1;
   КонецЦикла;
   Сообщить("среднее колво итераций: "+Итератор/Колво);   
КонецПроцедуры //Выполнить

Пиит

Цитата: Злоп от 17 апреля 2024, 19:00имхо количество итераций зависит от равномерности/разреженности данных

И здесь согласен, тестовая база какая-то слишком простая, можно под неё подстроиться.
Я просто хотел нарожать побольше, чтобы запросы исключить.

АЛьФ, убери пожалуйста коды с ветки, чтоб не подглядеть у соседа по парте, от греха подальше, нету сил больше.

Злоп

Цитата: Пиит от 17 апреля 2024, 19:12можно под неё подстроиться.
я под нее не подстраивался, тупо взял период с дат первой и последней записи. и прогнал ПО ВСЕМ ДНЯМ КАЛЕНДАРЯ этого периода в качестве ДатаДок. Да, некоторые даты календаря дали всего 1 итерацию (найдено точно), там где даты календаря совпадали с датами массива...

Пиит

Цитата: Djelf от 17 апреля 2024, 19:03Не думаю, оба участника достаточно адекватные.

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

Этот спич, Djelf, не относится персонально ни к Вам, ни к другим участникам.
Это просто мои правила поведения в чужих ветках.

Пиит

Цитата: Злоп от 17 апреля 2024, 19:34...взял период с дат первой и последней записи.

Эээ, коллега, ну не подсказывайте же так громко.
Я тут прошу АЛьФа затереть Ваши коды, а Вы их развешиваете на все флагштоки.
Замечание Вам.

Djelf

Цитата: Пиит от 17 апреля 2024, 19:42Даже если вы искренне убеждены в своей адекватности
В своей адекватности я не убежден! Такие дела...

Пиит

Цитата: Djelf от 17 апреля 2024, 21:01
Цитата: Пиит от 17 апреля 2024, 19:42Даже если вы искренне убеждены в своей адекватности
В своей адекватности я не убежден! Такие дела...
Не переживайте, коллега, я тоже. Будем дружить.


Пиит

Цитата: Arbuz от 18 апреля 2024, 14:33Ладно, ладно.
  ;D

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

Пиит

Друзья, я не успеваю, никогда не мог работать "по техническому заданию".
Просьба, давайте "отдвинем строй твердынь" до пятницы.
И база тестовая ни к чёрту.
Коллеги, Злоп, никто не против?

Злоп


Пиит

Цитата: Злоп от 23 апреля 2024, 19:11Мне как пионэру - по барабану

Да, день рождения Ленина и у меня кпепко сидит в хронологической таблице. )

Вообще, коллеги, признаюсь, хотел вас "обойти на повороте" в этой задаче.
Была идея, что можно схитрить, положить ДатаЗнач в Наименование как ГодМесяцЧисло, 20240422, и с помощью НайтиПоНаименованию, по первым символам, каким-то образом сократить количество итераций.
А сам за неделю так и не смог подступиться к решению, чувствую даже, что путь этот тупиковый.