|
Генерация сочетаний из 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 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T а "за границей диапазона" это контроль ошибок, его надо оставить. Это должен быть assert() включаемый только в дебаг сборках. Потому что в это отладочный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 21:39 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Dima T а "за границей диапазона" это контроль ошибок, его надо оставить. Это должен быть assert() включаемый только в дебаг сборках. Потому что в это отладочный код. Может и так, но эти 7% мало что меняют. Тут важно оценить сложность алгоритма, ясно что не O(1). Например если потребуется 5 лет, то будет пофиг 5 лет или 5 лет и 4 месяца. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 22:10 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T, под gcc выдает варнинг Код: sql 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.01.2021, 23:48 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky mayton Что нам интересно рассматривать: 1. Большие величиные N. Например от 100. А в чем сложность больших N? Разве что переполнение стека при рекурсивной реализации. Но там вообще глубина стека равна K (размер сочетаний), а не N. А К у нас вряд ли будет достаточно большим чтобы переполнить стек. В данном конкретном алгоритме переполнение стека нам не грозит. Слишком малые у нас запросы. А на больших - мы дождемся финала когда остынет солнце. Что интересовало? Некие общие подходы к комбинаторным алгоритмам. Генераторы последовательностей. Ленивые списки. Хвостовая рекурсия в продолжение моего одноименного топика. (Всегда-ли возможно?) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 00:03 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Пока быстрее работает рекурсивный алгоритм Анатолия. На генерации 6 из 45 занимает меньше 1 секунды против 9 секунд итеративного метода Димы. В коде Анатолия я только счетчик перенес из принта в основную функцию потому-что при отключени вывода на печать - выключается и подсчет найденных сочетаний. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 00:56 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Александр. Я про твой код не забыл. Просто пока не хватает терпенья оформить все формальности для того чтоб собрать туловище алгоритма. make.sh Код: sql 1. 2. 3. 4. 5.
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
perm-k-n.lpr - это последний сорс который ты публиковал. Уж извини если я иногда - нетерпеливый. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 01:04 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Тюнинганул алгоритм, заменил проверку на assert(), но стало медленнее (( 1.96 сек вместо 1.67 тут 22268468 исходник Код: 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.
mayton Пока быстрее работает рекурсивный алгоритм Анатолия. На генерации 6 из 45 занимает меньше 1 секунды против 9 секунд итеративного метода Димы. Затестил алгоритм Анатолия без вывода - 1.63 сек. Странно конечно что рекурсия быстрее, но не в разы. Проверь, может с разными ключами компилировал. PS Оказалось эта проверка отъедает 0.12 сек, можно закаментить, без нее 1.84 сек. Код: plaintext 1.
PPS Турбобуст хитрая штука, затестил вчерашний код, считает 2.1 сек, тестю в виртуалке, а хост сейчас нагружен, задача однопоточная, долгоиграющая, но похоже не дает на других ядрах частоту повысить. Перемеряю вечером, когда хост в спокойном состоянии. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 09:09 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Для ускорения можно попробовать использовать одну общую структуру для всех данных и оптимизировать изменение последнего элемента массива. Но смысла в этом не особенно много, т.к. обычно содержательная обработка сочетания заметно медленнее генерации. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 10:49 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
В идеале у нас получается что вся полезная информация по рекурсии лежит в стеке. Это два целых числа. И сам current вектор - глобальный и модифицируется на каждом рекуррентном вызове. Я думаю что мы достигли хорошей величины перформанса и дальше - узким местом будет просто передача найденных сочетаний в consumer или в то приложение которое будет его юзать. Здесь я хотел-бы это сделать на streams/actors/ или каких-то асинхронных технологиях через кольцевой буфер. Тоесть чтобы генерация сочетаний шла отдельным потоком а уже их извлечение отдельно. Работа с STDOUT - это конечно ужас-ужас но пускай пока она будет как основной вариант межпроцессного протокола. И в данной задаче (которая удачно ложится на списки ФП) я еще для себя хотел реализовать ее на Haskell/Lisp если будет время. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 12:00 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton В идеале у нас получается что вся полезная информация по рекурсии лежит в стеке. Это два целых числа. На самом деле там одно число только нужно. Второе всегда равно уровню вложенности, который легко вычисляется. Я допускаю что и второе можно вычислить, и тогда можно вообще без стека обойтись. Но мне некогда думать )) Вот еще вчера наклепал нерекурсивный алгоритм с явным стеком. Скорость чуть хуже рекурсивного со стеком на основе std::deque и чуть лучше с boost::static_vector (но жесткий лимит на глубину стека). Код: sql 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. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 12:26 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, нет-нет. Не надо разматывать рекурсию в автомат со стеком. Для асинхронного актора о котором я думаю это вообще не нужно. А для внешнего вида исходника - это только ухудшает чтение. Пускай рекурсивный вариант будет основным. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 12:35 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, Нерекурсивный легче оптимизировать. Сами же писали что скорость одна из задач. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 12:42 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Вот кстати, было пару минут, вообще убрал стек из нерекурсивного алгоритма. На скорость не повлияло :) Код: sql 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:16 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Давай затестим на больших числах. Кроме того нерекурсивный - гибче. Если какое-то условие надо вставить то рекурсивный остается красив и компактен а итерационный превращается в нагромождение необъяснимой логики. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:41 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Затестил алгоритм Анатолия без вывода - 1.63 сек. Странно конечно что рекурсия быстрее, но не в разы. Проверь, может с разными ключами компилировал. PS Оказалось эта проверка отъедает 0.12 сек, можно закаментить, без нее 1.84 сек. ОК спасибо. Проверю вечером на своём AMD. Щас сижу на ограниченном десктопе где неудобно собирать и бенчмаркать. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:43 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Пока быстрее работает рекурсивный алгоритм Анатолия. На генерации 6 из 45 занимает меньше 1 секунды против 9 секунд итеративного метода Димы. Я потестил 6 из 45 считает 18 мс. Что-то у тебя не то с замером или компилятором. Вот самый быстрый код. С(6,100) за 1.2 сек. Только для каждого k надо будет отдельно код написать Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
Можно использовать для получения идеального времени расчета. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:45 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Код: plaintext 1.
Не может этого быть. Маска + сравнение... Скорее всего тормозит printf даже при печати в /dev/null ведь ему надо сделать десятичное форматирование cnt и еще ряд каких-то блокировок и фиксаций в разделяемый объект стандартного вывода. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:49 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Только для каждого k надо будет отдельно код написать Ахахах! ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:50 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T mayton Пока быстрее работает рекурсивный алгоритм Анатолия. На генерации 6 из 45 занимает меньше 1 секунды против 9 секунд итеративного метода Димы. Я потестил 6 из 45 считает 18 мс. Что-то у тебя не то с замером или компилятором. Я все собираю на GCC без параметров. Вечером - предоставлю больше сведений. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:52 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Dima T Код: plaintext 1.
Не может этого быть. Маска + сравнение... Скорее всего тормозит printf даже при печати в /dev/null ведь ему надо сделать десятичное форматирование cnt и еще ряд каких-то блокировок и фиксаций в разделяемый объект стандартного вывода. Для C(6, 100) эта строчка выполняется 1.2 миллиарда раз. Т.е. (cnt & 0x3FFFFFF) == 0 выполняется со скоростью примерно 10 миллиардов раз в секунду. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:53 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Dima T Только для каждого k надо будет отдельно код написать Ахахах! Шаблонам же можно кучу однотипных функций компилировать, а мы чем хуже. Можно генератор кода написать Данный код подходит как минимум для определения максимально возможной скорости, быстрее точно ни у кого не будет. mayton Я все собираю на GCC без параметров. Вечером - предоставлю больше сведений. добавь ключи -O3 -DNDEBUG ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 13:58 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T mayton пропущено... Не может этого быть. Маска + сравнение... Скорее всего тормозит printf даже при печати в /dev/null ведь ему надо сделать десятичное форматирование cnt и еще ряд каких-то блокировок и фиксаций в разделяемый объект стандартного вывода. Для C(6, 100) эта строчка выполняется 1.2 миллиарда раз. Т.е. (cnt & 0x3FFFFFF) == 0 выполняется со скоростью примерно 10 миллиардов раз в секунду. Ну смотри... этот код на самом деле не должен срабатывать точно-точно каждые 2 мильярда итераций. Это-ж для статистики? Тоесть я могу сюда поставить любую константу кратную числу вложенных итераций от верхних циклов. Тогда эту проверку можно вообще убрать а printf просто вынести на 4-5 уровней циклов выше. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 14:05 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T mayton пропущено... Ахахах! Шаблонам же можно кучу однотипных функций компилировать, а мы чем хуже. Можно генератор кода написать Кодогенерация для С++ в рантайме? .... Хм... эту тему надо вообще толкнуть отдельным топиком. Насколько я помню тут ключевой вопрос - безопасность. В рантайме ты должен сгенерить неподписанную никем *.dll -ку и динамически вызвать ее из главной процедуры. Антивирус сойдет с ума. Это то что легко делается в языках типа JScript/Python/Node/Lisp через eval и то что почти неизведанно как Антарктида в С++. Откомментируйте кто в теме. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 14:09 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Dima T пропущено... Для C(6, 100) эта строчка выполняется 1.2 миллиарда раз. Т.е. (cnt & 0x3FFFFFF) == 0 выполняется со скоростью примерно 10 миллиардов раз в секунду. Ну смотри... этот код на самом деле не должен срабатывать точно-точно каждые 2 мильярда итераций. Это-ж для статистики? Тоесть я могу сюда поставить любую константу кратную числу вложенных итераций от верхних циклов. Тогда эту проверку можно вообще убрать а printf просто вынести на 4-5 уровней циклов выше. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Не, так нельзя. Если ты закаментишь красное, то оптимизатор выкинет все циклы после твоего printf(). Я сначала без этой строчки написал, время работы 50 мс выдало. Пусть будет, 1% времени на него расходуется. Как выше писали: все-равно в реале вместо cnt++ внутри будет какое-то сохранение комбинации, а это на порядки дольше времени займет. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 14:15 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Насколько я помню тут ключевой вопрос - безопасность. В рантайме ты должен сгенерить неподписанную никем *.dll -ку и динамически вызвать ее из главной процедуры. Антивирус сойдет с ума. Думаю именно тут будет затык. Может еще админ права поотбирать. Вообще я немного в другую сторону думал. Если известны часто используемые значения N, то для них прописать, а остальным универсальную запускать. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Взять ту же задачу милторга, я так понимаю у него вектора были фиксированного размера, т.е. известного на момент компиляции. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.01.2021, 14:33 |
|
Генерация сочетаний из 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 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, на практике наиболее удобным вариантом оказывается использование исходников, в которых предусмотрены обратные вызовы функций обработки. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 16:59 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
На сях с бустом есть такое https://www.boost.org/doc/libs/1_70_0/libs/coroutine/doc/html/coroutine/intro.html А есть в Delphi? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 17:15 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, с бустом )) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 17:27 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Интересно, что если генерировать сочетания в нисходящем порядке, то минимальное значение элемента в каждой позиции совпадет с номером позиции. По идее, это упрощает алгоритм и позволяет обойтись минимумом вычислений. Например, сочетания по 4 из 6 для множества {0,1,2,3,4,5} выводятся в таком порядке: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Алгоритм получился довольно быстрым Код: 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.01.2021, 17:42 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, так а в исходном варианте разве не тоже самое? Код: sql 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 18:16 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov mayton, с бустом )) Ну я не против. Есть ли в Делфях свой буст? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 18:17 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Aleksandr Sharahov, так а в исходном варианте разве не тоже самое? Код: sql 1. 2. 3. 4. 5. 6.
Не совсем то же самое. Когда мы наращиваем значения элементов, то закончим при достижении значения, которое отличается на дельту (n-k) от индекса элемента. т е минимальное не является финальным ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 18:26 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Aleksandr Sharahov mayton, с бустом )) Ну я не против. Есть ли в Делфях свой буст? Есть несколько библиотек для параллельной работы, я не знаю, насколько они сопоставимы с бустом. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 18:28 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov mayton пропущено... Ну я не против. Есть ли в Делфях свой буст? Есть несколько библиотек для параллельной работы, я не знаю, насколько они сопоставимы с бустом. Чорт с ним. Корутитны? Континуэйшены есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 18:29 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Aleksandr Sharahov пропущено... Есть несколько библиотек для параллельной работы, я не знаю, насколько они сопоставимы с бустом. Чорт с ним. Корутитны? Континуэйшены есть? 1. Если потребуется, всегда можно эмулировать. 2. Но если кто-то скажет, что у него интерфейс заточен таким образом, то нафига оно надо, если можно без него. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 18:46 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov mayton пропущено... Чорт с ним. Корутитны? Континуэйшены есть? 1. Если потребуется, всегда можно эмулировать. 2. Но если кто-то скажет, что у него интерфейс заточен таким образом, то нафига оно надо, если можно без него. Твоя реализация - в конечном варианте не-рекурсивная. Поэтому тебе это не надо. Можно сказать что ты избежал этой участи Но в топике я также поставил сверх-задачу - обобщить подходы к рекурренным алгоритмам. В частности к итераторам. Я не буду настаивать. Ведь рекурсия - это сугубо мой интерес. В частности технологические штуки такие как
рекурсии в дек или в очередь может быть нетривиальной задачей или просто очень хлопотной в количестве кода. Поэтому я хочу оставить рекурсивное решение Анатолия. Оно мне нравится. Но сделать его более технологичным. Тоесть пригодным к интеграции и использованию извне. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 19:01 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Твоя реализация - в конечном варианте не-рекурсивная. Поэтому тебе это не надо. Можно сказать что ты избежал этой участи Их есть у меня ) Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 19:10 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Еле нагуглил как привести reverse_iterator к iterator Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
ОК. Ну я скоро запутаюсь в исходниках. Ты еще не создавал репку? У каждого автора уже более чем 1 вариант кода. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 20:09 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Давайте уже подумаем над API использования этого софта. Как по мне - процесс consumer не сможет заглотить ни STDOT ни vector<vector<int>>. Неудобно это в одном случае. И не хватит памяти в другом. Надо думать над умной коммуникацией. Подумайте вот если-бы вы использовали бинарник этого генератора то каким образом-бы вы забирали результаты этой генерации. ИМХО Правильнее получать следующее значение, т.е. есть массив с текущим значением, вызываешь функцию, она внутри превращает массив в следующее, обрабатываешь, получаешь следующее и т.д. Реализации когда генератор внутри себя выдает значения куда-то там - нечитабельны, т.к. код получается корявый. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 20:18 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton ОК. Ну я скоро запутаюсь в исходниках. Ты еще не создавал репку? У каждого автора уже более чем 1 вариант кода. Нормальный этот 22268624 остальные можешь не смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 20:20 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Давайте зайдем в "области тьмы". В временую сложность. Что такое сочетания из 2 по 10 тыщ? Фигня. Щас дам калькулятор. Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Это 49 миллионов унылых пар чисел наподобие Код: sql 1. 2. 3. 4.
и так далее. Как в морском бое. Когда мы заполняем пол-поля треугольником по диагонали. В топиках простых чисел мы и поболее считывали. Вот мой concern в чем заключается. Внешний вид алгоритма имеющего квадратичные накладные расходы. Код: sql 1. 2. 3. 4. 5. 6.
Надо поисследовать как ведет себя итеративный алгоритм на малых значениях k при очень больших значениях n. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 21:11 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Давайте зайдем в "области тьмы". В временую сложность. Что такое сочетания из 2 по 10 тыщ? Фигня. Щас дам калькулятор. Это в уме считается, без калькулятора: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 21:27 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Да. Этот калькулятор - уродский. Я писал его на коленке. Код: sql 1.
Слишком большой числитель и знаменатель при мизерном частном. Соотв надо сократить еще до вычислений факториалы. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 21:30 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
А лямбда похожа на ж0пу Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 21:33 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Правильнее этот 22268468 , он быстр и уродлив одновременно, он быстрее, но непонятней. Запихать его в либу можно, попытаться объяснить кому-то как он работает - сложно. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 21:42 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Правильнее этот 22268468 , он быстр и уродлив одновременно, он быстрее, но непонятней. Запихать его в либу можно, попытаться объяснить кому-то как он работает - сложно. Это-же и есть самый важный скилл. Объяснить ребёнку как оно работает Пускай внутри коробочки будет Ад и Израиль. А снаружи - розовые единороги. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 21:46 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Это-же и есть самый важный скилл. Объяснить ребёнку как оно работает ага, поэтому сначала я родил первый вариант думая от лица процессора, потом переделал в пользу читаемости, потом понял почему второй вариант тормознее, там лишних действий больше, но все-равно я за него. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.01.2021, 22:03 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T 0.6c ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 00:13 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
думаю, аналог 22269637 на c не сильно отстанет ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 01:11 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T добавь ключи -O3 -DNDEBUG Вот среди ночи я добрался до своего десктопа. Щас посмотрим. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 01:57 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Добавил что-то вроде silent-mode (просто любой третий аргумент командной строки). Изменил формулу расчета времени. И разделили поток комбинаций и статистику по раздельным файловым дескрипторам. Код: 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.
Два из сто тыщ - за 22 секунды. Код: sql 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 02:42 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
В исходнике Анатолия такой трюк с silent не прокатывает. Из за рекурсии. В идеале нужно просто написать два класса с виртуальным методом generate(...) и две реализации с принтом и без. Вобщем я просто оставлю закоментированным печать векторов сочетаний. Код: sql 1. 2. 3. 4.
Пока рекурсия побеждает на длинных N. Ключи оптимизации и версия компиллятора одинаковые. Код: sql 1. 2.
Скрипт для сборки тоже одинаковый. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 03:02 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Вот это число надо проверить. Может баг? mayton Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 03:05 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Вот это число надо проверить. Может баг? mayton Код: sql 1.
Ты за разрядность int вылез )) Поправь тип счетчика Код: plaintext 1. 2. 3.
mayton Код: plaintext 1. 2. 3. 4. 5.
У тебя это скомпилировалось? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 07:30 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Вот так корректно для GCC. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 09:28 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Код: plaintext 1.
clock() считает с момента запуска приложения, т.е. у тебя start == 0, можно его выкинуть. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 09:32 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Пускай будет. На результат почти не влияет. А если будет пользовательский ввод - то корректнее считать от начала алгоритма а не процедуры main. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 10:05 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Да. Это динамические (или как их там правильно) массивы на стэке, в стандарте это есть, а MS еще не реализовал, поэтому у меня не компилируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 10:10 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Прикинь я и не заметил. Еще походу удивился. Где там new ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 10:38 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Ну я скоро запутаюсь в исходниках. Все мои предыдущие исходники отправляются в корзину. Вот этот генерирует 6 из 100 на i7-7700 за 453 msec: Код: 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.
как вызывать: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 11:46 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov Все мои предыдущие исходники отправляются в корзину. это прекрасно. Вот что брейншторм делает! Сегодня вечером попробую собрать на fpc. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.01.2021, 12:19 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Я вот думаю можно ли как-то произвольное преобразование сделать? Т.е. знаешь номер по-порядку и преобразуешь его в соответствующее ему сочетание и наоборот. Типа как перевод из одной системы счисления в другую. По идее это тоже разновидность системы счисления, но разные разряды имеют разный вес. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2021, 09:32 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Я вот думаю можно ли как-то произвольное преобразование сделать? Т.е. знаешь номер по-порядку и преобразуешь его в соответствующее ему сочетание и наоборот. Типа как перевод из одной системы счисления в другую. По идее это тоже разновидность системы счисления, но разные разряды имеют разный вес. 1. В английской вики приводятся варианты нумерации, фактически имитирующие генерацию. 2. Можно старое сочетание использовать для генерации нового. 3. Можно рассмотреть комбинацию 1 и 2 - несплошную нумерацию, когда у номера комбинации единичные биты соответствуют выбранным элементам множества. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2021, 10:06 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Я вот думаю можно ли как-то произвольное преобразование сделать? Т.е. знаешь номер по-порядку и преобразуешь его в соответствующее ему сочетание и наоборот. Типа как перевод из одной системы счисления в другую. По идее это тоже разновидность системы счисления, но разные разряды имеют разный вес. Можно для все последовательности посчитать каждый 1000-й элемент. И назвать его опорным. И положить в табличку. Порядковый номер => опорный элемент. И дальше если нужно например 100000-й сочетание - то ищем бинарным поиском по табличке порядковый номер. И потом опорный и дальше перемоткой вперед добиваем столько позиций сколько надо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2021, 10:29 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
UP. Привет всем. Прошу прощения за отсутсвие. Я помню что обещал. Просто неделька была бешеная. ПОЦ-ы. Стартапы. Тоесть POC-s. Я только-только отбился от всех. Надеюсь сегодня будет минутка сесть и собрать все сорцы в кучу и сделать какое-то сравнение. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 15:47 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov 1. В английской вики приводятся варианты нумерации, фактически имитирующие генерацию. Почитал и ничего не понял если честно, еще раз почитаю Aleksandr Sharahov 2. Можно старое сочетание использовать для генерации нового. У меня в коде так и происходит. next_combinations() получает на вход массив с текущей комбинацией и преобразует ее в следующую. mayton Можно для все последовательности посчитать каждый 1000-й элемент. И назвать его опорным. И положить в табличку. Порядковый номер => опорный элемент. И дальше если нужно например 100000-й сочетание - то ищем бинарным поиском по табличке порядковый номер. И потом опорный и дальше перемоткой вперед добиваем столько позиций сколько надо. Можно, эдакие радужные таблицы получатся, но их считать надо или хранить. Я пытался в уме формулу вывести для небольшой последовательности типа С(2,5) для 2-х вроде должно получиться, а если С(3,5) то тут уже сложнее, надо поизучать в экселе. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 15:59 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T, кстати идеи которые у нас звучали в топике простых чисел применимы и для последовательности сочетаний. Например такое Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
хорошо сжимается дифференциальным кодированием или деревом префиксов. Как бегать поиском по сжатой структуре - отдельная задача. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 16:18 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
По поводу Delphi, FreePascal. Я синтаксис программы не помню. Кажется она начинается с program и заканчивается end. Сделал так. Код: 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.
Сборочный скриптик. Код: sql 1. 2. 3. 4. 5. 6.
И лог ошибок. Кто знает как исправить? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 21:17 |
|
Генерация сочетаний из 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 21:43 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton хорошо сжимается дифференциальным кодированием или деревом префиксов. В идеале не должно быть ничего из упомянутого. Надо просто формулу для перевода какого-то значения, например 12345, в счисление C(K,N) и обратно ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 21:49 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T mayton хорошо сжимается дифференциальным кодированием или деревом префиксов. В идеале не должно быть ничего из упомянутого. Надо просто формулу для перевода какого-то значения, например 12345, в счисление C(K,N) и обратно похоже формулы нету, есть алгоритмы, которые позволяют его вычислить для сочетания и наоборот. Суть всех методов - сведение к сумме задач меньшей размерности. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 22:04 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, Все таки разница между делфи и фпс большая Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 22:26 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, одно понятно: вместо Result надо поставить имя функции GenerateCombinationDesc ... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 22:55 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, {$APPTYPE CONSOLE} надо убрать нижний блок можно попробовать заменить на Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.01.2021, 23:03 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Из любопытства вопрос, удельную скорость есть смысл сопоставить? К примеру кол-во на 1 ГГц процессора или ядра, на 1 ГБ памяти... Различия в операционках за кадром. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 15:52 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, уже лучше. Код: 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.
Остались ошибки типизации. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 16:35 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 Из любопытства вопрос, удельную скорость есть смысл сопоставить? К примеру кол-во на 1 ГГц процессора или ядра, на 1 ГБ памяти... Различия в операционках за кадром. количество тактов на сочетание сильно зависит от количества элементов в сочетании, у меня так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 17:04 |
|
Генерация сочетаний из 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 17:16 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
А прога знает, что (37 по 24) == (37 по 13) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 17:18 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 А прога знает, что (37 по 24) == (37 по 13) ? нет, она тупо генерирует ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 17:22 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, вот в таком виде работает. Но в печати результата есть какой-то артифакт. Код: sql 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.
Отчот для C(5,6) Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 18:41 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
надо присвоить результат значению функции Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 18:51 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, уже работает но счетчик где-то циклически переполняется . При Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: sql 1.
При Код: sql 1.
Результат Код: sql 1.
А при n=600, результат -16908 (отрицательный) А так по сорости быстро. Да. Очень быстро. Но надо фиксить. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 20:54 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Aleksandr Sharahov, уже работает но счетчик где-то циклически переполняется . А при n=600, результат -16908 (отрицательный) А k какое? Может, результат укладывается не укладывается в 32-битный integer? попробуй заменить его на int32 или longint пишут есть еще delphi mode: https://wiki.freepascal.org/Integer ... |
|||
:
Нравится:
Не нравится:
|
|||
30.01.2021, 21:05 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, если переключать в Delphi mode ({$mode DelphiUnicode}) то компилляция останавливается. Еще новые ошибки выдает. Видимо уровни строгости выше. Вобщем заменил Integer у которого разрядная сетка плавает (16-32 бит) на более строгий Int32 и пересобрал. Вот последняя версия. Работает быстро. 2 из 10 000 выдает за милисекунды. Точно померять не могу т.к. не знаю функций точных часов. Вот последнний исходник. Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2021, 02:09 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 А прога знает, что (37 по 24) == (37 по 13) ? ИМХО это ничем не поможет. Сочетания по 13 думаю чуть быстрее будут генериться, но если начать их преобразовывать в сочетания по 24, то само преобразование займет больше времени чем мы сэкономили. Все алгоритмы выше построены на получении из текущего состояния следующее, т.е. в среднем меняется несколько разрядов, а тут придется все обрабатывать каждый раз. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2021, 09:05 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton, также имеет смысл заменить pIntegerArray на PInt32Array и после uses добавить определения своих массивов: Код: pascal 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2021, 11:11 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T, а ты сравни у него близкие значения авториз 32 по 16: 601080390 за 609 мсек 3,65 тактов из 36 по 24: 1251677700 за 2156 мсек 6,20 тактов Разница в 2 раза. По проге посмотреть (может ошибаюсь), цикл в цикле, затраты n*k. Считаем для k=n-k, а выход только преобразуем в к=к. Я так подумал. Особенно когда (1000, 800) против (1000, 200) Нешто это съест економию? А так надо писать памятку по применению. Чтоб прогер перед вызовом и после сам по желанию преобразовывал туда-сюда. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2021, 20:18 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 Dima T, а ты сравни у него близкие значения авториз 32 по 16: 601080390 за 609 мсек 3,65 тактов из 36 по 24: 1251677700 за 2156 мсек 6,20 тактов Считаем для k=n-k, а выход только преобразуем в к=к. Я так подумал. Особенно когда (1000, 800) против (1000, 200) Нешто это съест економию? А так надо писать памятку по применению. Чтоб прогер перед вызовом и после сам по желанию преобразовывал туда-сюда. не все прогеры даже станут преобразовывать, некоторые могут додуматься вместо элементов, вошедших в сочетание, работать с невошедшими элементами ... |
|||
:
Нравится:
Не нравится:
|
|||
31.01.2021, 20:46 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 Dima T, а ты сравни у него близкие значения авториз 32 по 16: 601080390 за 609 мсек 3,65 тактов из 36 по 24: 1251677700 за 2156 мсек 6,20 тактов Считаем для k=n-k, а выход только преобразуем в к=к. Я так подумал. Особенно когда (1000, 800) против (1000, 200) Нешто это съест економию? А так надо писать памятку по применению. Чтоб прогер перед вызовом и после сам по желанию преобразовывал туда-сюда. Это не близкие, надо считать сколько разрядов было задействовано для получение следующего значения. Например С(3,6) ЗначениеРазрядов1 2 3 41 2 3 511 2 3 611 2 4 521 2 4 621 2 5 621 3 4 531 3 4 611 3 5 62... Поменять может потребоваться от 1 до k разрядов. Назовем проверку разряда элементарной операцией. Уже видно что в среднем будет менее k/2 элементарных операций. Для преобразования от k к n-k надо перебрать все n и выкинуть из них все что есть с исходной выборке. В один проход делается, но это примерно n+k элементарных операций, т.е. все равно это будет дольше чем (n-k)/2. Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 13:58 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov Код: pascal 1. 2.
Саша а что эта форма объявления массива означает? Бесконечный массив? Или до effffff включительно? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 14:07 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Aleksandr Sharahov Код: pascal 1. 2.
Саша а что эта форма объявления массива означает? Бесконечный массив? Или до effffff включительно? Формально, это массив от 0 до максимального значения, которое позволяет компилятор (effffff). Но это всего лишь определение типа, т.е. реально память не выделяется, мы здесь просто говорим, что с так объявленной памятью хотим работать как с массивом целых максимальной длины, т.е. после целого с индексом 0 может быть расположено еще сколько угодно целых. Понятно, что такой огромный массив нам не нужен, вся фишка в следующем определении Код: pascal 1.
Оно говорит, что указатель типа PInt32Array указывает на нулевой элемент массива целых чисел, т.е. через такой указатель можно работать с памятью как со статическим массивом целых чисел. Обычно для статических массивов компилятор Delphi строит более эффективный код, чем для динамических массивов. Поэтому память мы выделяем динамически вызовом SetLength, а работаем с ней как со статическим массивом на стеке. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 14:59 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 15:29 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov Формально, это массив от 0 до максимального значения, ........ как со статическим массивом на стеке. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 15:48 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov некоторые могут додуматься вместо элементов, вошедших в сочетание, работать с невошедшими элементами ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 15:56 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 Aleksandr Sharahov некоторые могут додуматься вместо элементов, вошедших в сочетание, работать с невошедшими элементами Можно, но немного допрограммировать придется. Способ 1. Если n небольшое, например n<=32 (или 64), сочетание можно представить целым числом, биты которого равны 1 - если элемент входит в сочетание, 0 - если не входит. Остается на входе выбрать меньшее k, а на выходе инвертировать сочетание (xor -1) Способ 2. Сначала ответим на вопрос: зачем вообще в нашей программе понадобились сочетания? Ведь это не конечный результат работы, надо потом с ними что-то делать. Далее: как это что-то мы будем делать? Скорее всего, перебирая в цикле элементы, *вошедшие* в сочетание. И что мешает нам как программистам предусмотреть цикл для *невошедших* элементов? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 16:17 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Спос1 понятно. Спос2: Дима полагает, что ускорения не достичь. Dima T Для преобразования от k к n-k надо перебрать все n и выкинуть из них все что есть с исходной выборке. В один проход делается, но это примерно n+k элементарных операций, ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 17:26 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 Dima T Для преобразования от k к n-k надо перебрать все n и выкинуть из них все что есть с исходной выборке. В один проход делается, но это примерно n+k элементарных операций, Благодаря тому что упорядочены можно преобразовать в один проход, но надо пройтись по всем элементам обоих массивов (n+k), когда для получения следующего значения надо поработать с менее k/2 элементов, даже если k максимально (n-1), то это всего лишь (n-1)/2 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 18:36 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 Спос1 понятно. Спос2: Дима полагает, что ускорения не достичь. Dima T Для преобразования от k к n-k надо перебрать все n и выкинуть из них все что есть с исходной выборке. В один проход делается, но это примерно n+k элементарных операций, Ответ на этот вопрос и ожидаемый, и удивительный. Если коротко, Dima T прав. Удивительно, как сильно он прав ) Даже если реализовать второй способ по уму, и вообще не формировать новое сочетание, а обрабатывать элементы "на лету", то все равно n лишних сравнений для каждого сочетания вносят замедление, которое значительно перевешивает полученный при генерации выигрыш. Проверку я проводил на том же примере 24 из 36. Обработка сочетаний заключалась в вычислении общей суммы всех элементов сочетаний по модулю 2^32. "Оптимизированный" вариант, который вычислял сумму элементов, не вошедших в сочетания 12 из 36, оказался в 2 раза медленнее. Вывод. Выгоднее сразу генерировать сочетания, которые не требуется "переделывать" перед обработкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 21:11 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Генерацию длинных сочетаний можно оптимизировать за счет более быстрого формирования хвоста в случае, когда он состоит из серии последовательных элементов. Например, для каждого из следующих переходов достаточно изменить 1 элемент: 02348 01348 01248 01238 Длинные сочетания следующий алгоритм на Delphi генерирует быстрее предыдущего более, чем в 2 pаза: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
01.02.2021, 22:59 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
С псевдооптимизациями я понял. Теперь вопрос по способам использования. Данная версия заточена на массовый стрим сочетаний. А если хочется ... не уверен, что правильно, реэнтерабельности? Аналогично next_permutation() Сильно надо курочить для переделки под сохранение последнего состояния циклов? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2021, 12:54 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
exp98 А если хочется ... не уверен, что правильно, реэнтерабельности? Аналогично next_permutation() 22268624 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2021, 13:01 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Мой вариант: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 00:41 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Пора наверное делать сравнительную табличку. Все реализации. И скорость генерации. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 02:03 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov Генерацию длинных сочетаний можно оптимизировать за счет более быстрого формирования хвоста в случае, когда он состоит из серии последовательных элементов. Например, для каждого из следующих переходов достаточно изменить 1 элемент: 02348 01348 01248 01238 Длинные сочетания следующий алгоритм на Delphi генерирует быстрее предыдущего более, чем в 2 pаза: Код: 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.
Ваш алгоритм делает перестановки не из чисел массива, а просто уменьшая и увеличивая начальные числа на 1. Это неправильно, должны быть перестановки элементов массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 09:34 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
__Avenger__ Ваш алгоритм делает перестановки не из чисел массива, а просто уменьшая и увеличивая начальные числа на 1. Это неправильно, должны быть перестановки элементов массива. Все верно, так получилось что исходно все решали задачу перестановок диапазона от 1 до N, где N задается на входе. Будем считать эти числа индексами элементов массива начиная с 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2021, 10:07 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Здесь на топике рассматриваются только перестановки N чисел из M чисел? А если ещё рассматривать все комбинации чисел из M чисел: по 1, по 2, по 3 и т.д. за один прогон ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 14:42 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Gennadiy Usov А если ещё рассматривать все комбинации чисел из M чисел: по 1, по 2, по 3 и т.д. за один прогон Если еще добавить используемое тут условие монотонного возрастания, то такая комбинация одна для каждого М. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 14:47 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Gennadiy Usov Здесь на топике рассматриваются только перестановки N чисел из M чисел? А если ещё рассматривать все комбинации чисел из M чисел: по 1, по 2, по 3 и т.д. за один прогон тогда просто M-битный счетчик: K=K+1 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 14:57 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Кстати, если найдена одна комбинация N из М, то тут же есть одна комбинация (М - N) из М Или проще (и быстрее) в едином цикле (циклах) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 14:57 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
нашел в Питоне подпрограмму: itertools.combinations(iterable, [r]) - комбинации длиной r из iterable без повторяющихся элементов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 19:21 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Gennadiy Usov нашел в Питоне подпрограмму: itertools.combinations(iterable, [r]) - комбинации длиной r из iterable без повторяющихся элементов. Нам тут надо чуть сложнее, комбинация должна быть монотонно возрастающая, т.е. надо {1,2,3} и не надо {1,3,2}, {3,2,1} и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 19:34 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Обсуждать питонские комбинаторщики имеет смысл только с их исходным кодом и если они несут идею лучше чем мы уже здесь рассмотрели. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 19:47 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Обсуждать питонские комбинаторщики имеет смысл только с их исходным кодом и если они несут идею лучше чем мы уже здесь рассмотрели. Массив из 25 чисел обрабатывается за 5 сек. на моём компе. 33554430 вариантов. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 19:53 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Dima T Gennadiy Usov нашел в Питоне подпрограмму: itertools.combinations(iterable, [r]) - комбинации длиной r из iterable без повторяющихся элементов. Нам тут надо чуть сложнее, комбинация должна быть монотонно возрастающая, т.е. надо {1,2,3} и не надо {1,3,2}, {3,2,1} и т.п. то и получаемые массивы будут то же монотонно возрастающие (убывающие) Проверено ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 19:56 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Без исходников - неинтересно. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2021, 20:03 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Вот код реализации itertools.combination: https://github.com/python/cpython/blob/master/Modules/itertoolsmodule.c#L2674 Алгоритм похож на Dima T Алгоритм скопировал в свой код. Работает почти в два раза медленнее моего. Впрочем там видны места потенциальных оптимизаций. Может и можно его ускорить. Код: 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. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2021, 11:25 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
до кучи добавлю питонизацию алгоритма 22272948 , перебирает комбинации по 6 из 100 за 84 сек: Код: python 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2021, 14:31 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Aleksandr Sharahov, спасибо. Насколько я понимаю CPython - это и есть реализация Python3. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2021, 15:19 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Aleksandr Sharahov, спасибо. Насколько я понимаю CPython - это и есть реализация Python3. я тоже так думаю ) Тут интересно то, что вызов их итератора для подсчета комбинаций оказывается сравним по времени и даже медленнее (90 сек), чем родная программа на питоне. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2021, 15:30 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
Ни знаю. Я ни разу ни кайфонул от Питона. Если нужен был универсальный язык-клей - то взяли-бы Lua например. А в этом Питоне есть странные вырви-глазные ключевые слова. Код: sql 1.
например. Зачем так сделано? ХЗ. Язык должен быть эстетически красив и радовать. Причем масса других ключевых слов - с маленькой буквы а True/False почему-то с большой. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2021, 15:39 |
|
Генерация сочетаний из N по K
|
|||
---|---|---|---|
#18+
mayton Язык должен быть эстетически красив и радовать. Подумал сразу, что если в известном поизведении LA Creazione в дающую справа руку вложить мордофон? Веление времени. Что станет с эстетикой? И вообще, по-мойму из 3-х свойств ЯП (красота, радость, скорость) осуществимы не более 2-х. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2021, 17:32 |
|
|
start [/forum/topic.php?all=1&fid=16&tid=1339689]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
198ms |
get tp. blocked users: |
2ms |
others: | 252ms |
total: | 544ms |
0 / 0 |