有没有办法优化这个功能?

时间:2014-01-06 00:35:46

标签: c++ optimization micro-optimization

这段代码在我的程序中似乎是最糟糕的犯罪者。我的程序试图找到满足具有两个约束的网络所需的最小数量的单个“节点”:

  1. 每个节点必须连接到x个其他节点
  2. 每个节点与它连接的每个节点之间必须有y度的分隔。
  3. 然而,对于x大于600的值,此任务需要很长时间,任务总是处于指数级别,所以我希望它在某个时刻永远需要,但这也意味着如果可以进行任何小的更改在这里它通过很多来加速整个程序。

    • uniint = unsigned long long int(64位)
    • network是vector<vector<uniint>>
    • 形式的向量

    这段代码:

    /* Checks if id2 is in id1's list of connections */
    inline bool CheckIfInList (uniint id1, uniint id2) 
    {
        uniint id1size = network[id1].size();
        for (uniint itr = 0; itr < id1size; ++itr)
        {
            if (network[id1][itr] == id2)
            {
                return true;
            }
        }
        return false;
    }
    

5 个答案:

答案 0 :(得分:2)

唯一的方法是在构建时对network[id1]数组进行排序。

如果您带着已排序的数组到达此处,您可以使用二分搜索轻松找到您要查找的内容。

答案 1 :(得分:0)

我猜测在循环中调用CheckIfInList()?也许矢量不是最佳选择,你可以试试vector<set<uniint>>。这将为您提供O(log n)以查找内部集合而不是O(n)

答案 2 :(得分:0)

使用std :: map或std :: unordered_map进行快速搜索。我猜MICRO优化这段代码是不可能的,std :: vector很酷。但不是600元素搜索。

答案 3 :(得分:0)

要进行快速微优化,请检查您的编译器是否优化了对network[id1]的多次调用。如果没有,那就是你花了很多时间的地方,所以请记住地址:

vector<uniint>& connectedNodes = network[id1];
uniint id1size = connectedNodes.size();
for (uniint itr = 0; itr < id1size; ++itr)
{
    if (connectedNodes[itr] == id2)
    {
        return true;
    }
}
return false;

如果您的编译器已经处理过这个问题,我担心您可以对此方法进行微观优化。唯一真正的优化可以在算法级别实现,从排序邻居列表开始,继续使用unordered_map<>而不是vector<>,最后问问自己是否不能以某种方式减少数量调用CheckIfInList()

答案 4 :(得分:0)

这不如HAL9000的建议有效,并且适用于有未排序列表/数组的情况。如果你把你想要的值放在向量的末尾,你可以做的就是在每次迭代中少问题。

uniint id1size = network[id1].size();
network[id1][id1size] = id2;
for (uniint itr = 0; network[id1][itr] == id2; ++itr);

//if itr != id1size return true else flase....

如果向量中的最后一个成员是你的id2,则需要添加检查。 这样,您无需每次都询问是否到达列表的末尾。

相关问题