Может быть несколько алгоритмов для выполнения того, что вы хотите.
Персонально, я бы сначала проверил, может ли группа быть «поглощена» другими, проверив минимальный и максимальный диапазон.
Exemple:
group1 min 1.00, max 2.00
group2 min 1.50, max 2.50
group3 min 1.25, max 2.25
все элементы группы 3 можно объединить в группы 2 и 3.
Это будет первое минимальное сокращение. Тогда я бы проверил пункт на других группах
Group1 Min Range 3.10 , Max Range 3.50
Item 1 value 3.12
Item 2 value 3.30
Item 3 value 3.50
Group2 Min Range 3.25 , max Range 3.75
Item 1 value 3.25
Item 2 value 3.30
Group3 Min Range 3.30 , max Range 3.90
Item 1 value 3.40
Item 2 value 3.50
с алгоритмом проверки возможности объединения элементов в следующие группы
что-то вроде:
foreach (groups as group){
foreach(group.items as item){
tryToInsertItemIntoOtherGroups(item);
if(group is empty){
delete groupe;
}
}
}
первый цикл (для первой группы) изменится так:
Group1 Min Range 3.10 , Max Range 3.50
Item 1 value 3.12
Group2 Min Range 3.25 , max Range 3.75
Item 1 value 3.25
Item 2 value 3.30
Item 3 value 3.30
Item 4 value 3.50
Group3 Min Range 3.30 , max Range 3.90
Item 1 value 3.40
Item 2 value 3.50
второй цикл (для второй группы) приведет к удалению группы 2:
Group1 Min Range 3.10 , Max Range 3.50
Item 1 value 3.12
Item 2 value 3.25
Item 3 value 3.30
Item 4 value 3.30
Item 5 value 3.50
Group3 Min Range 3.30 , max Range 3.90
Item 1 value 3.40
Item 2 value 3.50
третий цикл (для третьей группы) приведет к удалению группы 3:
Group1 Min Range 3.10 , Max Range 3.50
Item 1 value 3.12
Item 2 value 3.25
Item 3 value 3.30
Item 4 value 3.30
Item 5 value 3.50
Item 6 value 3.40
Item 7 value 3.50