c++ - std::unordered_map::rehash() 函数可以减少哈希冲突吗?
问题描述
我遇到了一个算法问题,在 C++ 中使用 unordered_map 发生超时。
其他语言的哈希映射很好地解决了这个问题。
所以我尝试通过使用 rehash 函数来提高 unordered_map 的性能。我希望通过问题但失败了。
据我了解,rehash 函数会产生更多的桶,从而减少哈希冲突。
所以我的问题是 rehash 函数实际上可以减少碰撞。如果是这样,我可以得出结论,超时的根本原因在于该问题。
编辑============
问题是
[问题]
SUM 问题可以表述如下:给定四个整数值列表 A、B、C、D,计算有多少四元组 (a, b, c, d ) ∈ A x B x C x D 是这样的a + b + c + d = 0 。在下文中,我们假设所有列表具有相同的大小 n。
[输入格式] 输入
的第一行包含列表 n 的大小(这个值可以大到 4000)。然后我们有 n 行包含四个整数值(绝对值高达 228),它们分别属于 A、B、C 和 D。
和我的代码...
using namespace std;
#define SIZE 4000
int A[SIZE];
int B[SIZE];
int C[SIZE];
int D[SIZE];
int main(void){
int N;
scanf("%d", &N);
for(int i=0; i <N;i++){
scanf("%d %d %d %d", &A[i], &B[i], &C[i], &D[i]);
}
unordered_map<int, int> LeftMap; // store all result of A[i] + B[i]
//LeftMap.rehash(1000000);
unordered_map<int, int> RightMap; // store all result of C[i] + D[i]
unordered_map<int, int>::iterator iter;
unordered_map<int, int>::iterator iter2;
int k;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
k = A[i]+B[j];
iter = LeftMap.find(k);
if(iter == LeftMap.end())
LeftMap.insert({k, 1});
else
iter->second++;
k = C[i]+D[j];
iter = RightMap.find(k);
if(iter == RightMap.end())
RightMap.insert({k, 1});
else
iter->second++;
}
}
int sum =0;
for(iter = RightMap.begin(); iter != RightMap.end(); ++iter){
iter2 = LeftMap.find((iter->first)* -1);
if(iter2 != LeftMap.end()){
sum+= iter->second * iter2->second;
}
}
printf("%d", sum);
return 0;
}
解决方案
推荐阅读
- c++ - 差距算法代码有什么问题?(代码如下)
- javascript - CryptoJS AES 加密参数在解密时失败
- linux - 程序在 Linux 中找不到已安装的库
- python - 如何使用python识别头部(面部)运动(Open cv)
- javascript - 如何将当前滑块图像附加到 Wordpress 中的联系表单
- angular - 在 *ngFor 指令的 Node-RED 仪表板问题中
- security - ForceAuthn=true 对于服务提供商来说是个好主意吗
- regex - 重用分支重置组与所有备选方案不匹配
- mlt - mlt:使用无损编解码器的图像失真
- javascript - 数据表传递数组以呈现奇怪的结果