这就是我想要做的:我有一个名为 merge() 的例程,它经常被调用。它的任务是合并称为“Block”的数据结构,其内容是由“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);
}
}
}
}