导航

算法优化:删除数组中部分项

Posted on 2012-03-05 21:35  jackycai  阅读(282)  评论(0)    收藏  举报

最近看代码的时候,看到这样一段代码:

for (i = 0; i < MAX_CHANNEL_NUM; i++)              // MAX_CHANNEL_NUM是所有通道的数目,通道号从0到(MAX_CHANNEL_NUM-1)
{
for (j = 0; j < chnum; j++) // channel是需要继续播放的通道数组,chnum是需要继续播放的通道数目
{
if (i == *(channel + j))
break;
}
if (chnum == j)
{
if (pShow_->GetShowState(i) != SHOW_STOP)
{
ret = pShow_->Stop(i);
if (ret < 0)
return -1;
}
}
}

这段代码的目的是停止所有通道中不需要继续播放的通道。初看这段代码就觉得存在重复遍历。

优化的时候最先想到,使j不必每次从0开始。如果此次存在需要继续播放的通道,则下次遍历从此次的j+1值开始。然而这里存在一个问题,channel数组里的通道号不一定由小到大顺序排列。

后来先想到《编程珠玑》里面的一个例子,使用bit map的方式,解决大量数据统计的问题。优化后代码如下:

int chanArray[MAX_CHANNEL_NUM] = {0};
for (int j = 0; j < chnum; j++)
{
chanArray[*(channel + j)] = 1;
}
for (int i = 0; i < MAX_CHANNEL_NUM; i++)
{
if (0 == chanArray[i])
{
if (pShow_->GetShowState(i) != SHOW_STOP)
{
ret = pShow_->Stop(i);
if (ret < 0)
return -1;
}
}
}