问题1)
我在c ++中有一个大的稀疏双向量向量,我需要有效地解析向量中非零元素的索引。我显然可以循环并完成它,有没有更好的方法呢?
答案 0 :(得分:3)
除非你对双打矢量的构成有一些特殊的了解(例如,它已经分类),否则整个循环就是最有效的。
当然,像eladidan所建议的结构变化可能是你应该考虑的事情。
答案 1 :(得分:2)
我在c ++中有一个大的稀疏双向量向量,我需要有效地解析向量中非零元素的索引。我显然可以循环并完成它,有没有更好的方法呢?
如果向量真的是稀疏的(n = o(N)
,其中n
是非零元素的数量而N
是向量的大小),那么在{{{}中表示它1}}或std::map<int,double>
可能是最好的。使用std::unordered_map<int,double>
方式,您可以在std::map
中找到元素。使用O(log(n))
时,查找操作的摊还时间为std::unordered_map
。在这两种情况下,非零元素的数量就是容器的大小。这两种方法也需要O(1)
空格而不是O(n)
。
答案 2 :(得分:0)
如果你不能change the representation of your data,你必须检查每个元素以过滤掉almost equal为零的元素。但是,此任务是embarrassingly parallel,因此您可以将工作负载分区为一堆线程,以至少改善运行时(尽管不是复杂性)。