Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonЧто тебя смущает? Следуй советам Фаулера. Делай функции как можно меньшего размера. Собственно так я и сделал. Заменил код на фарш , можешь профилировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 10:25 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Ну это не то что я хотел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 10:37 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Dima TЗаменил код на фарш , можешь профилировать. Изначальный вариант тут .Вопросы по программе: 1)Зачем сортировать массив? Массив от 1 до 20 – либо 0 (число ещё не выбрано), либо 1 (число выбрано). Проще сравнивать по номеру на «свободное место», и заносить новое число. 2)Тогда для 6,10,12,18,20 занести в массив 1. 3)Неудобно с переменными от 1 да 17? Так можно ввести переменные от 1 до 20 с пропусками по индексу. Это для начала… ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 10:46 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Далее.. 4)Есть такое: // Заполнение среднего круга по 4 из 15 Но в среднем круге 4 неизвестных и 3 известных. Причем 4-е неизвестное можно вычислить по 3-м другим неизвестным. Поэтому достаточно по 3 из 15. И вычисляется 4-е неизвестное (либо пропуск, если попадает на уже известное число). 5)// Заполнение внешнего круга по 5 из 11 Но теперь все неизвестные на внешнем круге вычислятся... Зачем выборка? 6) start(19, 57, 20); Это можно убрать, так как доказано, что х1 = sum / 3; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 12:42 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonА где вы увидели полный перебор? Честно говоря, я не изучал код Димы, но вижу дискуссию, где Дима больше о переборе (ну или о практическом решении конкретной задачи), а остальные о его сокращении. Дима первым дал результат, но видимо с минимальным сокращением количества перебираемых вариантов. Это работает, но только на конкретной задаче, а стоит задачу чуть-чуть расширить - упрёмся во время вычисления. Поэтому и остаётся актуальной мысль о максимальном сокращении числа перебираемых вариантов с соответствующим предложением - не останавливаться на димином варианте. Хотя с точки зрения практики - конкретная задача решена и можно расходиться по домам. Но сама задача же явно не практическая. А если рассматривать её как познавательно-теоретическую, то опять становится важным обобщение и нахождение способа сокращения количества вариантов перебора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 13:48 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
На моем слабом ноутбуке данное приложение работает несколько секунд - решение достаточное для того чтобы вообще не заниматься оптимизиацией. А профилирование которое я хотел посмотреть это просто шаг в сторону обобщения. Чтобы понять как просядет подобная задача когда узлов графа станет на порядки больше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 13:56 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonНу это не то что я хотел Без стека вызовов не видно профилирования. Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 14:35 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonНа моем слабом ноутбуке данное приложение работает несколько секунд - решение достаточное для того чтобы вообще не заниматься оптимизиацией. А профилирование которое я хотел посмотреть это просто шаг в сторону обобщения. Чтобы понять как просядет подобная задача когда узлов графа станет на порядки больше. Ты неправильно смотрел, тут нечего обобщать. Алгоритм изначально оптимизирован под данную задачу, лишние переборы отсекаются своевременными проверками суммы if(sum == ...) В общем случае тут 17! комбинаций. Предварительно математически 17! свели к 2*15! (возможны две пары {x1, x17}) Но 2*15! твой ноут будет перебирать часы, а то и сутки. Можешь запустить не оптимизированный ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 15:29 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonmaytonНу это не то что я хотел Без стека вызовов не видно профилирования. До строки кода нет детализации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 15:31 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Gennadiy UsovDima TЗаменил код на фарш , можешь профилировать. Изначальный вариант тут .Вопросы по программе: 1)Зачем сортировать массив? Массив от 1 до 20 – либо 0 (число ещё не выбрано), либо 1 (число выбрано). Проще сравнивать по номеру на «свободное место», и заносить новое число. 2)Тогда для 6,10,12,18,20 занести в массив 1. 3)Неудобно с переменными от 1 да 17? Так можно ввести переменные от 1 до 20 с пропусками по индексу. Это для начала… Сортировки там нет, в процессе решения массивы изначально сортированные получаются. Работа с сортированными массивами гораздо быстрее. Gennadiy UsovДалее.. 4)Есть такое: // Заполнение среднего круга по 4 из 15 Но в среднем круге 4 неизвестных и 3 известных. Причем 4-е неизвестное можно вычислить по 3-м другим неизвестным. Можно, только алгоритм слишком сложный получится. Gennadiy Usov5)// Заполнение внешнего круга по 5 из 11 Но теперь все неизвестные на внешнем круге вычислятся... Зачем выборка? Расчет на этом не заканчивается, далее надо все размещения перебрать, а это требует собрать данные в массив Gennadiy Usov6) start(19, 57, 20); Это можно убрать, так как доказано, что х1 = sum / 3; 19 = 57 / 3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 15:53 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Dima Tmaytonпропущено... Без стека вызовов не видно профилирования. До строки кода нет детализации? Хороший вопрос. Ищу это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 15:54 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Далее… 7)В программе сначала определяются числа для всех переменных, сначала 4 из 15, затем 5 из 11, далее оставшиеся 6 чисел, а потом уже эти числа проверяются на 12 уравнениях. То есть, в программе рассматриваются больше вариантов. Последняя переменная в уравнении может быть просто посчитана, а в результате эта переменная принимает много значений, которые по формулам были бы отвергнуты. Если применять формулы, то происходит постепенное определение значений переменных по наличию «свободных зон» в массиве чисел. И для этого достаточно меньше выборок чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 15:56 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonDima Tпропущено... До строки кода нет детализации? Хороший вопрос. Ищу это. Есть ссылка на GCOV (типа code coverage). https://stackoverflow.com/questions/3263573/is-there-a-profiler-for-c-gcc-to-profile-code-lines-separately Кстати мне понравилось основание по которому этот-же топик был закрыт. Вверху "Questions asking us to recommend or find a book, tool, software library, tutorial or other off-site resource are off-topic for Stack Overflow as they tend to attract opinionated answers and spam. Instead, describe the problem and what has been done so far to solve it." Это хорошая мысль и я постараюсь взять ее на вооружение для модерации С++. Надеюсь коллеги поддержат. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:02 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Dima TGennadiy Usov6) start(19, 57, 20); Это можно убрать, так как доказано, что х1 = sum / 3; 19 = 57 / 3Да, здесь я ошибся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:11 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Gennadiy UsovДалее… 7)В программе сначала определяются числа для всех переменных, сначала 4 из 15, затем 5 из 11, далее оставшиеся 6 чисел, а потом уже эти числа проверяются на 12 уравнениях. То есть, в программе рассматриваются больше вариантов. Последняя переменная в уравнении может быть просто посчитана, а в результате эта переменная принимает много значений, которые по формулам были бы отвергнуты. Если применять формулы, то происходит постепенное определение значений переменных по наличию «свободных зон» в массиве чисел. И для этого достаточно меньше выборок чисел. Это называется over-optimization, т.е. чрезмерная оптимизация. Задача решается за секунду, можно дальше тюнингом кода заниматься излишне его усложняя, но это даст выигрыш в доли секунды. Оно того не стоит в данном случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:11 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Gennadiy UsovDima Tпропущено... 19 = 57 / 3Да, здесь я ошибся. Геннадий. Вы можете запустить программу Дмитрия на этом сайте https://ideone.com/ Предварительно скопировав ее исходный код и указав язык С++ в меню выбора языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:16 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonDima Tпропущено... До строки кода нет детализации? Хороший вопрос. Ищу это. Можешь попробовать сделать функции-обертки Код: plaintext 1. 2. 3. в коде вызывать их Код: plaintext 1. 2. 3. А проще счетчиков навтыкать во все циклы и в конце их вывести. ИМХО это не классическая задача для профилирования, поэтому профилировать неудобно. PS Вернул обратно исходник. фарш тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:19 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Dima TGennadiy Usov4)Есть такое: // Заполнение среднего круга по 4 из 15 Но в среднем круге 4 неизвестных и 3 известных. Причем 4-е неизвестное можно вычислить по 3-м другим неизвестным. Можно, только алгоритм слишком сложный получится. Самый простой алгоритм - это простой перебор всех и вся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:20 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Dima TА проще счетчиков навтыкать во все циклы и в конце их вывести. ИМХО это не классическая задача для профилирования, поэтому профилировать неудобно. Я-бы хотел избегать "дурных" путей. Типа логгирования или счетчиков. Это не от хорошей жизни. Если Callgrind нам позволяет видеть не только учот количества вызовов прикладной функции но еще и строит граф вызовов (я видел картинку со стрелками) то это технологично. И этим надо воспользоваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:23 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
maytonГеннадий. Вы можете запустить программу Дмитрия на этом сайте https://ideone.com/ Предварительно скопировав ее исходный код и указав язык С++ в меню выбора языков.Пока не вижу в этом смысла. Меня, также как и Вас, интересуют отдельные моменты программирования, а именно, определение схем построения алгоритмов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:26 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
В актуальной ревизии https://github.com/Dmitriy-GH/remove20th/blob/master/remove20th.cpp Я-бы ввел некую сущность под названием Graph Код: plaintext 1. и передавал бы ее в функции-предикаты. Например. Вместо. Код: plaintext 1. Ввел-бы Код: plaintext 1. 2. 3. Предикаты соотв. проверяют подграфы на сбалансированность по весу. Но я не настаиваю. А то со стороны выглядит будто я заставляю тебя подгонять код под Callgrind. Я в принципе всегда стараюсь писать код максимально разбитым на элементарные фунции. Единственный кейс когда я этого не делал - в карточном трассировщике - просто для сохранения оригинального подобия к исходнику Гекберта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:30 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Gennadiy UsovmaytonГеннадий. Вы можете запустить программу Дмитрия на этом сайте https://ideone.com/ Предварительно скопировав ее исходный код и указав язык С++ в меню выбора языков.Пока не вижу в этом смысла. Меня, также как и Вас, интересуют отдельные моменты программирования, а именно, определение схем построения алгоритмов. Как будет угодно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:30 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Gennadiy UsovDima Tпропущено... Можно, только алгоритм слишком сложный получится. Самый простой алгоритм - это простой перебор всех и вся. Верно, но это долго, часы. Если в лоб 17!, то недели. Поэтому нужна оптимизация. Любая оптимизация это усложнение алгоритма, т.е. повышение вероятности допустить ошибку. Поэтому чем меньше оптимизации - тем лучше. Поэтому всегда ищется компромисс, в данном случае критерий компромисса это время. Одной секунды вполне достаточно чтобы прекратить оптимизацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:30 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Dima TGennadiy Usov7)В программе сначала определяются числа для всех переменных, сначала 4 из 15, затем 5 из 11, далее оставшиеся 6 чисел, а потом уже эти числа проверяются на 12 уравнениях. То есть, в программе рассматриваются больше вариантов. Последняя переменная в уравнении может быть просто посчитана, а в результате эта переменная принимает много значений, которые по формулам были бы отвергнуты. Если применять формулы, то происходит постепенное определение значений переменных по наличию «свободных зон» в массиве чисел. И для этого достаточно меньше выборок чисел. Это называется over-optimization, т.е. чрезмерная оптимизация. Задача решается за секунду, можно дальше тюнингом кода заниматься излишне его усложняя, но это даст выигрыш в доли секунды. Оно того не стоит в данном случае.А как же красота алгоритма? Ведь кто-то сказал, что эта задачка для олимпиады. Кроме того, будет опыт для более сложных графов (если конечно будут такие задачки) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:34 |
|
||
|
Как решить задачу по комбинаторике?
|
|||
|---|---|---|---|
|
#18+
Я слишком стар для олимпиады. Я просто не уложусь в назначенное время. Мой перфекционизм просто не даст возможности мне дойти до definition of done. Да и вообще олимпиады по информатике - это ужасные зубо-дробительный код который пишется 1 раз. И смотреть на него страшно. Это обычно одна простыня main() безо всякого рефакторинга. Всё захардкожено под ответ. Шаг-влево-вправо и этот код валится как карточный домик. Собственно суть олимпиады - показать прототип идеи и показать что он работает для данного случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2019, 16:39 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39765496&tid=1339994]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 147ms |

| 0 / 0 |
