我正在使用谷歌的哈希映射实现 谷歌:: dense_hash_map。
我是一个集群应用程序。所以我必须存储成对的簇之间的距离。每个集群都有一个簇ID,它是一个long int。所以密钥必须是(long int id1,long int id2);
所以我决定在hashMap中需要一个hashMap才能工作。
这是我的距离存储哈希映射的结构:
google::dense_hash_map<long int, google::dense_hash_map<long int, double> > distanceHash;
这是将距离插入哈希映射并检索它的代码
template<class Point>
void CoverTree<Point>:: insertDistance(long int id1, long int id2, long double distance)
{
//Always id1 < id2;
if(id1 < id2)
{
long temp = id1;
id1 = id2;
id2 = temp;
}
if(distanceHash.find(id1) == distanceHash.end())
{
google::dense_hash_map<long int, double> insideHash;
insideHash.set_empty_key(-9999 );
insideHash[id2] = distance;
distanceHash[id1] = insideHash;
}
else
{
(distanceHash[id1])[id2] = (distanceHash[id1])[id2];
}
}
template<class Point>
double CoverTree<Point>::getStoredDistance(long int id1, long int id2)
{
if(id1 < id2)
{
long temp = id1;
id1 = id2;
id2 = temp;
}
google::dense_hash_map<long int, double>::iterator it;
if(distanceHash.find(id1) != distanceHash.end())
{
if( distanceHash[id1].find(id2) != distanceHash[id1].end() )
return distanceHash[id1][id2];
}
return -1;
}
我有数百万的距离。 LasTime我检查过,大约有600亿个距离,其中4亿个是独一无二的。这意味着重复了1/3的距离并且可以节省时间。
但是当我使用这个哈希映射结构来存储距离时,程序的运行速度会慢一些。这就是我找到的: 如果我只使用距离函数存储距离,那么整个程序运行速度大约慢50秒。 (存储200秒,不存储150秒)。 但是,如果我存储距离然后使用散列图来检查距离是否存在,那么程序变得更慢(程序的1/25需要300秒)。
我不明白这种行为。我猜想一旦存储距离,检索距离应该更快。请告诉我这里有什么问题以及是否可以加快速度。
P.S:RAM不是问题。我在一台拥有大约160 GB内存的服务器上运行它。使用hashmap时的峰值内存消耗仅占总内存的1.8%(看到使用top)。因此,分页和颠簸应该不是问题。
答案 0 :(得分:0)
But If I store the distances and then use the hashmap to check whether the distances exist before computing them, the program becomes way way slower(1/25th of the program takes 300 seconds).
我怀疑您正在寻找批准数据的所有元素。
好的,hashmap查找时间复杂度为O(n),但您正在使用
distanceHash.find(id1)
在getStoredDistance
函数中两次n次,这使得最坏情况下的总复杂度为O(n * n)
400M * 400M = 160000000000000000太复杂