powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как решить задачу по комбинаторике?
25 сообщений из 450, страница 7 из 18
Как решить задачу по комбинаторике?
    #39765445
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЧто тебя смущает? Следуй советам Фаулера.
Делай функции как можно меньшего размера.
Собственно так я и сделал.

Заменил код на фарш , можешь профилировать.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765446
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это не то что я хотел
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765452
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЗаменил код на фарш , можешь профилировать. Изначальный вариант тут .Вопросы по программе:

1)Зачем сортировать массив?
Массив от 1 до 20 – либо 0 (число ещё не выбрано), либо 1 (число выбрано).
Проще сравнивать по номеру на «свободное место», и заносить новое число.

2)Тогда для 6,10,12,18,20 занести в массив 1.

3)Неудобно с переменными от 1 да 17? Так можно ввести переменные от 1 до 20 с пропусками по индексу.

Это для начала…
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765459
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Далее..

4)Есть такое:
// Заполнение среднего круга по 4 из 15

Но в среднем круге 4 неизвестных и 3 известных. Причем 4-е неизвестное можно вычислить по 3-м другим неизвестным.

Поэтому достаточно по 3 из 15. И вычисляется 4-е неизвестное (либо пропуск, если попадает на уже известное число).

5)// Заполнение внешнего круга по 5 из 11
Но теперь все неизвестные на внешнем круге вычислятся...
Зачем выборка?

6) start(19, 57, 20);
Это можно убрать, так как доказано, что х1 = sum / 3;
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765470
alex55555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА где вы увидели полный перебор?
Честно говоря, я не изучал код Димы, но вижу дискуссию, где Дима больше о переборе (ну или о практическом решении конкретной задачи), а остальные о его сокращении. Дима первым дал результат, но видимо с минимальным сокращением количества перебираемых вариантов. Это работает, но только на конкретной задаче, а стоит задачу чуть-чуть расширить - упрёмся во время вычисления. Поэтому и остаётся актуальной мысль о максимальном сокращении числа перебираемых вариантов с соответствующим предложением - не останавливаться на димином варианте.

Хотя с точки зрения практики - конкретная задача решена и можно расходиться по домам. Но сама задача же явно не практическая. А если рассматривать её как познавательно-теоретическую, то опять становится важным обобщение и нахождение способа сокращения количества вариантов перебора.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765476
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На моем слабом ноутбуке данное приложение работает несколько секунд - решение достаточное
для того чтобы вообще не заниматься оптимизиацией. А профилирование которое я хотел
посмотреть это просто шаг в сторону обобщения. Чтобы понять как просядет подобная
задача когда узлов графа станет на порядки больше.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765482
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу это не то что я хотел
Без стека вызовов не видно профилирования.

Код: sql
1.
2.
3.
4.
5.
6.
7.
Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
100.10      4.10     4.10                             start(int, int, int)
  0.00      4.10     0.00     2103     0.00     0.00  copy_arr(int const*, unsigned long, int*, int, int, int, int, int, int)
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765493
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНа моем слабом ноутбуке данное приложение работает несколько секунд - решение достаточное
для того чтобы вообще не заниматься оптимизиацией. А профилирование которое я хотел
посмотреть это просто шаг в сторону обобщения. Чтобы понять как просядет подобная
задача когда узлов графа станет на порядки больше.
Ты неправильно смотрел, тут нечего обобщать. Алгоритм изначально оптимизирован под данную задачу, лишние переборы отсекаются своевременными проверками суммы if(sum == ...)

В общем случае тут 17! комбинаций. Предварительно математически 17! свели к 2*15! (возможны две пары {x1, x17}) Но 2*15! твой ноут будет перебирать часы, а то и сутки. Можешь запустить не оптимизированный )))
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765494
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonmaytonНу это не то что я хотел
Без стека вызовов не видно профилирования.
До строки кода нет детализации?
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765496
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765497
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tmaytonпропущено...

Без стека вызовов не видно профилирования.
До строки кода нет детализации?
Хороший вопрос. Ищу это.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765498
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Далее…

7)В программе сначала определяются числа для всех переменных, сначала 4 из 15, затем 5 из 11, далее оставшиеся 6 чисел, а потом уже эти числа проверяются на 12 уравнениях.

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

Если применять формулы, то происходит постепенное определение значений переменных по наличию «свободных зон» в массиве чисел. И для этого достаточно меньше выборок чисел.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765499
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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."
Это хорошая мысль и я постараюсь взять ее на вооружение для модерации С++. Надеюсь коллеги
поддержат.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765502
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TGennadiy Usov6) start(19, 57, 20);
Это можно убрать, так как доказано, что х1 = sum / 3;
19 = 57 / 3Да, здесь я ошибся.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765503
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovДалее…

7)В программе сначала определяются числа для всех переменных, сначала 4 из 15, затем 5 из 11, далее оставшиеся 6 чисел, а потом уже эти числа проверяются на 12 уравнениях.

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

Если применять формулы, то происходит постепенное определение значений переменных по наличию «свободных зон» в массиве чисел. И для этого достаточно меньше выборок чисел.
Это называется over-optimization, т.е. чрезмерная оптимизация. Задача решается за секунду, можно дальше тюнингом кода заниматься излишне его усложняя, но это даст выигрыш в доли секунды. Оно того не стоит в данном случае.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765504
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovDima Tпропущено...

19 = 57 / 3Да, здесь я ошибся.
Геннадий. Вы можете запустить программу Дмитрия на этом сайте https://ideone.com/

Предварительно скопировав ее исходный код и указав язык С++ в меню выбора языков.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765505
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima Tпропущено...

До строки кода нет детализации?
Хороший вопрос. Ищу это.
Можешь попробовать сделать функции-обертки
Код: plaintext
1.
2.
3.
bool np1(int* p1, int* p2) {
  return std::next_permutation(p1, p2);
}


в коде вызывать их
Код: plaintext
1.
2.
3.
...
 } while (np1(num_e, num_e + 5));
...


А проще счетчиков навтыкать во все циклы и в конце их вывести.


ИМХО это не классическая задача для профилирования, поэтому профилировать неудобно.

PS Вернул обратно исходник. фарш тут
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765506
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TGennadiy Usov4)Есть такое:
// Заполнение среднего круга по 4 из 15

Но в среднем круге 4 неизвестных и 3 известных. Причем 4-е неизвестное можно вычислить по 3-м другим неизвестным.
Можно, только алгоритм слишком сложный получится. Самый простой алгоритм - это простой перебор всех и вся.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765507
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TА проще счетчиков навтыкать во все циклы и в конце их вывести.

ИМХО это не классическая задача для профилирования, поэтому профилировать неудобно.
Я-бы хотел избегать "дурных" путей. Типа логгирования или счетчиков.
Это не от хорошей жизни. Если Callgrind нам позволяет видеть не только
учот количества вызовов прикладной функции но еще и строит граф
вызовов (я видел картинку со стрелками) то это технологично. И этим
надо воспользоваться.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765508
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonГеннадий. Вы можете запустить программу Дмитрия на этом сайте https://ideone.com/

Предварительно скопировав ее исходный код и указав язык С++ в меню выбора языков.Пока не вижу в этом смысла.

Меня, также как и Вас, интересуют отдельные моменты программирования, а именно, определение схем построения алгоритмов.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765509
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В актуальной ревизии

https://github.com/Dmitriy-GH/remove20th/blob/master/remove20th.cpp

Я-бы ввел некую сущность под названием Graph
Код: plaintext
1.
struct Graph {...}


и передавал бы ее в функции-предикаты.
Например. Вместо.

Код: plaintext
1.
if (sum == 12 + *x2 + *x1 + *x5 + *x15 // Горизонтальный


Ввел-бы
Код: plaintext
1.
2.
3.
if (isHorizontalGraphBalanced(graph)) {
...
}


Предикаты соотв. проверяют подграфы на сбалансированность по весу.

Но я не настаиваю. А то со стороны выглядит будто я заставляю тебя подгонять код под Callgrind.

Я в принципе всегда стараюсь писать код максимально разбитым на элементарные фунции.
Единственный кейс когда я этого не делал - в карточном трассировщике - просто для сохранения
оригинального подобия к исходнику Гекберта.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765510
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovmaytonГеннадий. Вы можете запустить программу Дмитрия на этом сайте https://ideone.com/

Предварительно скопировав ее исходный код и указав язык С++ в меню выбора языков.Пока не вижу в этом смысла.

Меня, также как и Вас, интересуют отдельные моменты программирования, а именно, определение схем построения алгоритмов.
Как будет угодно.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765511
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gennadiy UsovDima Tпропущено...

Можно, только алгоритм слишком сложный получится. Самый простой алгоритм - это простой перебор всех и вся.
Верно, но это долго, часы. Если в лоб 17!, то недели. Поэтому нужна оптимизация.
Любая оптимизация это усложнение алгоритма, т.е. повышение вероятности допустить ошибку. Поэтому чем меньше оптимизации - тем лучше.
Поэтому всегда ищется компромисс, в данном случае критерий компромисса это время. Одной секунды вполне достаточно чтобы прекратить оптимизацию.
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765512
Gennadiy Usov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TGennadiy Usov7)В программе сначала определяются числа для всех переменных, сначала 4 из 15, затем 5 из 11, далее оставшиеся 6 чисел, а потом уже эти числа проверяются на 12 уравнениях.

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

Если применять формулы, то происходит постепенное определение значений переменных по наличию «свободных зон» в массиве чисел. И для этого достаточно меньше выборок чисел.
Это называется over-optimization, т.е. чрезмерная оптимизация. Задача решается за секунду, можно дальше тюнингом кода заниматься излишне его усложняя, но это даст выигрыш в доли секунды. Оно того не стоит в данном случае.А как же красота алгоритма?

Ведь кто-то сказал, что эта задачка для олимпиады.

Кроме того, будет опыт для более сложных графов (если конечно будут такие задачки)
...
Рейтинг: 0 / 0
Как решить задачу по комбинаторике?
    #39765513
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я слишком стар для олимпиады. Я просто не уложусь в назначенное время.
Мой перфекционизм просто не даст возможности мне дойти до definition of done.

Да и вообще олимпиады по информатике - это ужасные зубо-дробительный
код который пишется 1 раз. И смотреть на него страшно. Это обычно одна
простыня main() безо всякого рефакторинга. Всё захардкожено под ответ. Шаг-влево-вправо
и этот код валится как карточный домик. Собственно суть олимпиады - показать
прототип идеи и показать что он работает для данного случая.
...
Рейтинг: 0 / 0
25 сообщений из 450, страница 7 из 18
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Как решить задачу по комбинаторике?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]