|
|
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Не могу придумать, как оптимально сделать следующий алгоритм: Входные данные: некоторый массив чисел: 1, 2, ..., N некоторый массив массивов, содержащих произвольные списки этих чисел: { {1}, {1,2,7}, {3, 5},....{1,2,3,4,5,6} }. На выходе должен быть массив массивов массивов :) вида: { { {1}, {2,3}, {4,7}, {5}, {6,8},... } { {1,2}, {3, 9}, {4,7}, {5}, {6,8},... } ... } Любой набор массивов должен содержать все числа из набора и ни одно число не должно повторяться дважды. Итоговый набор этих наборов массивов должен быть полным (то есть содержать все возможные комбинации). Отмечу, на всякий случай, что массив массивов, который есть во входных данных, может не содержать какие-либо из возможных комбинаций (например {1, 2, 3}). Соответственно, эта комбинация и НЕ должна рассматриваться далее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 12:01 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexv, Если немного переформулировать задачу, то необходимо сгенерировать все перестановки, которые состоят только из разрешенных циклов. От этого и надо отталкиваться. Упорядочить разрешенные циклы любым образом и перебрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 15:28 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Честно скажу, я очень смутно понял, что нужно сделать) На всякий случае, могу сказать, как я это первый раз планировал сделать: сначала делается таблица вида (пусть N = 5): 11111 11112 ... 12131 12133 ... 12345 потом из нее сделал массивы массивов (соответственно): {1,2,3,4,5} {1,2,3,4},{5} ... {1,3,5},{2},{4} {1,3},{2},{4,5} ... {1},{2},{3},{4},{5} потом тупо пробежаться по списку и удалить все варианты, содержащие хотя бы один недоступный массив чисел (тот же {1,2,3}, например). Но это все-таки не путь джедаев какой-то - сначала сгенерить все варианты и удалить ненужные) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 15:42 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexv, Т.к. нам заранее неизвестно, сколько разрешенных циклов войдет в подстановку, то проще всего алгоритм реализовать рекурсивно. Если делать совсем в лоб, то потребуется глобальная переменная (или массив битов, если N велико), в которой мы будем XOR'ом включать-выключать использованные циклы и отсортированный массив разрешенных циклов (возможно разбитый на части по первому числу). При каждом вызове процедуры определяем первое свободное число. Возвращаемся из процедуры, если все числа использованы (при этом печатаем очередную строку). Если нашли первое неиспользованное число, то в цикле перебираем все элементы массива разрешенных циклов, начинающиеся с этого числа, и для каждого подходящего элемента массива делаем вложенный вызов. Возвращаемся по окончании цикла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 16:09 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Можете пояснить на примере? ) Допустим, у нас N = 4 (забегая вперед, максимальное количество N предполагается 20). Допустим, возможные комбинации: {1} {2} {4} {1,2} {1,3} {1,3,4} {2,4} {3,4} честно говоря, я пока даже не понял, что именно подразумевается хранить в "глобальной переменной" и что именно вы называете "разрешенным циклом" (это один из "разрешенных массивов"?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 16:56 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexvAleksandr Sharahov, Можете пояснить на примере? ) Допустим, у нас N = 4 (забегая вперед, максимальное количество N предполагается 20). Допустим, возможные комбинации: {1} {2} {4} {1,2} {1,3} {1,3,4} {2,4} {3,4} честно говоря, я пока даже не понял, что именно подразумевается хранить в "глобальной переменной" и что именно вы называете "разрешенным циклом" (это один из "разрешенных массивов"?) При таком N удобно и "занятость" элементов, и каждый "разрешенный массив", и части результата хранить в битах целого числа. Чтобы при рекурсии было меньше параметров, часть из них, особенно если они не меняются между вызовами, удобно делать глобальными. Это может немного ускорить процедуру. Задача интересная, вечером, если будет время напишу подробнее с примером. P.S. У цикла перестановки (подстановки) есть общеизвестное определение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 17:18 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, "...P.S. У цикла перестановки (подстановки) есть общеизвестное определение. " Если я упускаю какие-то общепринятые термины, прошу прощения). Образование мое далеко от программирования, а Кнута в одного раскурить я пока не готов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 17:29 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexv, ясно, просто я думал, так проще будет. Но, в общем, это и не требуется. Думаю, для решения достаточно будет знания двоичной системы. Позже отпишусь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 17:35 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#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. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 21:39 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#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. 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. 115. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 22:00 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, после исправления одна из проверок стала ненужной, упрощенная версия Generate(): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 22:12 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Заранее прошу прощения за ламерский вопрос, но.. я правильно понял, это delphi? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 22:14 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Вопрос возник по поводу ($01, $02, $03, $05, $1C, $0C, $10, $07, $18); //{1},{2},{1,2},{1,4},{3,4,5},{3,4},{5},{1,2,3},{4,5} Я так понимаю, подразумевается следующее: 5/4/3/2/1 (числа) 0/0/0/0/1 = $01 = {1} 0/0/0/1/0 = $02 = {2} 0/0/0/1/1 = $03 = {1,2} 0/0/1/0/0 = $04 = {3} 0/0/1/0/1 = $05 = {1,3} - но у вас на этом месте упоминается {1,4}. Что я неправильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 22:53 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexv, конечно, должно быть {1,3} - это я неверно прокомментировал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2014, 23:05 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Хорошо, еще вопрос (откровенно говоря, вопросов много :), просто для начала самые очевидные задам). В чем смысл конструкции: while c and 1=0 do begin; c:=c shr 1; inc(j); end; ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:00 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Дополню вопрос - имеется в виду часть условия: 1 = 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:01 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexvAleksandr Sharahov, Хорошо, еще вопрос (откровенно говоря, вопросов много :), просто для начала самые очевидные задам). В чем смысл конструкции: while c and 1=0 do begin; c:=c shr 1; inc(j); end; ? Это один из способов найти младший единичный бит в числе c, мы просто в цикле сдвигаем число на 1 бит вправо до тех пор, пока в младшей позиции не окажется единичный бит, и считаем общее количество сдвигов. Задавай другие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:05 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexvДополню вопрос - имеется в виду часть условия: 1 = 0 там другое условие (c and 1)=0 , сравнение имеет низший приоритет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:07 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, Понял, спасибо Следующий вопрос). Я уловить не могу, что же записывается в CycleIndex процедурой Init. Там конструкция ((0,2,3,7),(1),(4,5),(8),(6),...). Честно говоря, я даже предположить не могу, что эти числа означают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:22 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
В частности, я не могу понять, почему они как-то похожи на итоговое решение (типа какие-то массивы с числами от 1 до 8, которые ни разу не повторяются), но решением не являются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:24 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Что означают числа я понял, но логику их объединения в массивы пока что нет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:30 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
Вроде разобрался) Я так понял, это списки номеров массивов, которые содержат соответственно 1, 2 (но без 1), 3 (но без 1 и 2), 4 (но без 1, 2, 3) и 5 (без остальных). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:40 |
|
||
|
алгоритм
|
|||
|---|---|---|---|
|
#18+
balalexvAleksandr Sharahov, Понял, спасибо Следующий вопрос). Я уловить не могу, что же записывается в CycleIndex процедурой Init. Там конструкция ((0,2,3,7),(1),(4,5),(8),(6),...). Честно говоря, я даже предположить не могу, что эти числа означают. В CycleIndex[j, k] последовательно по k записываются индекы i всех элементов AllCycles[i], у которых j-тый бит равен 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2014, 00:41 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38689901&tid=1341302]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 212ms |
| total: | 488ms |

| 0 / 0 |
