Size: a a a

Язык программирования Julia / Julia programming language

2020 February 13

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Андрей Оськин
Если задача позволяет, то можно считывать массив по кусочкам и обрабатывать. Где-то был такой тип массивов.
Я так и хотел. На projecteuler.net задачи прохожу на Julia+Calc.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Хммм, я могу ошибаться, но задачи на Эйлере обычно подразумевают какое-то оригинальное решение, не брут форс.

Массив не влезающий в память - это как раз на брут форс похоже.
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Сейчас скину задание, там по-моему не брут-форс, а сегментация. Но сильно не пинайте, мне чтоб в топ 1% попасть ещё 39 задач решить придётся.
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Андрей Оськин
Хммм, я могу ошибаться, но задачи на Эйлере обычно подразумевают какое-то оригинальное решение, не брут форс.

Массив не влезающий в память - это как раз на брут форс похоже.
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
16 Гиг память
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Ох, ну и задачки.
У нас тут в чате математики есть, они наверное знают хорошее решение.

Но на первый взгляд кажется, что это задача на формулу включения исключения.
Добавляешь новый параллелепипед, вычисляешь пересечение с предыдущими, если где-то пересечение нетривиальное, то добавляешь пересечение (так как пересечение двух параллелепипидов - это параллелепипид).

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

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Но если повезёт, то нужно будет O(6 * n) памяти. 6 - потому что один параллелепипед характеризуется 6 точками, ну и ещё коэффициент сколько там новых будет порождаться.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Но это конечно так, со скамейки рассуждения.
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Примерно так и думал, но у меня обычным массивом медленно считалось, решил битовый попробовать.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Возможно надо индексацию какую-то умную сделать, чтобы быстро вытаскивать нужные параллелепипеды.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Опять же, это только подозрение, но наверное для каждого нового, количество пересекающихся будет O(1)
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Я решил так - 1-й полностью включаем, из каждого следующего  n-го "откусываем" пересечения со всеми предыдущими n-1, если осталось "неоткушенное", в сумму.
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
Мне кажется, это задача на дерево отрезков
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Да, это тоже.
источник

KT

Kirill Tsaregorodtsev in Язык программирования Julia / Julia programming language
Кажется, такое часто в формировании расписаний используется и в сетях вообще, правда одномерное (время)
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Aleksey Zhdanov
Я решил так - 1-й полностью включаем, из каждого следующего  n-го "откусываем" пересечения со всеми предыдущими n-1, если осталось "неоткушенное", в сумму.
Не, не совсем так.
Делаешь тип "Signed Parallelepipid" - то бишь со знаком.
Добавляешь первый со знаком +
Добавляешь второй со знаком +
Если они пересекаются, то добавляешь их пересечение со знаком -
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
На n шаге находишь пересечение со всеми предыдущими паралелелипидами.
И добавляешь все пересечения со знаком противоположным тому, который был у того, с кем пересекался.
источник

AZ

Aleksey Zhdanov in Язык программирования Julia / Julia programming language
Но медленно пошло. Вижу 3 варианта - послойно, линейными отрезками на всю глубину и объёмными сколь в память уместится.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
В конце просто суммируешь все суммы с соответствующими знаками.
источник

АО

Андрей Оськин in Язык программирования Julia / Julia programming language
Для того, чтобы быстро находить с кем пересекаться - дерево отрезков, да.
источник