有没有办法优化此功能
Is there any way of optimising this function?
就时间而言,这段代码似乎是我程序中最严重的违规者。我的程序试图做的是找到满足具有两个约束的网络所需的最小数量的单个"节点":
- 每个节点必须连接到 x 个其他节点
- 每个节点与其连接到的每个节点之间必须有 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]
数组时对其进行排序。
如果你带着一个排序的数组来到这里,你可以很容易地找到,如果存在,你正在寻找的东西,使用二分搜索。
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。这样,您就不需要每次都询问是否到达列表的末尾。
- 具有小对象优化功能的智能指针
- C++分离功能,实现性能优化
- 结合Python和C 或Cython,以优化功能;最大似然示例;对C 的了解很少
- 优化调用一系列功能指针
- 尾部调用优化是否适用于此功能?
- 虚拟功能编译器优化C
- [[GNU :: pure]]功能属性和线程的优化问题
- 由于Memcpy的问题,无法使用VS进行优化;被视为固有功能
- 有没有办法优化这个功能
- C++ - Xcode "Inline Function Expansion"像Visual Studio中的优化功能一样?
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 编译器可以优化多个相同功能调用吗?
- 如何在gcc中设置模板功能的自动优化代码
- 为什么优化会扼杀这个功能
- 有没有办法优化此功能
- 优化反转词,同时大写空格后词功能
- 优化功能
- 模板与常规功能的优化:引擎盖下发生了什么?
- 内联组件 (__asm) 块是否会阻止功能优化
- 如何优化 SIMD 转置功能 (8x4 => 4x8)?