合并两组

时间:2019-05-03 14:19:23

标签: algorithm c++11 data-structures

我有很多组,每个组都有适合的最小范围和最大范围。这些范围在不同组之间是重叠的

例如

    Group1  Min Range 3.125 , Max Range 3.5
    Group2  Min Range 3.25 , max Range 3.75
    Group 3 Min Range 3.5, max range 4.0

我需要合并这些组以形成最小数量的组。

喜欢

Group1  Min Range 3.125 , Max Range 3.5
              Item 1 value 3.125
              Item 2 value 3.3
              Item 3 value 3.5

Group2  Min Range 3.25 , max Range 3.75
              Item 1 value 3.25
              Item 2 value 3.3

我可以将这两个组合并到Group1中。

这就是我正在做的

for( size_t TopIndex = 0; TopIndex < GroupVector.Size(); TopIndex++)
{
    Group& CurrentGroup = GroupVector[TopIndex];
    for( size_t InnerIndex = TopIndex +1; InnerIndex < GroupVector.Size(); InnerIndex++)
    {
        Group& InnerGroup  = GroupVector[InnerIndex];
        MergeGroup(CurrentGroup,InnerGroup);
    }
}

在MergeGroup中,

1.  Move items from Group 1 to Group 2 , Save total number of group after merge (I will stop if number of group is 1)
2.  Move items from Group 2 to Group 1 , Save total number of group after merge
3.  Compare number of group form step 1 &2  and accept an option which results in less number of groups.

我要合并的组数量很大,我正在尝试寻找是否有更好的方法可以做到这一点。

1 个答案:

答案 0 :(得分:0)

可以执行多种算法来执行所需的操作。 就个人而言,我将首先通过检查最小和最大范围来检查一个组是否可以被其他组“吸收”。

示例:

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