c ++稀疏向量

时间:2013-02-17 17:44:05

标签: c++ vector operations

问题1)

我在c ++中有一个大的稀疏双向量向量,我需要有效地解析向量中非零元素的索引。我显然可以循环并完成它,有没有更好的方法呢?

3 个答案:

答案 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,因此您可以将工作负载分区为一堆线程,以至少改善运行时(尽管不是复杂性)。