我的代码的这一部分意味着采用不规则形状的Tile
个物体轮廓,并通过创建环并减小环中瓷砖的高度值来循环,同时每次扩展环以包括那些在前一个戒指之外的瓷砖(这有意义吗?)。然而,我发现,我的性能大幅下降,每个循环都比之前的循环慢得多。为什么会这样?
我在想这可能是因为noobish oldEdge = theEdge;
和类似的行(两者都是向量,我将一个分配给另一个)。但即便如此,我也不了解巨大的性能下降。也许我做的事情显然很傻。有人可以让我直截了当吗?
请注意,oldEdge
,theEdge
和newEdge
都是vector<Tile*>
。
int decrease = 1;
while(decrease < 10)
{
cout << "Trying to smooth!\n";
//First, modify the new edge.
int newHeight = 70 - decrease;
cout << "Height at: " << newHeight << endl;
for(int i = 0; i < newEdge.size(); ++i)
{
newEdge[i]->SetHeight(newHeight);
}
//Increment decrease.
decrease += 1;
//Set the oldEdge and theEdge variables.
oldEdge = theEdge;
theEdge = newEdge;
newEdge.clear();
//Finally, find the new edge.
cout << "Finding new edge!\n";
for(int i = 0; i < theEdge.size(); ++i)
{
//cout << "Checking a tile's neighbors!\n";
for(int j = 0; j < theEdge[i]->m_AdjacentTiles.size(); ++j)
{
bool valid = true;
//Is this neighbor in theEdge?
//cout << "Is this neighbor in theEdge?\n";
for(int k = 0; k < theEdge.size(); ++k)
{
if(theEdge[i]->m_AdjacentTiles[j] == theEdge[k])
{
valid = false;
break;
}
}
//If not, is it in oldEdge?
if(valid)
{
//cout << "Is this neighbor in oldEdge?\n";
for(int k = 0; k < oldEdge.size(); ++k)
{
if(theEdge[i]->m_AdjacentTiles[j] == oldEdge[k])
{
valid = false;
break;
}
}
}
//If neither, it must be valid for continued expansion.
if(valid)
{
newEdge.push_back(theEdge[i]->m_AdjacentTiles[j]);
}
}
}
}
答案 0 :(得分:4)
我可以说,你的算法在边数和相邻图块的数量上是O(n^2 * m)
。最有可能只是一个小的增加导致渐近性能爆炸,你看到减速。如果对边缘容器进行了排序,则可以使用二进制搜索,或者如果您能够对它们进行哈希处理,那么这也是一种选择。
我对你尝试使用的算法不够熟悉,但如果你应该使用一种根本不同的方法,你可能想重温一下。
答案 1 :(得分:1)
这不是矢量,而是算法。
你有一个三次嵌套循环。放入一些调试语句,以找出每次循环经过的次数。