|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T, по этой формуле C(k,n) = n! / (n - k)! * k! Я не считал. Тут надо просто факториал заменять на гладкую функцию но субъективно... если смотреть на треугольник Паскаля - то мемоизировать нужно самый центр и низ треугольника где значения большие. А на краях они достаточно малы и там нечего считать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 15:04 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Взять ту же задачу милторга, я так понимаю у него вектора были фиксированного размера, т.е. известного на момент компиляции. Я думаю что нам не стоит завязываться на те задачи. Там - фигня на постном масле а у нас обобщенный подход. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 15:25 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Dima T, по этой формуле C(k,n) = n! / (n - k)! * k! Я не считал. Тут надо просто факториал заменять на гладкую функцию но субъективно... если смотреть на треугольник Паскаля - то мемоизировать нужно самый центр и низ треугольника где значения большие. А на краях они достаточно малы и там нечего считать. (n - k)! * k! убывает по мере увеличения k, т.е. максимальное количество сочетаний будет в середине при k = n/2 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 15:43 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Это верно отчасти. Если зафиксировать N. Но у нас функция двух аргументов и для нее максимум и экстремумы зависят от n,k в совокупности. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 17:15 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Я вот что подумал: если мою функцию с фиксированным k чуть переделать чтобы она охватывала диапазон не 1...n, а m...n, то она вполне себе применима для генерации всех вариантов последних k разрядов. Т.е. первые разряды меняем универсальным способом, а для последних k вызываем функцию и внутри нее снимаем результаты. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 17:41 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Можешь на примере сочетаний показать? Непонятно.... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 17:47 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Например С(4,6) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Допустим есть функция с3(m,n), которая выдает все сочетания по 3 в диапазоне m...n, далее первый разряд перебираем снаружи и вызываем c3() для генерации последних 3х разрядов Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 18:00 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Ты хочешь мемоизировать последние 4 разряда? Ну ОК. Попробуй. Главное чтоб результат совпал с полным вариантом. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 18:08 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, сорри что встреваю, но тебе может оказаться интересным: В Oracle, начиная с 10й версии есть готовая sql-функция под это - POWERMULTISET_BY_CARDINALITY: Код: plsql 1. 2.
упс... что-то поломалось, но на любом sqlfiddle это можно проверить... что касается разбивки на диапазоны, то весь процесс можно представить как манипуляцию k-м разрядом + сдвиг. т.е. - если к-1 разряд фиксирован, то для к-го - n-k+1 вариант заполнения. затем "затираем" значение к-1 разряда (сдвигаем набор на единицу вправо), получаем еще n-k комбинаций. ... сдвигая последовательно лесенкой разряды от к до n-k-1 получим все комбинации, но в другом порядке выдачи. Это как идея без кода, мимоходом... т.е. идея состоит в построении соответствия номера комбинации подходящему "сдвигу" и "номеру операции внутри него". Тогда, может быть, все разбивается на набор независимых циклов в пределах "сдвигов" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 18:58 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
booby, OK посмотрю. У меня растет объем технического долга по топику. Я еще Сашин исходник не смотрел и не скомпилировал целиком. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 19:00 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Ты хочешь мемоизировать последние 4 разряда? Ну ОК. Попробуй. Главное чтоб результат совпал с полным вариантом. "мемоизировать" тут не в тему, т.к. надо разные наборы, они не повторяются. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 20:27 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Оптимизировал немного рекурсивный и нерекурсивный алгоритмы. Для 6 из 100, рекурсивный теперь дает 1с, нерекурсивный 1.2с Исходники (цветом выделил изменения) Рекурсивный Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89.
Нерекурсивный Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 23:02 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Я обычно такой "for" разворачиваю в while. Смысл в том что val++ теперь стоит ниже тела цикла и причинно-следственная связь логичнее смотрится. Как в структурном программировании. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 00:14 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Попробовал на вектор переделать и с итераторами переписать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Работает правильно, но вместо того чтобы выйти вылетаем с исключением Expression: can't decrement vector iterator before begin Оно так и задумано что как только it ушел за начало, надо цикл завершать. Не могу придумать как от исключения избавиться. PS В релизе работает, там похоже нет этой проверки. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 09:29 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Для 6 из 100, рекурсивный теперь дает 1с, нерекурсивный 1.2с Запусти мой all_combinations_6(100) Код тут 22268813 Интересно сколько времени он у тебя считается. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 09:33 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton booby, OK посмотрю. У меня растет объем технического долга по топику. Я еще Сашин исходник не смотрел и не скомпилировал целиком. вот этот вариант побыстрее будет: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 12:11 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T, скользкий случай. Я-бы по возможности по максимуму избегал в итераторах использовать арифметику и сравнение на больше либо равно. Просто так. Личное предпочтение. Не всегда ведь он вектор. Может быть и список и дерево. Вот тут описаны категории итераторов https://www.cplusplus.com/reference/iterator/ Может там - больше информации по debug. Возможно в отладке включены дополнительные asserts которые и спасают код от всяких неосторожных действий в будущем. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 12:22 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Кодогенерация для С++ в рантайме? .... Хм... эту тему надо вообще толкнуть отдельным топиком. Насколько я помню тут ключевой вопрос - безопасность. В рантайме ты должен сгенерить неподписанную никем *.dll -ку и динамически вызвать ее из главной процедуры. Антивирус сойдет с ума. Это то что легко делается в языках типа JScript/Python/Node/Lisp через eval и то что почти неизведанно как Антарктида в С++. Куча софта делает генерацию кода без проблем. Везде где есть JIT трансляция. Отдельная DLL нее нужна. Просто выделяешь память, копируешь туда код и помечаешь ее исполняемой. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 13:11 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Нашел, есть reverse_iterator для перебора в обратном порядке http://www.cplusplus.com/reference/vector/vector/rbegin/ Еле нагуглил как привести reverse_iterator к iterator Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Скорость такая же как с массивом 22268624 Исходник целиком, для компиляции Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 13:12 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky mayton Кодогенерация для С++ в рантайме? .... Хм... эту тему надо вообще толкнуть отдельным топиком. Насколько я помню тут ключевой вопрос - безопасность. В рантайме ты должен сгенерить неподписанную никем *.dll -ку и динамически вызвать ее из главной процедуры. Антивирус сойдет с ума. Это то что легко делается в языках типа JScript/Python/Node/Lisp через eval и то что почти неизведанно как Антарктида в С++. Куча софта делает генерацию кода без проблем. Везде где есть JIT трансляция. Отдельная DLL нее нужна. Просто выделяешь память, копируешь туда код и помечаешь ее исполняемой. Это офигенская тема. Вы пока тут - не развивайте. Я в пятницу подниму топик. Но нас будет интересовать JIT для классических компилируемых языков (С++). Платформеры и так этот жыд имеют. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 14:08 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Оптимизировал немного рекурсивный и нерекурсивный алгоритмы. Для 6 из 100, рекурсивный теперь дает 1с, нерекурсивный 1.2с Хотел потестить, но не MSVC2019 не хочет компилировать рекурсивный Код: plaintext
Код: plaintext 1.
если тут написать Код: plaintext 1.
то компилируется, но скорость работы чуть медленнее 1.7 сек. Если закамментить все внутри print_current() то скорость 1.2 сек., против 1.6 сек прошлого варианта. Но есть подозрение что полный каммент разрешает оптимизатору ломать этот цикл Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 14:29 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
ИМХО в твоем случае, и в моем с фиксированным K 22268813 надо в параметрах передавать указатель на функцию и ее вызывать. А функций несколько, надо с выводом значений - одна, надо счетчик - другая. Тогда оптимизатор не так сильно будет код ломать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 14:43 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Давайте уже подумаем над API использования этого софта. Как по мне - процесс consumer не сможет заглотить ни STDOT ни vector<vector<int>>. Неудобно это в одном случае. И не хватит памяти в другом. Надо думать над умной коммуникацией. Подумайте вот если-бы вы использовали бинарник этого генератора то каким образом-бы вы забирали результаты этой генерации. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 15:12 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Давайте уже подумаем над API использования этого софта. Как по мне - процесс consumer не сможет заглотить ни STDOT ни vector<vector<int>>. Неудобно это в одном случае. И не хватит памяти в другом. Надо думать над умной коммуникацией. Подумайте вот если-бы вы использовали бинарник этого генератора то каким образом-бы вы забирали результаты этой генерации. Обычно результаты генерации не являются финальными результатами а как-то там еще обрабатываются. Их не надо забирать, а надо обрабатывать по мере генерации. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 15:51 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov mayton Давайте уже подумаем над API использования этого софта. Как по мне - процесс consumer не сможет заглотить ни STDOT ни vector<vector<int>>. Неудобно это в одном случае. И не хватит памяти в другом. Надо думать над умной коммуникацией. Подумайте вот если-бы вы использовали бинарник этого генератора то каким образом-бы вы забирали результаты этой генерации. Обычно результаты генерации не являются финальными результатами а как-то там еще обрабатываются. Их не надо забирать, а надо обрабатывать по мере генерации. Я думаю о дизайне самой упаковки. Тоесть если вы создали некий модуль (библиотеку) которая генерит сочетания и выкладываете ее на github или еще куда-то не в виде исходного кода а как бинарник (.dll/.o) + .h (как это принято в С++) то нужно подумать о том как ее будут использовать. Один вариант - итератор как сделал Анатолий, размотав стек. Я думаю над другими вариантами чтобы сохранив "рекурсивную природу" алгоритма сделать тем не менее возможность удобно его использовать не ломая а используя то что уже разработано. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 16:41 |
|
|
start [/forum/topic.php?fid=16&msg=40038758&tid=1339689]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 250ms |
total: | 435ms |
0 / 0 |