有没有办法优化此功能

Is there any way of optimising this function?

本文关键字:功能 优化 有没有      更新时间:2023-10-16

就时间而言,这段代码似乎是我程序中最严重的违规者。我的程序试图做的是找到满足具有两个约束的网络所需的最小数量的单个"节点":

  1. 每个节点必须连接到 x 个其他节点
  2. 每个节点与其连接到的每个节点之间必须有 y 个分离度。

然而,对于 x 大于 600 的值,这个任务需要很长时间,无论如何,这个任务都是指数级的,所以我希望它在某个时候需要很长时间,但这也意味着如果可以在这里进行任何小的更改,它将大大加快整个程序的速度。

  • uniint = 无符号长整整(64 位)
  • 网络是形式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;
}

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

如果你带着一个排序的数组来到这里,你可以很容易地找到,如果存在,你正在寻找的东西,使用二分搜索。

使用 std::

map 或 std::unordered_map 进行快速搜索。我想不可能对这段代码进行微优化,std::vector 很酷。但不适用于 600 元素搜索。

我猜CheckIfInList()是在循环中调用的?也许向量不是最佳选择,您可以尝试vector<set<uniint>>.这将给你 O(log n) 来查找内部集合而不是 O(n)

为了快速进行微优化,请检查编译器是否优化了多个调用以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()的调用次数。

这不如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。这样,您就不需要每次都询问是否到达列表的末尾。