【发布时间】:2012-06-11 13:21:15
【问题描述】:
我面临以下任务: 将无符号整数的三元组映射到一个值,该值为零或正数(双精度);并且能够为给定的三元组获得双倍或说它实际上为零;
我有以下简化: 第一个(我们称之为 I)和第二个(我们称之为 J)整数在已知范围内(从零到 IMAX 和 JMAX)。 对于第三个索引 (K),我知道三元组的估计值(第三个索引是分散的),比如 ESTIMATE; 在计算三元组增长的数量时,更准确地说,对于给定的 I 和 K,第三个指数的数量可以增加。
到目前为止,我看到了以下解决方案:
保持地图向量的向量:
vector< vector < map <unsinged int, unsigned int>>> tri_map_;
//^I ^J ^K ^index
如果'index'不为零,则从补充向量中获取值:
vector< double> values;
values[index];
整个东西被初始化为:
tri_map_.resize(IMAX);
for (int i=0;i<IMAX;++i) tri_map_[i].resize(JMAX);
您如何看待该解决方案?有没有更好的方法?
我不喜欢的是,我似乎不能为 地图。有没有办法尝试分配足够的内存(因为我估计了第三个索引)并检查是否有足够的内存?除此之外我很满意。
编辑1: IMAX ~ 数百 JMAX ~ 10^5
编辑2:
试图合并 sehe 的解决方案,但是对于
unordered_set 和对;
所以,这就是我遇到问题的地方specialization of ‘template<class _Tp> struct std::tr1::hash’ in different namespace:
...
EDIT3:以下作品,将调查它的速度。
谢谢大家的建议和建议!
#include <tr1/functional>
#include <vector>
#include <map>
#include <tr1/unordered_set>
#include <list>
#include <set>
#include <tr1/array>
#include <iostream>
struct pair_int {
unsigned int first;
unsigned int second;
bool operator< (pair_int const& o) const {
if ( first < o.first )
return true;
if ( first > o.first )
return false;
return second < o.second;
}
bool operator==(pair_int const& o) const {
return ( (first==o.first)&&(second==o.second) );
}
};
namespace std {
namespace tr1 {
template<> struct hash<pair_int> {
unsigned int operator()(pair_int const& key) const {
return ~key.first + 17u*key.second;
}
};
}
}
class pair_storage {
public:
pair_storage() {};
~pair_storage();
....
private:
pair_int pair_ij_;
std::map<pair_int,double>::iterator pairMapIterator_;
std::vector< std::map<pair_int,double> > pairMapVector_;
std::vector< std::tr1::unordered_set< pair_int > > pairMapVectorZero_;
};
无法使用-std=c++0x 编译它,因为我在大代码的某些部分有一些问题...
【问题讨论】:
-
unsigned int的三元组通常有 93 个有效位,而非负的double只有 63 位。因此,即使您最好的地图也将是多值的。这是想要的吗? -
由于 IMAX 和 JMAX 是事先已知的,请考虑使用具有派生索引的单个向量(例如 idx = i * JMAX + j)
-
你的地图有什么要求?满足您所说的最简单的方法是将所有三元组映射为零。
-
@Walter 抱歉,我不明白你所说的“即使你最好的地图也是多值的”是什么意思
-
@alexm 感谢您的建议。完全同意
标签: c++ optimization map