Андрей, Ваша оптимизация, изложенная в #275 и так работает достаточно эффективно. До пункта 5 сам не додумался, поэтому применять у себя не стал - ибо неспортивно:) Во всяком случае мое решение Вы переигрываете вчистую на большинстве тестовых наборов.
"Тёмных лошадок" вроде не наблюдается.
kolyn, я думаю, нужно использовать всю информацию что есть, а если я выложил свои идеи, то сам виноват, что кто-нибудь ими воспользуется. Может для интереса попробуете п.5 осуществить?
Хоть было уже поздно, но все-таки под конец я отладил очередную, четвертую, версию своего кода :) По времени уже было видно, что не успею, но не хотелось оставлять незавершенки :) бросать так сказать на пол-дороге.
Алгоритм остался прежним, времена по сравнению с вариантом из сообщения #274 уменьшились незначительно, в среднем на 5-15% . Главное достижение - код перестал вылетать на 25 ключах из набора ГОСТ :)
Не знаю, когда будут подведены итоги и каковы будут результаты, но я хочу отметить, что развлекся я классно! это было что-то :) Спасибо всем участвовавшим, сочувствующим и, конечно, организатору.
Да, время вышло, даже по Гринвичу. Ставки сделаны, ставок больше нет. :)
Кстати, в последней идеи доработать код я ошибся, мне показалось, что набор после фильтрации можно ещё прогнать через фильтрацию, отсюда и лишний ключ 8-10 из набора задания.
Перебор сочетаний я взял с этой статьи, как работает не до конца понял, но "прикрутил".
Ознакомился со структурами, раньше не использовал.
Ещё обнаружил несколько полезностей, при разработке первого варианта кода.
я отладил очередную, четвертую, версию своего кода :)
Так вы решили в новички записаться? ;-)
А это первый конкурс на этом ресурсе? По мне, так сложновато для новичков, тем более для ардуинщиков, мимо основных тем.
Однако, очень интересно посмотреть все результаты и код ЕП.
А почему бы и нет :) о своем отношении к конкурсу написал в #166.
На призы не претендую, но посоревноваться хочется:) Не вижу в этом ничего стыдного :)
Кстати, скромно думаю, что мое участие придало конкурсу остроты :) Если пролистать назад - видно что поначалу оба других участника считало метод сплошного перебора вполне подходящим и времена в сотни и даже тысячи миллисекунд их совершенно не смущали. После того как я выложил свои результаты с решением быстрее 3мс - народ зашевелился , стал искать другие подходы :)
видно что поначалу оба других участника считало метод сплошного перебора вполне подходящим и времена в сотни и даже тысячи миллисекунд их совершенно не смущали. После того как я выложил свои результаты с решением быстрее 3мс
При изрядной доле везения и вовремя произошедшем переполнении millis перебор тоже может показать вполне приличный результат:))
А это первый конкурс на этом ресурсе? По мне, так сложновато для новичков, тем более для ардуинщиков, мимо основных тем. Однако, очень интересно посмотреть все результаты и код ЕП.
Да и приз не копеечный. :)
Жаль участников мало было. Я слишком поздно сообщил своему коллеге, он тоже заинтересовался, но куда-то свою ардуинку задевал, он заказал новую. И брат у меня по диплому программист, но как диплом написал, больше не кодил. Так что, думаю, в следующем конкурсе будет больше участников.
И что, даже в порядке вне зачёта никто не рискнул съесть большого слона по кусочку?
Предполагаемое время 15-20 миллисекунд на 100 ключей...
У вас уже есть такой код?
Тогда он, для начала, должен решать ГОСТ-овский набор за миллисекунды. А потом должен учитывать, что ключи с размерами {1, 80, 1} тоже по условию задачи могут быть в наборе.
Взял этот набор, граф которого представлен выше, волюнтаристки поделил его на два:
посчитал каждый отдельно и слил результаты. Как ни странно, минимальный набор совпал с прежними расчетами.
Итог - если мой прежний алгоритм считал его примерно за 12 мсек, то "методом слона" (назовем его так) время снизилось до 5.5 мсек. Казалось бы - успех ...
Но!!
Во-первых, почему всего в 2 раза? что так мало? я ожидал вчетверо... хлтя нет... каждая половинка считается в 4 раза быстрее, но половинок две - получаем в 2 раза, тут все верно.
Но и эти 2 раза - результат излишне оптимистичный, это время не учитывает затраты на разделение графа, поскольку в этом случае я поделил его вручную.
Более того, если взять исходный набор Евгения и посчитать "методом слона" его - выигрыша вообще нет, есть проигрыш.
Но и это все неважно по сравнению с тем, что метод иногда ошибается :) Дело в том. что разделенные графы теряют часть информации друг о друге и минимум в половинке, рассчитанной отдельно - может оказаться не тем, что был в полном наборе. Хотя я и пытался делить набор "умно", оставляя "пограничные" ребра одновременно и в левом и в правом графе - все равно этого оказалось недостаточно.
Так что пока складывается впечатление, что этот подход не позволит особо улучшить результаты. Хотя идейка интересная.
А если идти от максимального (в пределах разумного) количества ключей, где есть все размеры от 1 до 255, и все сочетания без повторений ключей с этими размерами и без дублей с высокой ценой, т.е. 32385 ключей. Понимаю, что столько в нанку не влезет, но в теории, как будет выглядеть граф и каково будет его решение?
по росту в кустах на обочине выстраивал?... Ик... сорри..
нет ...в кустах это в Средней Азии СССР было... "а знания другой студентки рядом в кустах подтягивал аж профессор" :-)))
Всё прозаичней ...
PS Ты лучше коллегам подсказал бы, как "Большого слона есть по кусочку", блесни школой, а то с такими подходами как озвучивают ни какой памяти и вычислительных мощностей не хватит...
Очевидное - если набор можно разделить на подмножества с непересекающимися размерами, например (5*6, 6*7, 7*8, 8*5) и (15*17, 17*19, 19*15). Но это уж ооочень частный случай))
Очевидное - если набор можно разделить на подмножества с непересекающимися размерами, например (5*6, 6*7, 7*8, 8*5) и (15*17, 17*19, 19*15). Но это уж ооочень частный случай))
мне кажется, в таком случае и делить не надо - набор и так поделен
AndreyD пишет:
А если к набору добавят 6-27, 15-24, 13-22, 6-18?
вот об этом я и веду речь - в общем случае поделить набор совсем не просто. У меня пока не сложились в голове принципы, как вообще его делить. В идеале набор нужно делить на такие части, чтобы они , с одной стороны - были примерно равными по размеру, а с другой - имели как можно меньше связей... На графе обычно более-менее очевидно, где должен быть раздел... но как это сформулировать в коде?
Тут бы нам ua6em должен помочь - ведь это он все время толкае нас на эту дорогу - но он, походу, только только подначивать и горазд.
Цитата:
А если идти от максимального (в пределах разумного) количества ключей, где есть все размеры от 1 до 255, и все сочетания без повторений ....32385 ключей. Понимаю, что столько в нанку не влезет, но в теории, как будет выглядеть граф и каково будет его решение?
к чему этот вопрос? Я все ж призываю рассматривать реальные примеры, которые мы в состоянии проверить.
Возвращаясь к алгоритму деления и его практическим результатам - я взял для примера самый большой набор ua6em. который он предложил в этой ветке - из сообщения #232:
алгоритмом, который я использовал в конкурсе - этот набор решается за 718 мс, минимальный набор стоит 623, 71 руб. Методом деления этот же набор решается уже за 75мс - но решение немного хуже - 624.10.
То есть алгоритм дает не самый оптимум, но довольно близкий к нему ответ, в данном случае лишь менее чем на 0.1 % хуже, но в 10 раз быстрее. Не спешите сразу отметать этот результат на основании того, что это не абсолютный минимум... в данном случае это чем-то напоминает методы сжатия данных с потерями - те что используются в МП3 - расжатый звук получается немного не тот, что оригинальный, но зато его удается сжать значительно сильнее, чем LowLess кодеками
по росту в кустах на обочине выстраивал?... Ик... сорри..
PS Ты лучше коллегам подсказал бы, как "Большого слона есть по кусочку", блесни школой, а то с такими подходами как озвучивают ни какой памяти и вычислительных мощностей не хватит...
"Лучше" бы у меня был хер до колена, крылья за спиной и мульон долларофф! ;))
А по делу - в общем случае нельзя разделить множество на два поменьше. То есть изначально нужно разбить на связанные группы, а вот разделить связанную - это уже совсем не простая задача. Если связь - однозначный путь без петель, то можно разбить по разным границам ключа и решить 4 половинные задачи - все же сильно меньше перебор. Но нужно время на поиск и локализацию связи. А тут не очевидно что это будет быстрее брутфорса. в группе из 8 ключей - полный брутфорс всего 256 вариантов.
Правильный подход - выбрать стратегию полного перебора неких групп (НО НЕ ЕДИНСТВЕННОГО ДЕЛЕНИЯ НА ДВЕ ЧАСТИ - так неправильно), а в группах - тупо брутфорсить, с ограничениями по количеству ключей. Тоже экспонента, но поменьше.
А по делу - в общем случае нельзя разделить множество на два поменьше. То есть изначально нужно разбить на связанные группы, а вот разделить связанную - это уже совсем не простая задача. Если связь - однозначный путь без петель, то можно разбить по разным границам ключа и решить 4 половинные задачи.
да, я ужетоже пришел к тому. что при разбитии на 2 группы надо решать 4 половинных задачи - а это приводит к еще большим потерям времени и выигрыш от метода совсем исчезает
Цитата:
Правильный подход - выбрать стратегию полного перебора неких групп (НО НЕ ЕДИНСТВЕННОГО ДЕЛЕНИЯ НА ДВЕ ЧАСТИ - так неправильно), а в группах - тупо брутфорсить, с ограничениями по количеству ключей. Тоже экспонента, но поменьше.
нафиг не надо ничего брутфорсить. В том методе, что использовал в конкурсе - я на самом деле тоже дроблю исходное множество на все меньшие и меньшие части в рекурсии. И это дает неплохие результаты - время решения больших множеств у меня получается в сотни, а то и в тыщи раз лучше брутфорса. Все что нужно моему методу - это место в памяти для рекурсии, места, которого в Уно слишком мало. Но взять, к примеру, Мегу - метод решает все представленные в ветке примеры в пределах 100мс - сравни с десятками и даже тыщами мс на брутфорсе
Uno 328 Mega2560
EP 2.53 2.53
EP + 9-27 11.68 11.72
GOST26 20.68 20.70
GOST28 30.53 30.57
GOST30 10.80 10.79
GOST32 -- 77.7
GOST35 -- 81.8
Andre-100 -- 31.8
я не могу помочь, так как совсем не программист и не математик, ждёмс, что скажет Евгений Петрович, да ведь 100 мсек это уже серьёзные подвижки...и разность в копейках тут не важна, главное реальное время для реального ограниченного оперативной памятью ресурса...
PS небольшим флудом тему просто "подогревал"
PPS ту автоматику, что сделал приятелю для кораблика (возврат по GPS) оказалось использовать при определённом направлении ветра нельзя, так как все ресурсы тратились на борьбу с волной, возвращает в ручном режиме и галсами
Ахранеть! По такой логике если программа выдает неверный результат но делает это быстрее - она победила?
о " победе" никто не говорит, конкурс уже закончился.
Вопрос интересен сам по себе. Не будьте так категоричны, метод разделения ( так как я его пока написал ) - не дает абсолютного оптимума, но он ЗАВЕДОМО дает очень близкий к минимуму результат. Я затрудняюсь сказать насколько - тут Дракуле карты в руки - но имхо ошибка не превысит цены пограничного ключа. То есть чем больше исходный набор, тем ближе результат к оптимуму.
И если вопрос стоит практический - получить ли абсолютный минимум брутфорсом за 15 минут или довольствоваться на 0.1% худшим выбором, полученным за 0.1 секунды - все не так однозначно:)
о " победе" никто не говорит, конкурс уже закончился. Вопрос интересен сам по себе. Не будьте так категоричны, метод разделения ( так как я его пока написал ) - не дает абсолютного оптимума, но он ЗАВЕДОМО дает очень близкий к минимуму результат.
Тут необходимо определиться что чего мы хотим добиться - правильного результата или минимального времени выполнения. Это как 2 + 2 приблизительно 4.2 - какой смысл искать такое решение?
алгоритмом, который я использовал в конкурсе - этот набор решается за 718 мс, минимальный набор стоит 623, 71 руб. Методом деления этот же набор решается уже за 75мс - но решение немного хуже - 624.10.
То есть алгоритм дает не самый оптимум, но довольно близкий к нему ответ, в данном случае лишь менее чем на 0.1 % хуже, но в 10 раз быстрее. Не спешите сразу отметать этот результат на основании того, что это не абсолютный минимум... в данном случае это чем-то напоминает методы сжатия данных с потерями - те что используются в МП3 - расжатый звук получается немного не тот, что оригинальный, но зато его удается сжать значительно сильнее, чем LowLess кодеками
Ну, аналогия со сжатием с потерями в данном случае не работает: алгоритм либо решает задачу (всегда), либо не решает (во всех или в некоторых случаях не находит оптимума). Очевидно, что "метод деления" задачу НЕ решает.
НО:
в основном алгоритме важным фактором является начальное приближение. Если за 10% времени от работы основного алгоритма можно найти хорошее начальное приближение, то оно сократит время работы основного алгоритма, возможно, на величину более 10%.
Т.е. имеет смысл попытаться применить эти алгоритмы последовательно.
Все правильно: подсчет голосов, судебные иски, пересчет голосов... тут бы к февралю успеть...
Главное провести допиг-контроль и наличие маски на лице. И можно тогда приз не отсылать. Опять же надо знать страну участника. А то нет гарантии что местные безопасники займутся этим победителем и выпишут ему бонус и от себя.
Я всем знакомым связанным с программированием рассказал про конкурс, но слишком поздно, и что он закончиться 30 ноября. А они теперь спрашивают про результат. Памагите. )))
расскажи про функциональное программирование. Тут ведь копья апголову ломают.
это где? не помню таких дискуссий здесь
просто так решать надо. это ж поиск оптимума. Перебор то все равно будет, рекурсией ли, функционалими ли. Вопрос в том, что лучше оптимизирует компилятор. Есть мнение, что второй вариант компилятору ближе.
IMHO внесение изменений в правила конкурса дискредитируют конкурс сильнее, чем любое другое решение. Т.е. нельзя делать то, что нельзя делать ни при каких обстоятельствах, какими бы благими намерениями это не диктовалось.
На мой взгляд, лучше бы подумать о том, как бы сделать практику конкурсов на форуме если не регулярной, то хотя бы эпизодической.
Я всем знакомым связанным с программированием рассказал про конкурс, но слишком поздно, и что он закончиться 30 ноября. А они теперь спрашивают про результат. Памагите. )))
Андрей, ну вот правда, простите, ну припёрло, думал до пятницы расхлебаюсь ... в общем завтра или край - послезавтра приступлю к этой работе.
как бы сделать практику конкурсов на форуме если не регулярной, то хотя бы эпизодической.
Форум то тематический. Очень трудно придумать задачи, годные для выполнения на МК и не требующие дополнительных модулей, блоков и т.д. И в то же время и про программную составляющую не забыть, сделав ее достаточной сложности.
Андрей, Ваша оптимизация, изложенная в #275 и так работает достаточно эффективно. До пункта 5 сам не додумался, поэтому применять у себя не стал - ибо неспортивно:) Во всяком случае мое решение Вы переигрываете вчистую на большинстве тестовых наборов.
"Тёмных лошадок" вроде не наблюдается.
kolyn, я думаю, нужно использовать всю информацию что есть, а если я выложил свои идеи, то сам виноват, что кто-нибудь ими воспользуется. Может для интереса попробуете п.5 осуществить?
Выкладываю окончательную версию. Завтра и компьютер включать не буду:)
Пишу с телефона:)
Итак, время вышло :)
Хоть было уже поздно, но все-таки под конец я отладил очередную, четвертую, версию своего кода :) По времени уже было видно, что не успею, но не хотелось оставлять незавершенки :) бросать так сказать на пол-дороге.
Алгоритм остался прежним, времена по сравнению с вариантом из сообщения #274 уменьшились незначительно, в среднем на 5-15% . Главное достижение - код перестал вылетать на 25 ключах из набора ГОСТ :)
Не знаю, когда будут подведены итоги и каковы будут результаты, но я хочу отметить, что развлекся я классно! это было что-то :) Спасибо всем участвовавшим, сочувствующим и, конечно, организатору.
Итак, время вышло :)
Да, время вышло, даже по Гринвичу. Ставки сделаны, ставок больше нет. :)
Кстати, в последней идеи доработать код я ошибся, мне показалось, что набор после фильтрации можно ещё прогнать через фильтрацию, отсюда и лишний ключ 8-10 из набора задания.
Перебор сочетаний я взял с этой статьи, как работает не до конца понял, но "прикрутил".
Ознакомился со структурами, раньше не использовал.
Ещё обнаружил несколько полезностей, при разработке первого варианта кода.
Вывод uint64_t в Serial:
Счет бинарных единиц в uint64_t:
я отладил очередную, четвертую, версию своего кода :)
Так вы решили в новички записаться? ;-)
А это первый конкурс на этом ресурсе? По мне, так сложновато для новичков, тем более для ардуинщиков, мимо основных тем.
Однако, очень интересно посмотреть все результаты и код ЕП.
А почему бы и нет :) о своем отношении к конкурсу написал в #166.
На призы не претендую, но посоревноваться хочется:) Не вижу в этом ничего стыдного :)
Кстати, скромно думаю, что мое участие придало конкурсу остроты :) Если пролистать назад - видно что поначалу оба других участника считало метод сплошного перебора вполне подходящим и времена в сотни и даже тысячи миллисекунд их совершенно не смущали. После того как я выложил свои результаты с решением быстрее 3мс - народ зашевелился , стал искать другие подходы :)
видно что поначалу оба других участника считало метод сплошного перебора вполне подходящим и времена в сотни и даже тысячи миллисекунд их совершенно не смущали. После того как я выложил свои результаты с решением быстрее 3мс
При изрядной доле везения и вовремя произошедшем переполнении millis перебор тоже может показать вполне приличный результат:))
Да и приз не копеечный. :)
Жаль участников мало было. Я слишком поздно сообщил своему коллеге, он тоже заинтересовался, но куда-то свою ардуинку задевал, он заказал новую. И брат у меня по диплому программист, но как диплом написал, больше не кодил. Так что, думаю, в следующем конкурсе будет больше участников.
Мужики, всем сапсибо!
Жизнь так повернулась, что до выходных я врядли этим займусь. Извините за задержку. Но займусь обязательно.
Извините за задержку. Но займусь обязательно.
подождем :)
Все правильно: подсчет голосов, судебные иски, пересчет голосов... тут бы к февралю успеть...
Все правильно: подсчет голосов, судебные иски, пересчет голосов... тут бы к февралю успеть...
Майдан опять же ж :-)
Как видно, скорость работы зависит от числа ключей совсем не однозначно... Строчки выше тестировать не стал
Наборы из 100 ключей не работают.
"Эх ты деревня"..."Большого слона едят по куску"...
И что, даже в порядке вне зачёта никто не рискнул съесть большого слона по кусочку?
Предполагаемое время 15-20 миллисекунд на 100 ключей...
И что, даже в порядке вне зачёта никто не рискнул съесть большого слона по кусочку?
Предполагаемое время 15-20 миллисекунд на 100 ключей...
У вас уже есть такой код?
Тогда он, для начала, должен решать ГОСТ-овский набор за миллисекунды. А потом должен учитывать, что ключи с размерами {1, 80, 1} тоже по условию задачи могут быть в наборе.
И что, даже в порядке вне зачёта никто не рискнул съесть большого слона по кусочку?
Предполагаемое время 15-20 миллисекунд на 100 ключей...
чем меньше ты понимаешь в предмете, тем очевидней и проще кажется задача :)
Напиши такой алгоритм - мы сравним время.
И что, даже в порядке вне зачёта никто не рискнул съесть большого слона по кусочку?
Предполагаемое время 15-20 миллисекунд на 100 ключей...
хм... походе ты не понимаешь, что задача деления графа на части не такая простая. Если граф многократно замкнут на себя - как ты его разделишь?
хотя.... может ты и прав.
Седня вечером попробую.
хм... походе ты не понимаешь, что задача деления графа на части не такая простая. Если граф многократно замкнут на себя - как ты его разделишь?
Так эта задача не про граф. Она про множество графов с двумя узлами и одной дугой.
Так эта задача не про граф. Она про множество графов с двумя узлами и одной дугой.
если честно, я в теории графов не силен. В свое время струсил на мехмат поступать :)
Хорошо, пусть это не граф - а множество, вопрос остается прежним - как его правильно поделить на части?
Теоретически - если множество является функцией от чего-либо, то можно. Если оно случайно, как в задаче, - неможно.
Теоретически - если множество является функцией от чего-либо, то можно. Если оно случайно, как в задаче, - неможно.
Оно не случайно, оно предварительно сортированный список, в этом уверен, так как много работал с барышнями из оного )))
Оно не случайно, оно предварительно сортированный список, в этом уверен, так как много работал с барышнями из оного )))
Это Вы часом не о специфичной работе с VIP-клиентами?
оно предварительно сортированный список, в этом уверен, так как много работал с барышнями из оного )))
С барышнями из предварительно отсортированного списка? Можно с этого места поподробнее :-)
оно предварительно сортированный список, в этом уверен, так как много работал с барышнями из оного )))
С барышнями из предварительно отсортированного списка? Можно с этого места поподробнее :-)
как-нибудь в отвлеченных? ;-)))
пРСТИТЕ... это блядей по росту в кустах на обочине выстраивал?... Ик... сорри..
Шаббат шалом, кстати! Православные! ;)))
ua6em - попробовал... как-то не очень
Взял этот набор, граф которого представлен выше, волюнтаристки поделил его на два:
посчитал каждый отдельно и слил результаты. Как ни странно, минимальный набор совпал с прежними расчетами.
Итог - если мой прежний алгоритм считал его примерно за 12 мсек, то "методом слона" (назовем его так) время снизилось до 5.5 мсек. Казалось бы - успех ...
Но!!
Во-первых, почему всего в 2 раза? что так мало? я ожидал вчетверо... хлтя нет... каждая половинка считается в 4 раза быстрее, но половинок две - получаем в 2 раза, тут все верно.
Но и эти 2 раза - результат излишне оптимистичный, это время не учитывает затраты на разделение графа, поскольку в этом случае я поделил его вручную.
Более того, если взять исходный набор Евгения и посчитать "методом слона" его - выигрыша вообще нет, есть проигрыш.
Но и это все неважно по сравнению с тем, что метод иногда ошибается :) Дело в том. что разделенные графы теряют часть информации друг о друге и минимум в половинке, рассчитанной отдельно - может оказаться не тем, что был в полном наборе. Хотя я и пытался делить набор "умно", оставляя "пограничные" ребра одновременно и в левом и в правом графе - все равно этого оказалось недостаточно.
Так что пока складывается впечатление, что этот подход не позволит особо улучшить результаты. Хотя идейка интересная.
Взял этот набор, граф которого представлен выше, волюнтаристки поделил его на два:
посчитал каждый отдельно и слил результаты. Как ни странно, минимальный набор совпал с прежними расчетами.
Предложите свое деление
А если к набору добавят 6-27, 15-24, 13-22, 6-18?
А если идти от максимального (в пределах разумного) количества ключей, где есть все размеры от 1 до 255, и все сочетания без повторений ключей с этими размерами и без дублей с высокой ценой, т.е. 32385 ключей. Понимаю, что столько в нанку не влезет, но в теории, как будет выглядеть граф и каково будет его решение?
по росту в кустах на обочине выстраивал?... Ик... сорри..
нет ...в кустах это в Средней Азии СССР было... "а знания другой студентки рядом в кустах подтягивал аж профессор" :-)))
Всё прозаичней ...
PS Ты лучше коллегам подсказал бы, как "Большого слона есть по кусочку", блесни школой, а то с такими подходами как озвучивают ни какой памяти и вычислительных мощностей не хватит...
пРСТИТЕ... это блядей по росту ...
Для начала, он, видимо, сортировал их методом вставок :-)
Очевидное - если набор можно разделить на подмножества с непересекающимися размерами, например (5*6, 6*7, 7*8, 8*5) и (15*17, 17*19, 19*15). Но это уж ооочень частный случай))
Очевидное - если набор можно разделить на подмножества с непересекающимися размерами, например (5*6, 6*7, 7*8, 8*5) и (15*17, 17*19, 19*15). Но это уж ооочень частный случай))
мне кажется, в таком случае и делить не надо - набор и так поделен
А если к набору добавят 6-27, 15-24, 13-22, 6-18?
вот об этом я и веду речь - в общем случае поделить набор совсем не просто. У меня пока не сложились в голове принципы, как вообще его делить. В идеале набор нужно делить на такие части, чтобы они , с одной стороны - были примерно равными по размеру, а с другой - имели как можно меньше связей... На графе обычно более-менее очевидно, где должен быть раздел... но как это сформулировать в коде?
Тут бы нам ua6em должен помочь - ведь это он все время толкае нас на эту дорогу - но он, походу, только только подначивать и горазд.
к чему этот вопрос? Я все ж призываю рассматривать реальные примеры, которые мы в состоянии проверить.
Возвращаясь к алгоритму деления и его практическим результатам - я взял для примера самый большой набор ua6em. который он предложил в этой ветке - из сообщения #232:
алгоритмом, который я использовал в конкурсе - этот набор решается за 718 мс, минимальный набор стоит 623, 71 руб. Методом деления этот же набор решается уже за 75мс - но решение немного хуже - 624.10.
То есть алгоритм дает не самый оптимум, но довольно близкий к нему ответ, в данном случае лишь менее чем на 0.1 % хуже, но в 10 раз быстрее. Не спешите сразу отметать этот результат на основании того, что это не абсолютный минимум... в данном случае это чем-то напоминает методы сжатия данных с потерями - те что используются в МП3 - расжатый звук получается немного не тот, что оригинальный, но зато его удается сжать значительно сильнее, чем LowLess кодеками
по росту в кустах на обочине выстраивал?... Ик... сорри..
PS Ты лучше коллегам подсказал бы, как "Большого слона есть по кусочку", блесни школой, а то с такими подходами как озвучивают ни какой памяти и вычислительных мощностей не хватит...
"Лучше" бы у меня был хер до колена, крылья за спиной и мульон долларофф! ;))
А по делу - в общем случае нельзя разделить множество на два поменьше. То есть изначально нужно разбить на связанные группы, а вот разделить связанную - это уже совсем не простая задача. Если связь - однозначный путь без петель, то можно разбить по разным границам ключа и решить 4 половинные задачи - все же сильно меньше перебор. Но нужно время на поиск и локализацию связи. А тут не очевидно что это будет быстрее брутфорса. в группе из 8 ключей - полный брутфорс всего 256 вариантов.
Правильный подход - выбрать стратегию полного перебора неких групп (НО НЕ ЕДИНСТВЕННОГО ДЕЛЕНИЯ НА ДВЕ ЧАСТИ - так неправильно), а в группах - тупо брутфорсить, с ограничениями по количеству ключей. Тоже экспонента, но поменьше.
А по делу - в общем случае нельзя разделить множество на два поменьше. То есть изначально нужно разбить на связанные группы, а вот разделить связанную - это уже совсем не простая задача. Если связь - однозначный путь без петель, то можно разбить по разным границам ключа и решить 4 половинные задачи.
да, я ужетоже пришел к тому. что при разбитии на 2 группы надо решать 4 половинных задачи - а это приводит к еще большим потерям времени и выигрыш от метода совсем исчезает
нафиг не надо ничего брутфорсить. В том методе, что использовал в конкурсе - я на самом деле тоже дроблю исходное множество на все меньшие и меньшие части в рекурсии. И это дает неплохие результаты - время решения больших множеств у меня получается в сотни, а то и в тыщи раз лучше брутфорса. Все что нужно моему методу - это место в памяти для рекурсии, места, которого в Уно слишком мало. Но взять, к примеру, Мегу - метод решает все представленные в ветке примеры в пределах 100мс - сравни с десятками и даже тыщами мс на брутфорсе
я не могу помочь, так как совсем не программист и не математик, ждёмс, что скажет Евгений Петрович, да ведь 100 мсек это уже серьёзные подвижки...и разность в копейках тут не важна, главное реальное время для реального ограниченного оперативной памятью ресурса...
PS небольшим флудом тему просто "подогревал"
PPS ту автоматику, что сделал приятелю для кораблика (возврат по GPS) оказалось использовать при определённом направлении ветра нельзя, так как все ресурсы тратились на борьбу с волной, возвращает в ручном режиме и галсами
и разность в копейках тут не важна, главное реальное время
Ахранеть! По такой логике если программа выдает неверный результат но делает это быстрее - она победила?
Ахранеть! По такой логике если программа выдает неверный результат но делает это быстрее - она победила?
о " победе" никто не говорит, конкурс уже закончился.
Вопрос интересен сам по себе. Не будьте так категоричны, метод разделения ( так как я его пока написал ) - не дает абсолютного оптимума, но он ЗАВЕДОМО дает очень близкий к минимуму результат. Я затрудняюсь сказать насколько - тут Дракуле карты в руки - но имхо ошибка не превысит цены пограничного ключа. То есть чем больше исходный набор, тем ближе результат к оптимуму.
И если вопрос стоит практический - получить ли абсолютный минимум брутфорсом за 15 минут или довольствоваться на 0.1% худшим выбором, полученным за 0.1 секунды - все не так однозначно:)
Тут необходимо определиться что чего мы хотим добиться - правильного результата или минимального времени выполнения. Это как 2 + 2 приблизительно 4.2 - какой смысл искать такое решение?
алгоритмом, который я использовал в конкурсе - этот набор решается за 718 мс, минимальный набор стоит 623, 71 руб. Методом деления этот же набор решается уже за 75мс - но решение немного хуже - 624.10.
То есть алгоритм дает не самый оптимум, но довольно близкий к нему ответ, в данном случае лишь менее чем на 0.1 % хуже, но в 10 раз быстрее. Не спешите сразу отметать этот результат на основании того, что это не абсолютный минимум... в данном случае это чем-то напоминает методы сжатия данных с потерями - те что используются в МП3 - расжатый звук получается немного не тот, что оригинальный, но зато его удается сжать значительно сильнее, чем LowLess кодеками
Ну, аналогия со сжатием с потерями в данном случае не работает: алгоритм либо решает задачу (всегда), либо не решает (во всех или в некоторых случаях не находит оптимума). Очевидно, что "метод деления" задачу НЕ решает.
НО:
в основном алгоритме важным фактором является начальное приближение. Если за 10% времени от работы основного алгоритма можно найти хорошее начальное приближение, то оно сократит время работы основного алгоритма, возможно, на величину более 10%.
Т.е. имеет смысл попытаться применить эти алгоритмы последовательно.
Все правильно: подсчет голосов, судебные иски, пересчет голосов... тут бы к февралю успеть...
Я всем знакомым связанным с программированием рассказал про конкурс, но слишком поздно, и что он закончиться 30 ноября. А они теперь спрашивают про результат. Памагите. )))
Женя! Продли до НГ. Люди тут переживают сильно!
... ну и не будь как некоторые... расскажи про функциональное программирование. Тут ведь копья апголову ломают.
расскажи про функциональное программирование. Тут ведь копья апголову ломают.
это где? не помню таких дискуссий здесь
расскажи про функциональное программирование. Тут ведь копья апголову ломают.
это где? не помню таких дискуссий здесь
просто так решать надо. это ж поиск оптимума. Перебор то все равно будет, рекурсией ли, функционалими ли. Вопрос в том, что лучше оптимизирует компилятор. Есть мнение, что второй вариант компилятору ближе.
Женя! Продли до НГ.
IMHO внесение изменений в правила конкурса дискредитируют конкурс сильнее, чем любое другое решение. Т.е. нельзя делать то, что нельзя делать ни при каких обстоятельствах, какими бы благими намерениями это не диктовалось.
На мой взгляд, лучше бы подумать о том, как бы сделать практику конкурсов на форуме если не регулярной, то хотя бы эпизодической.
Я всем знакомым связанным с программированием рассказал про конкурс, но слишком поздно, и что он закончиться 30 ноября. А они теперь спрашивают про результат. Памагите. )))
Андрей, ну вот правда, простите, ну припёрло, думал до пятницы расхлебаюсь ... в общем завтра или край - послезавтра приступлю к этой работе.
как бы сделать практику конкурсов на форуме если не регулярной, то хотя бы эпизодической.
Форум то тематический. Очень трудно придумать задачи, годные для выполнения на МК и не требующие дополнительных модулей, блоков и т.д. И в то же время и про программную составляющую не забыть, сделав ее достаточной сложности.
Андрей, ну вот правда, простите, ну припёрло, думал до пятницы расхлебаюсь ... в общем завтра или край - послезавтра приступлю к этой работе.
Да я без претензий, понимаю, просто надо же привлечь больше желающих участвовать в дальнейших конкурсах, этот же первый и первым навсегда останется.