|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Привет кодеры и прочие сочувствующие! Сегодня суббота и субботняя задачка. В продолжение топика Милторга 22260285 Вкратце. Input: Код: sql 1. 2.
Output: Код: sql 1. 2. 3. 4.
Сочетания. Что еще тут добавить. Но нас будет интересовать стаблильный порядок. Тоесть если в исходном векторе были 1,2,3,4 - то на выходе последовательности тоже должны быть монотонные без убывания. Проверка количества штук по формуле: C(k,n) = n! / (n - k)! * k! Или по треугольничку Паскаля. Что нам интересно рассматривать: 1. Большие величиные N. Например от 100. 2. Алгоритмические оптимизации. 3. Перформанс. Не приветствуется 1. Нудотство и все вопросы типа зачем это. 2. Готовые приложения без исходников. 3. Обсуждение задачи Милторга. 4. Юзание баз данных. 5. Обсуждение частных и вырожденных случаев когда N=K или что-то равно 1. Языки разработки Любые С++/C#/Delphi/JS Библиотеки Если хотите - юзайте - но приложите их исходник чтобы мы могли понять алгоритм и идею. По сабжу у меня пока нет идей. Так что стартую вместе с вами. Go-Go кодить. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 12:07 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov http://www.guildalfa.ru/alsha/node/26 не обратил внимания, что нужны не все, буду кодить ) не обратил внимания, что все уже закодил )) ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 12:57 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov Aleksandr Sharahov http://www.guildalfa.ru/alsha/node/26 не обратил внимания, что нужны не все, буду кодить ) не обратил внимания, что все уже закодил )) Вот это наш вариант? Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 13:43 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, да, верно. а вызовы ProcessString(s) - это печать или обработка строки ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 13:57 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Об ограничениях. Правильно ли я понимаю что мы здесь оперируем не целыми числами а символами (Char, AnsiChar)? И следует ли из этого ограничение на 256 вариаций n элементов? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 14:42 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Об ограничениях. Правильно ли я понимаю что мы здесь оперируем не целыми числами а символами (Char, AnsiChar)? И следует ли из этого ограничение на 256 вариаций n элементов? да, верно. Тип ShortString это массив символов (байтов), нулевой элемент которого - текущая длина строки. При необходимости это можно переписать с использованием целочисленного массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 15:14 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Хороший исходник. Но в нем слишком много паскаля. Я вот думаю как его обобщить. И по возможности выкосить всякие линки на Код: pascal 1.
Насколько я понимаю... это сниппеты Forms-приложения, а мне чтоб собрать его под FreePascal надо будет сделать несколько хирургических замен. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 15:17 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, это внешние процедуры для отладки, все соберется без них, ну или можно заменить на WriteLn. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 15:26 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
ОК. Попробую собрать. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 15:29 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, переделал на целочисленный массив, преобразование в строку только для отладки Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 16:43 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Сегодня суббота и субботняя задачка. В продолжение топика Милторга 22260285 Топик тот начинается про сортировку, извиняйте не прочитал целиком и не готов 14 страниц прочитать, мне ковид на НГ подарили, не до того было. Если можно дай ссылку или вкратце перескажи как сортировка переродилась в перестановки? В С++ перестановки в массиве вроде есть штатно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 20:47 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T, насколько я понял, автор той ветки довольно причудливо решает свою задачу. Он генерирует перестановки двух множеств и затем сравнивает их, чтобы найти совпадающие элементы, при этом сортировка нужна ему для удобства сравнения нагенерированного, в общем, ужас-ужас. Ему там многие пытались втолковать, что его задача решается по-другому, через генерацию сочетаний, но он не верит. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 21:13 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Что нам интересно рассматривать: 1. Большие величиные N. Например от 100. А в чем сложность больших N? Разве что переполнение стека при рекурсивной реализации. Но там вообще глубина стека равна K (размер сочетаний), а не N. А К у нас вряд ли будет достаточно большим чтобы переполнить стек. Ну и чтобы два раза не вставать: Код: 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.
gcc v8.3.0 -O3 -DNDEBUG / Intel i7-8565U CPU @ 1.80GHz$ ./comb 3 4 k=3, n=4, print=1 1 2 3 1 2 4 1 3 4 2 3 4 total: 4 $ ./comb 3 5 k=3, n=5, print=1 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5 total: 10 $ time ./comb 3 100 - k=3, n=100, print=0 total: 161700 real 0m0.005s user 0m0.000s sys 0m0.005s $ time ./comb 4 100 - k=4, n=100, print=0 total: 3921225 real 0m0.027s user 0m0.027s sys 0m0.001s $ time ./comb 6 100 - k=6, n=100, print=0 total: 1192052400 real 0m1.721s user 0m1.721s sys 0m0.001s $ time ./comb 1000 1000 - k=1000, n=1000, print=0 total: 1 real 0m0.004s user 0m0.001s sys 0m0.004s ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 23:23 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, спасибо большое. Будем смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 23:34 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, я еще в процессе. Возможно кое-что спрошу по оформлению main процедуры в Паскалях. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 23:35 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T mayton Сегодня суббота и субботняя задачка. В продолжение топика Милторга 22260285 Топик тот начинается про сортировку, извиняйте не прочитал целиком и не готов 14 страниц прочитать, мне ковид на НГ подарили, не до того было. Если можно дай ссылку или вкратце перескажи как сортировка переродилась в перестановки? Это ужасно чувак. Выздоравливай! Я тоже болел. Очень неприятные последствия. Особенно с потерей вкуса. И какая-то хроническая усталость после этого надолго сохранилась. По поводу топиков Милторга. Не надо его смотреть. У него там - другая задача. У него даны наборы векторов и он их сортирует чтоб группировать. С моей точки зрения его задача решается на SQL но я так и не понял решил он ее для себе или нет и что вообще он хочет дальше? Излагает сумбурно. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.01.2021, 23:39 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T В С++ перестановки в массиве вроде есть штатно. В С++ есть стандартный генератор перестановок класса "размещений". Через std::next_perm. И для случая когда n==k. Количество считается просто как факториал от n. А нас интересуют сочетания (когда порядок не учитываем) и для общего случая когда k<=n ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 01:03 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Dima T В С++ перестановки в массиве вроде есть штатно. В С++ есть стандартный генератор перестановок класса "размещений". Через std::next_perm. И для случая когда n==k. Количество считается просто как факториал от n. А нас интересуют сочетания (когда порядок не учитываем) и для общего случая когда k<=n А нельзя с помощью std::next_permutation() как-то получить нужную нам последовательность? Можно брать первые (или последние) k, то что нам надо мы получим, но с повторами. Надо посмотреть что получается, может нужная нам последовательность генерится в начале той последовательности. Надо потестить, я пока не за компом, вечером попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 10:12 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Напутал, std::perm это размещения, а надо сочетания. Много лишних будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 16:09 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Написал получение следующей комбинации в массив Код: 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.
Результаты схожие с Анатолием Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 19:07 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T, Надо выкинуть из ф-и условия "Инициализация" и "за границей диапазона". Для алгоритма они не нужны, но путаются под ногами у предсказателя переходов. Я когда у себя закоментарил условие печати, то на 7% быстрее стало. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 19:48 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, Надо какие-нибудь контрольные примеры, чтобы было на чём мериться. mayton По сабжу у меня пока нет идей. Решение почти в лоб. У нас есть отсортированный вектор n, из него нужно выбрать m чисел, есть k = n - m подставляемых чисел. Нужен итератор, который будет перебирать занимаемые позиции для подставляемых, затем один раз проходить уже отсортированный веткор m, исключая позиции в итераторе, после чего идти по подставляемым числам k в итераторе по возрастанию и добавлять подставленное. Завтра попробую найти минутку переписать итератор из треда Милторга, чтобы было понятнее. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 19:58 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Dima T, Надо выкинуть из ф-и условия "Инициализация" и "за границей диапазона". Для алгоритма они не нужны, но путаются под ногами у предсказателя переходов. Я когда у себя закоментарил условие печати, то на 7% быстрее стало. Инициализацию перенес в main(), согласен что в функции ей там не место, а "за границей диапазона" это контроль ошибок, его надо оставить. Самое забавное что время никак не поменялось. MSVC 2019, может в G++ по другому будет. Код: 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.
Если "за границей диапазона" закомментить, то время 1.67 сек или на 7% быстрее ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 20:10 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
crutchmaster Надо какие-нибудь контрольные примеры, чтобы было на чём мериться. Все есть в первом посте. Для C(3,4) mayton все комбинации привел. Там же общая формула сколько должно быть комбинаций: C(k,n) = n! / (n - k)! * k! Я на С(4,6) отлаживал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Проверка С(6, 100) - 1'192'052'400 комбинаций ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 20:17 |
|
|
start [/forum/topic.php?fid=16&msg=40038332&tid=1339689]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
others: | 253ms |
total: | 423ms |
0 / 0 |