【发布时间】:2013-06-30 19:38:49
【问题描述】:
我需要针对向量比较函数在 C++ 中进行微优化的建议, 它比较两个向量是否相等,元素的顺序无关紧要。
template <class T>
static bool compareVectors(const vector<T> &a, const vector<T> &b)
{
int n = a.size();
std::vector<bool> free(n, true);
for (int i = 0; i < n; i++) {
bool matchFound = false;
for (int j = 0; j < n; j++) {
if (free[j] && a[i] == b[j]) {
matchFound = true;
free[j] = false;
break;
}
}
if (!matchFound) return false;
}
return true;
}
这个功能被大量使用,我正在考虑优化它的可能方法。 你能给我一些建议吗?顺便说一句,我使用 C++11。
谢谢
【问题讨论】:
-
如果输入向量的大小是编译时间常数,则潜力巨大。然后,使用 bitset 而不是
std::vector<bool>会更好。如果没有输入的编译时间常数大小,这甚至可以更有效。其他想法:i <= j还不够,您可以从 i 开始在 j 上循环吗? -
我完全不明白你的“免费”矢量的目的是什么。一个有点不相关的想法是,如果在输入此函数之前可以确保数组的顺序,您可能会提高一些效率。
-
@crowder 如果
b中有多个比较相等的元素,您必须为a中的每个元素找到一个对应的。free向量存储b中的一个元素是否已经与a中的一个元素相关联。 -
@user2381422 我知道你说元素的顺序无关紧要,但是可以对元素进行排序/排序吗? (即它们是否具有可比性?)如果是这样,您可以轻松地从
O(n²)转到O(n logn) -
不管你如何优化它,如果向量的大小不匹配是常见的,在开头添加
if (a.size() != b.size()) return false;可能会有所帮助。