|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Всем здравствуйте, подскажите, как решить задачу: есть массив L размерности n, массив заполнен элементами длины L-i Надо разделить массив на P частей ( p - фиксированное, задаётся ручками) так, чтобы минимизировать длину массива максимальной длины. Сортировать массив нельзя. Пример: массив размерности 5, элементы - 1,2,3,7,5. P = 3. Тогда результат такой : 1,2,3 - 7 - 5 Если поможет, то P не может быть более 10. Подскажите, какие идеи.. Заранее спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 09:57 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Неясно, что такое "длина элемента", "L-i" и "минимизировать длину массива максимальной длины" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 10:08 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
...мне кажется, что где-то тут пропущено слово "Сумма" ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 10:12 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
длина элемента i = значение i-го элемента массива, длина массива = сумма элементов массива минимизировать длину массива максимальной длины - разбить массив на подмассивы таким образом, чтобы минимизировать длину подмассива максимальной длины. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 10:14 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
И зачем одни понятия заменять другими????????? Вместо приближения к решению задачи, ты отдаляешь от него, в том числе потенциальных участников. Ну ПРИЧЕМ ТУТ "длина", когда на самом деле это "сумма". Ну причем тут "длина элемента", когда на самом деле это "значение элемента"? ну причем тут "длина массива", когда это "размер массива"? Ты три разных понятия обозвал одним словом и хочешь, чтобы кто-то в этом разобрался. Предлагаю переписать ТЗ с учетом вышесказанного и ни разу не употребив слово "длина" , ибо оно там ни разу не нужно. Тогда можно будет заняться решением задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 10:27 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
ок, ещё раз: есть массив L размерности N. Надо разделить массив на p частей ( p - фиксированное, задаётся ручками) так, чтобы минимизировать РАЗМЕР наибольшего массива (массива максимального размера) . Сортировать массив нельзя. Пример: массив размерности 5, элементы - 1,2,3,7,5. P = 3. Тогда результат такой : 1,2,3 - 7 - 5 Если поможет, то P не может быть более 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 10:35 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111Пример: массив размерности 5, элементы - 1,2,3,7,5. P = 3. Тогда результат такой : 1,2,3 - 7 - 5 Согласно ТЗ пример некорректен должно быть так 1,2 - 3,7 - 5 (ЗЫ: размерность и размер - не одно и то же, в данном случае - размер) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 11:08 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
аааа, капец, вы съедаете мой мозг по частям, как впрочем и я ваш) ещё раз: есть массив L размерности N. Надо разделить массив на p подмассивов ( p - фиксированное, задаётся ручками) так, чтобы минимизировать сумму элементов подмассива наибольшей суммы . Сортировать массив нельзя. Пример: массив размерности 5, элементы - 1,2,3,7,5. P = 3. Тогда результат такой : 1,2,3 - 7 - 5 Если поможет, то P не может быть более 10. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 11:12 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111аааа, капец, вы съедаете мой мозг по частям, как впрочем и я ваш) это не означает, что не следует читать то, что я пишу, а также то, что пишешь ты сам Vadim111есть одномерный массив L размерностиразмера N. Надо разделить массив на p подмассивов ( p - фиксированное, задаётся ручками) так, чтобы минимизировать сумму элементов подмассива наибольшего суммыразмера. Сортировать массив нельзя.так? Vadim111Пример: массив размерности 5, элементы - 1,2,3,7,5. P = 3. Тогда результат такой : 1,2,3 - 7 - 5 но это не меняет сути дела, правильный ответ: 1,2 - 3,7 - 5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 11:19 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Уважаемый Shocker.Pro. Помогите мне, пожалуйста, составить техзадание, давайте я напишу своими словами, а вы поможете облечь это в грамотную форму. Может так: разделить массив на P частей так, чтобы суммы значений элементов каждой части были максимально близки ? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 11:24 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
у вас есть массив чисел предлагаю следующий алгоритм строите по заданному массиву новый массив нарастающих сумм последний элемент в этом массиве = сумме всех элементов S сумму делите на нужное число частей ( P ) нарисуйте график нарастающих сумм абцисса нарастающая сумма номер элемента координата проведите горизонтальные линии с шагов S/P элементы попадающие в полосу суммируем относим к одной группе сделайте это на графике и все станет понятно нужно только грамотно учесть когда точки попадают на горизонтальные линии ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 11:46 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Valer, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 11:54 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111Может так: разделить массив на P частей так, чтобы суммы значений элементов каждой части были максимально близки ? Может. Я-то откуда знаю, что требуется. По крайней мере, эта задача кардинально отличается от предыдущей. Ну раз все ясно, что сказал Valer - вперед. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 12:16 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111разделить массив на P частей так, чтобы суммы значений элементов каждой части были максимально близки ?Задача интересна, но пока никакой красивый метод в голову так и не пришел, только брутфорсить - перебрать все возможные варианты. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 15:06 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
ну, допустим, при брутфорсе, можно сразу отбрасывать варианты, заведомо худшие, чем уже были раньше, это сэкономит, мне кажется, процентов 80 телодвижений ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 15:25 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#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. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.
Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2011, 23:47 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Shocker.Pro, спасибо, алгоритм работает, но очень очень медленно.... на массиве 73 элемента вообще висит уже очень долго ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2011, 11:24 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111, еще бы прогрессия даже не геометрическая, а факториальная оптимизируй NextParts - ее можно сильно поджать по времени при желании ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2011, 12:46 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Shocker.Pro, ок, понятно, вначале в коде бы вашем разобраться)) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2011, 13:16 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111очень очень медленно.... на массиве 73 элемента вообще висит уже очень долгоЕще бы, при P=10 и N=73 перебрать надо за 620 миллиардов вариантов ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2011, 18:02 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Вообще (ИМХО), правильной формулировкой данной задачи можно считать следующее: "Разбить последовательность из N чисел на P частей (P>1 & P<N) так, чтобы отклонения сумм частей от среднего (сумм частей) были минимальны". "Тупым" "брутфорсом" задача, конечно же, решаема. Достаточно перебрать все варианты разбивки множества на части, рассчитывая суммы частей, и считая сумму квадратов отклонений... первая оптимизация тоже делается сразу - достаточно при расчете КВАДРОТКЛ контролировать выход за расчетный минимум... - вся проблема в том, что количество инвариантов растет (как правильно замечено ранее) пропорционально n!/p! Так что можно посоветовать? - скажем, статистические функции для первого приближения, далее - анализ полученных вариантов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2011, 22:26 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
спасибо, а почему именно сумму квадратов отклонений? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 11:58 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111спасибо, а почему именно сумму квадратов отклонений? Потому что, ты там кое где оговорился, что нужно подобрать примерно одинаковые суммы. Ну а так то цель - найти разбиение, у которого, максимальная сумма (мера) подмассивов будет минимальной среди множества других разбиений. Хотя может возможно доказать, что эти цели совпадают и мини-максная мера обнаруживается у таких разбиений, у которых меры элементов разбиения близки друг к дружке. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 12:12 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111спасибо, а почему именно сумму квадратов отклонений? педивикия ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 12:12 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
эхх, всё равно ничего не понятно... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 12:39 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111эхх, всё равно ничего не понятно... Да не важно что именно сравнивать. Проблема в количестве вариантов. Для начал нужно придумать, как не перебирать все. Еще и при условии, что массив нельзя сортировать. А на что именно сравнивать получаемые разбиения - так пофигу. равнивай на что хочешь. Все-равно не дождешься конца выполнения, если будешь перебирать триллионы вариантов )) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 12:49 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
В принципе, очень неплохих результатов можно добиться, воспользовавшись стохастическим методом. В цикле из N попыток, случайно задаются сечения ряда и сравниваются тем или иным образом, например, по методу наименьших квадратов, качество попытки. В таком подходе нельзя гарантировать поиск наилучшего результата, зато за приемлимое время можно получить удовлетворительный результат. Величина N находится эмпирически, с учетом мощности ПК ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 14:49 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Ну вот когда еще я отписывал предыдущий пост - у меня был готовый вариант нахождения разбиения. Естественно, полным перебором, правда, с некоторыми улучшениями. Но я взял среднюю по мощности офисную машинку и погонял на ней свой расчет. На VBA. Вообще, увеличение P на 1 приводило к возрастанию времени раза в 4, увеличение N вдвое - к увеличению времени раз в 40. Поскольку даже тест N=30/P=7 работал 5 секунд, нецелесообразность была видна невооруженным глазом. Пока раздумываю над новым алгоритмом... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2011, 18:02 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#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. 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.
Для ряда длиной 30, с числом разбиений на 5 фрагментов, время 3.2 сек. при том же числе испытаний ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 02:41 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Спасибо большое! Последний вариант работает быстро, делит хорошо! ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 07:55 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
эхх, хотя 191 элемент на 7 полок только что поделил - кривовато... ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 08:06 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111эхх, хотя 191 элемент на 7 полок только что поделил - кривовато... Исходный ряд покажите здесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 08:11 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
mds_world, 2 варианта - 1000000 и 10000000 попыток как выложить, чтобы читабельно было? Номер Лев.гран Прав.гран Сумма Ряд 1 0 13 143.5 7.5-14-9-16-8-7.5-11-7.5-13-7.5-13-7.5-13-9 2 14 29 153.5 9-9-14-7-8-8-8-16-7-7-7-7.5-16-9-8-13 3 30 48 199 9-6.5-11-9-10.5-10.5-10.5-10.5-14-7.5-15-8.5-8-8.5-7.5-16-14-6.5-16 4 49 68 205 16-12-8-14-11.5-11.5-11.5-7-8.5-16-8-8-8-14-6.5-14-6.5-9.5-8-6.5 5 69 86 177.5 16-8.5-6.5-14-8-15-7.5-16-11.5-6.5-9.5-7.5-14-8-8.5-6-8.5-6 6 87 109 225 8.5-8.5-8.5-8.5-7.5-14-16-14-7-5.5-9.5-11.5-11.5-19-9.5-7.5-7.5-7.5-7.5-11.5-7.5-9.5-7.5 7 110 124 167.5 9.5-11.5-11.5-7.5-9.5-15-15-19-16-16-6-14-7.5-9.5-0 Время исполнения= 0 сек. Ряд длиной 125, фрагментов 7, попыток - 1000000 Номер Лев.гран Прав.гран Сумма Ряд 1 0 17 182.5 7.5-14-9-16-8-7.5-11-7.5-13-7.5-13-7.5-13-9-9-9-14-7 2 18 35 171 8-8-8-16-7-7-7-7.5-16-9-8-13-9-6.5-11-9-10.5-10.5 3 36 49 158.5 10.5-10.5-14-7.5-15-8.5-8-8.5-7.5-16-14-6.5-16-16 4 50 66 174.5 12-8-14-11.5-11.5-11.5-7-8.5-16-8-8-8-14-6.5-14-6.5-9.5 5 67 88 209 8-6.5-16-8.5-6.5-14-8-15-7.5-16-11.5-6.5-9.5-7.5-14-8-8.5-6-8.5-6-8.5-8.5 6 89 105 172 8.5-8.5-7.5-14-16-14-7-5.5-9.5-11.5-11.5-19-9.5-7.5-7.5-7.5-7.5 7 106 124 203.5 11.5-7.5-9.5-7.5-9.5-11.5-11.5-7.5-9.5-15-15-19-16-16-6-14-7.5-9.5-0 Время исполнения= 0 сек. Ряд длиной 125, фрагментов 7, попыток - 10000000 ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 08:16 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
в некоторых массивах разброс значений небольшой, поэтому я вначале считал так: увеличивал 1 фрагмент на 1 элемент массива, остальные фрагменты наполнял элементами, пока ширина фрагмента не превысит ширину 1 фрагмента. Если в результате значения влазили в фрагменты, то отлично, в противном случае увеличивал 1 фрагмент ещё на 1 элемент(следующий по счёту) и заново пересчитывал. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 08:23 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
mds_worldVadim111эхх, хотя 191 элемент на 7 полок только что поделил - кривовато... Исходный ряд покажите здесь. Если эта работа реальная (а не учебная), то сначала перед разложением "элементов на полки", надо провести статистический анализ ряда. Поскольку число возможных размещений невероятно велико, то статанализ поможет сократить число возможных разбиений. В частности, при большой дисперсии данных, можно выбирать (и убирать из выборки) элементы большие чем среднее+3*сигма, где сигма - стандартное отклонение ряда. Все равно эти элементы заведомо потребуют для себя "отдельной полки". На основе статанализа, можно предложить и другие методы сократить пространство вариантов размещений. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 11:02 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
работа реальная, выбирать и убирать нельзя редко попадаются элементы толще чем 3 средних мне нравится идея плясать от среднего, если, скажем число элементов больше какого то N и полный перебор, если меньше, как то так может? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 11:31 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
Vadim111работа реальная, выбирать и убирать нельзя Дак не совсем убирать, а только на время подсчета. Ведь эти элементы все равно потребуют для себя отдельного размещения Vadim111редко попадаются элементы толще чем 3 средних Не три средних, а среднее+3 сигма. Например, есть ряд 10, 11, 12, 13, 14, 15, 80 , 10, 5, 6, 7, 8, 9, 1, 45 , 1, 5. Среднее этого ряда 14.8, сигма = 19.4. Среднее+3*сигма=73. И элемент 80 выводим из расчетов, запомнив его и подставив в окончательном выводе. А элемент 45 остается, хотя он и больше чем три средних. Но его вполне можно компоновать вместе с рядом стоящей единицей. Vadim111мне нравится идея плясать от среднего, если, скажем число элементов больше какого то N и полный перебор, если меньше, как то так может? Да, такой алгоритм осуществим. Но требует немалой работы ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 12:05 |
|
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
|
|||
---|---|---|---|
#18+
я грубо оценил, но можно и так - в массиве нету элементов, толще чем среднее + 3 сигма( Видимо проще оценить, когда полный перебор занимает немного времени (1 вариант перебора - полный) , а когда - много - примерный вариант, предложенный Вами. Хотя в обеих случаях мой метод с наращиванием 1 строки вполне живуч, ибо отклонение небольшое от среднего.. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2011, 12:12 |
|
|
start [/forum/topic.php?all=1&fid=60&tid=2158606]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
others: | 10ms |
total: | 154ms |
0 / 0 |