|
Генерация сочетаний из 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 |
|
|
start [/forum/topic.php?fid=16&msg=40040487&tid=1339689]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 262ms |
total: | 420ms |
0 / 0 |