powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
25 сообщений из 38, страница 1 из 2
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303636
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем здравствуйте, подскажите, как решить задачу:
есть массив L размерности n, массив заполнен элементами длины L-i
Надо разделить массив на P частей ( p - фиксированное, задаётся ручками) так, чтобы минимизировать длину массива максимальной длины. Сортировать массив нельзя.

Пример: массив размерности 5, элементы - 1,2,3,7,5.
P = 3. Тогда результат такой : 1,2,3 - 7 - 5

Если поможет, то P не может быть более 10.
Подскажите, какие идеи..

Заранее спасибо.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303656
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неясно, что такое "длина элемента", "L-i" и "минимизировать длину массива максимальной длины"
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303664
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...мне кажется, что где-то тут пропущено слово "Сумма"
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303669
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
длина элемента i = значение i-го элемента массива,
длина массива = сумма элементов массива
минимизировать длину массива максимальной длины - разбить массив на подмассивы таким образом, чтобы минимизировать длину
подмассива максимальной длины.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303690
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И зачем одни понятия заменять другими?????????
Вместо приближения к решению задачи, ты отдаляешь от него, в том числе потенциальных участников.
Ну ПРИЧЕМ ТУТ "длина", когда на самом деле это "сумма". Ну причем тут "длина элемента", когда на самом деле это "значение элемента"? ну причем тут "длина массива", когда это "размер массива"? Ты три разных понятия обозвал одним словом и хочешь, чтобы кто-то в этом разобрался.

Предлагаю переписать ТЗ с учетом вышесказанного и ни разу не употребив слово "длина" , ибо оно там ни разу не нужно. Тогда можно будет заняться решением задачи.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303702
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ок, ещё раз:

есть массив L размерности N.
Надо разделить массив на p частей ( p - фиксированное, задаётся ручками) так, чтобы минимизировать РАЗМЕР наибольшего массива (массива максимального размера) . Сортировать массив нельзя.

Пример: массив размерности 5, элементы - 1,2,3,7,5.
P = 3. Тогда результат такой : 1,2,3 - 7 - 5

Если поможет, то P не может быть более 10.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303780
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim111Пример: массив размерности 5, элементы - 1,2,3,7,5.
P = 3. Тогда результат такой : 1,2,3 - 7 - 5
Согласно ТЗ пример некорректен

должно быть так 1,2 - 3,7 - 5

(ЗЫ: размерность и размер - не одно и то же, в данном случае - размер)
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303795
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
аааа, капец, вы съедаете мой мозг по частям, как впрочем и я ваш)

ещё раз:

есть массив L размерности N.
Надо разделить массив на p подмассивов ( p - фиксированное, задаётся ручками) так, чтобы минимизировать сумму элементов подмассива наибольшей суммы . Сортировать массив нельзя.

Пример: массив размерности 5, элементы - 1,2,3,7,5.
P = 3. Тогда результат такой : 1,2,3 - 7 - 5

Если поможет, то P не может быть более 10.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303823
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303840
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый Shocker.Pro. Помогите мне, пожалуйста, составить техзадание, давайте я напишу своими словами, а вы поможете облечь это в грамотную форму.
Может так: разделить массив на P частей так, чтобы суммы значений элементов каждой части были максимально близки ?
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303889
Valer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас есть массив чисел
предлагаю следующий алгоритм

строите по заданному массиву новый массив нарастающих сумм
последний элемент в этом массиве = сумме всех элементов S
сумму делите на нужное число частей ( P )
нарисуйте график нарастающих сумм
абцисса нарастающая сумма
номер элемента координата
проведите горизонтальные линии с шагов S/P
элементы попадающие в полосу суммируем относим к одной группе
сделайте это на графике
и все станет понятно
нужно только грамотно учесть когда точки попадают на горизонтальные линии
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303906
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Valer, спасибо!
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37303970
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim111Может так: разделить массив на P частей так, чтобы суммы значений элементов каждой части были максимально близки ?
Может. Я-то откуда знаю, что требуется. По крайней мере, эта задача кардинально отличается от предыдущей. Ну раз все ясно, что сказал Valer - вперед.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37304382
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim111разделить массив на P частей так, чтобы суммы значений элементов каждой части были максимально близки ?Задача интересна, но пока никакой красивый метод в голову так и не пришел, только брутфорсить - перебрать все возможные варианты.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37304430
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну, допустим, при брутфорсе, можно сразу отбрасывать варианты, заведомо худшие, чем уже были раньше, это сэкономит, мне кажется, процентов 80 телодвижений
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37305040
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот кажется вот так.

Алгоритм крайне неоптимальный по времени, основная неоптимальность - поиск очередного варианта разреза - вынесен в отдельную функцию, можно над ним поколдовать.

Код: 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.
Option Explicit

Private Const ArrSize As Integer =  15     'размер массива
Private Const NumParts As Integer =  6     'количество частей
Private Const MinValue As Integer =  0     'минимальное значение элемента (>=0)
Private Const MaxValue As Integer =  100   'максимальное значение элемента


Private Sub Command1_Click()

Dim Arr( 1  To ArrSize) As Integer    'основной массив
Dim Parts() As Integer              'карта разреза
Dim BestParts() As Integer
Dim BestDiff As Long, PartSum As Long, MinPartSum As Long, MaxPartSum As Long, ArrSum As Long
Dim i As Integer, j As Integer, k As Integer
ReDim Parts( 1  To NumParts)
ReDim BestParts( 1  To NumParts)


'набиваем массив случайными данными
Randomize
ArrSum =  0 
For i =  1  To ArrSize
  Arr(i) = Fix(Rnd( 1 ) * (MaxValue +  1 ) + MinValue)
  ArrSum = ArrSum + Arr(i)
Next
'инициализируем карту
For i =  2  To NumParts
  Parts(i) =  1 
Next
Parts( 1 ) = ArrSize - NumParts +  1 
BestParts = Parts
BestDiff = ArrSum

Do
  'ищем минимальную и максимальную сумму части
  MinPartSum = ArrSum
  MaxPartSum =  0 
  j =  1 
  For i =  1  To NumParts
    PartSum =  0 
    For j = j To j + Parts(i) -  1 
      PartSum = PartSum + Arr(j)
    Next
    If MinPartSum > PartSum Then MinPartSum = PartSum
    If MaxPartSum < PartSum Then MaxPartSum = PartSum
  Next
  'запоминаем лучшую разницу между минимумом и максимумом
  If BestDiff > MaxPartSum - MinPartSum Then
    BestDiff = MaxPartSum - MinPartSum
    BestParts = Parts
  End If
Loop While NextParts(Parts)

'печать результата
Debug.Print "Массив:"
For i =  1  To ArrSize
  Debug.Print CStr(Arr(i)) + " ";
Next
Debug.Print ""
Debug.Print "Разбивка:"
j =  1 
For i =  1  To NumParts
  For j = j To j + BestParts(i) -  1 
    Debug.Print CStr(Arr(j)) + " ";
  Next
  Debug.Print ""
Next

End Sub
Код: 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.
Private Function NextParts(ByRef Parts As Variant) As Boolean
'получаем следующий метод разреза массива

Dim i As Integer, Sum As Long
NextParts = True
Do
  'щелкаем счетчиком
  For i =  1  To NumParts
    Parts(i) = Parts(i) +  1 
    If Parts(i) <= ArrSize Then Exit For
    Parts(i) =  1 
  Next
  'проверяем конец счетчика
  If i > NumParts Then
    NextParts = False
    Exit Function
  End If
  'проверяем, подходящая ли комбинация частей
  Sum =  0 
  For i =  1  To NumParts
    Sum = Sum + Parts(i)
  Next
Loop Until Sum = ArrSize

End Function
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37310562
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

спасибо, алгоритм работает, но очень очень медленно....
на массиве 73 элемента вообще висит уже очень долго
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37310809
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim111,

еще бы
прогрессия даже не геометрическая, а факториальная

оптимизируй NextParts - ее можно сильно поджать по времени при желании
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37310900
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro, ок, понятно, вначале в коде бы вашем разобраться))
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37311609
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim111очень очень медленно....
на массиве 73 элемента вообще висит уже очень долгоЕще бы, при P=10 и N=73 перебрать надо за 620 миллиардов вариантов
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37311910
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще (ИМХО), правильной формулировкой данной задачи можно считать следующее:
"Разбить последовательность из N чисел на P частей (P>1 & P<N) так, чтобы отклонения сумм частей от среднего (сумм частей) были минимальны".

"Тупым" "брутфорсом" задача, конечно же, решаема. Достаточно перебрать все варианты разбивки множества на части, рассчитывая суммы частей, и считая сумму квадратов отклонений... первая оптимизация тоже делается сразу - достаточно при расчете КВАДРОТКЛ контролировать выход за расчетный минимум... - вся проблема в том, что количество инвариантов растет (как правильно замечено ранее) пропорционально n!/p!

Так что можно посоветовать? - скажем, статистические функции для первого приближения, далее - анализ полученных вариантов.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37317546
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо, а почему именно сумму квадратов отклонений?
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37317577
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim111спасибо, а почему именно сумму квадратов отклонений?
Потому что, ты там кое где оговорился, что нужно подобрать примерно одинаковые суммы.

Ну а так то цель - найти разбиение, у которого, максимальная сумма (мера) подмассивов будет минимальной среди множества других разбиений.

Хотя может возможно доказать, что эти цели совпадают и мини-максная мера обнаруживается у таких разбиений, у которых меры элементов разбиения близки друг к дружке.
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37317578
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vadim111спасибо, а почему именно сумму квадратов отклонений? педивикия
...
Рейтинг: 0 / 0
разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
    #37317649
Vadim111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
эхх, всё равно ничего не понятно...
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / разбить массив на n частей, чтобы длина массива макс. длины была минимальной)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]