在我的项目中,我有一个带有一些关系数据的向量(一个包含两个相似对象的结构,表示它们之间的关系),我需要检查向量中所有数据之间的关系组合。
我正在做的是迭代向量并在第一个for循环内部我再次迭代以寻找数据之间的关系。
这是我正在做的事情的简化模型
for(a=0; a<vec.size(); a++)
{
for(b=0; b<vec.size(); b++)
{
if(vec[a].something==vec[b].something) {...}
}
}
我的收藏有2800个元素,这意味着我将迭代2800 * 2800次......
哪种数据结构更适合这种操作? 使用for_each会更快,然后像这样遍历矢量吗?
提前致谢!
vec有两个结构,由两个整数组成,没有任何顺序。
答案 0 :(得分:4)
不,for_each仍然做同样的事情。
使用哈希映射可以使您的问题更好。从空哈希开始并遍历列表。对于每个元素,请查看它是否在哈希中。如果不是,请添加它。如果是,那么你有一个副本,你运行你的代码。
在C ++中,您可以使用std :: map。在C中,没有内置的地图数据结构,因此您必须自己制作。
高级伪代码看起来像这样
foreach (element in array)
if map.has_key(element)
do_stuff(element)
else
map.add_key(element)
答案 1 :(得分:2)
提高此操作效率的最简单方法是对矢量进行排序,然后查找重复项。如果排序向量不是一个选项,您可以创建另一个指向该向量元素的指针向量并对其进行排序。这两个将带您从N ** 2复杂度到N * log(N)复杂度(当然,假设您使用N * log(N)排序)。这确实意味着使用更多空间,但通常使用一点空间来显着改善时间是非常合理的。
答案 2 :(得分:0)
假设您的向量包含“关系”结构,如:
class Entity;
struct Relation {
Entity* something;
Entity* relative;
};
你有一个“关系”的载体:
std::vector<Relation> ties;
因此,如果我理解正确,您希望对关系进行细分,并为每个实体提供关系列表。这可以用地图表示:
std::map<Entity*,std::vector<Relation*>> entityTiesIndex;
然后你可以通过所有联系扫描一次并收集每个实体的关系:
for (int i=0; i < ties.size(); ++i ) {
Relation* relation = &ties[i];
entityTiesIndex[relation->something].push_back(relation);
}
请注意关于对容器元素的引用的通常免责声明,因为当容器被更改时这些可能会发生变化。
希望这是有道理的。