【发布时间】:2014-09-01 18:37:53
【问题描述】:
我有大约 20,000,000 个 pair<int, int> 需要关联到 ints。我用unordered_map<pair<int, int>, int> 这样做了。分析我的算法表明检查条目是否存在
bool exists = myMap[make_pair(a, b)] != NULL
是性能瓶颈。我认为从unordered_map 检索这些信息会非常快,因为它是 O(1)。但是如果常数很大,常数时间可能会很慢......
我的哈希函数是
template <>
struct tr1::hash<pair<int, int> > {
public:
size_t operator()(pair<int, int> x) const throw() {
size_t h = x.first * 1 + x.second * 100000;
return h;
}
};
你知道我的问题有什么更好的数据结构吗?
显然我不能只将信息存储在矩阵中,因此内存量不适合现有的任何计算机。我所知道的分布是myMap[make_pair(a, a)] 不存在任何a。并且所有ints 都在从 0 到大约 20,000,000 的连续范围内。
将其视为一个稀疏的 20,000,000x20,000,000 矩阵,其中包含大约 20,000,000 个条目,但从不在主对角线上。
建议
vector<pair<int, int>>*(具有 N 个条目的数组)是否会更快? a 的查找将是微不足道的(只是数组的索引),然后我将遍历该向量,将该对的 first 值与 b 进行比较。
大更新
我上传了raw data,这样你就可以看到结构了。
【问题讨论】:
-
对中的整数必须是可检索的吗?还是可以创建两个地图?
umap<some_key, int>和umap<some_key, pair<>>? -
请注意,
myMap[make_pair(a, b)] != NULL不会像您认为的那样做。如果它不存在,它会插入该对,并将映射的值与0(这是NULL扩展的内容)进行比较。它根本不检查是否存在。在现代 C++ 中,你永远不应该使用NULL。 -
我们需要了解您的算法才能找到更好的数据结构。也许你只需要一个二维数组,但也许你需要别的东西。
-
如果您对数据分布有所了解,您可以提供自己的哈希函数,以尽可能减少冲突。
-
@a_guest
std::unordered_map是哈希图,而不是树。那是std::map。
标签: c++ performance algorithm map unordered-map