有效地合并相邻块

时间:2012-05-11 11:58:44

标签: arrays algorithm data-structures merge theory

这就是我想要做的:    我有一个名为merge()的例程,它经常被调用。它的任务是合并称为“块”的数据结构,其内容是由“s_idx”和“e_idx”表示的整数范围,分别表示起始索引和结束索引。相邻块是块,其范围可以组合成新的连续范围。例如,具有范围(25,32)的块3和具有范围(33,40)的块4是相邻的,因此它们的范围可以组合以产生新的连续范围(25,40)。所以最后,只剩下一个块,将所有单独的块组合起来产生范围(0,N-1),其中N是块的总数。

我的问题是:有没有有效的算法来执行这样的操作?

当前实现使用O(N ^ 2)算法,随着块数的增加,该算法会显着减慢。

for( int i=0 ; i<_merge_list.max()-1 ; i++ )
    {
        for( int j=i+1 ; j<_merge_list.max() ; j++ )
        {
            if( _merge_list.exist(i) && _merge_list.exist(j) )
            {
                if( _merge_list[i]->get_end_idx() + 1 ==    _merge_list[j]->get_start_idx() )
                {
                    _merge_list[i]->set_end_idx( _merge_list[j]->get_end_idx() );
                    _merge_list[i]->set_link( _merge_list[j]->get_block_idx() );


                                    perform(_merge_list[i]);

                    _merge_list.remove(j);          
                }
            }
        }

    }   

1 个答案:

答案 0 :(得分:1)

您的所有街区都被保证是连续的吗?如果是这种情况,在O(N)时间内找到min,max索引应该是微不足道的,然后创建一个最后一个块,否则你可以先对块进行排序然后合并O(NlogN)+ O(N)= O(NlogN)< / p>

如果以排序方式维护块,则合并块只需要O(N)时间。如果你同时拥有它们,那么首先排序块数组,然后合并。如果你逐渐得到它们,你就会以维持排序顺序的方式合并到块数组中。