【发布时间】:2017-02-26 03:40:25
【问题描述】:
好的,我正在尝试解决 C++ 中的2-SUM 问题。给定一个包含任意顺序的 1000000 个数字的文件,我需要确定是否存在总和为 t 的整数对,其中 t is each of [-10000, 10000]。所以这基本上是2-SUM 问题。
所以,我用 C++ 编写了我的解决方案,其中我使用 unordered_map 作为我的哈希表。我确保哈希表上的load 较低。但这仍然需要1hr 15mins 才能完成(成功)。现在,我想知道它是否应该那么慢。进一步降低负载因子并没有带来任何显着的性能提升。
我不知道在哪里可以优化代码。我尝试了不同的负载因子,没有帮助。这是来自 MOOC 的问题,人们已经能够使用相同的哈希表方法在大约 30 分钟内完成这项工作。任何人都可以帮助我更快地编写此代码。或者至少给出代码可能会变慢的提示。
这里是代码 -
#include <iostream>
#include <unordered_map>
#include <fstream>
int main(int argc, char *argv[]){
if(argc != 2){
std::cerr << "Usage: ./2sum <filename>" << std::endl;
exit(1);
}
std::ifstream input(argv[1]);
std::ofstream output("log.txt");
std::unordered_map<long, int> data_map;
data_map.max_load_factor(0.05);
long tmp;
while(input >> tmp){
data_map[tmp] += 1;
}
std::cerr << "input done!" << std::endl;
std::cerr << "load factor " << data_map.load_factor() << std::endl;
//debug print.
for(auto iter = data_map.begin(); iter != data_map.end(); ++iter){
output << iter->first << " " << iter->second << std::endl;
}
std::cerr << "debug print done!" << std::endl;
//solve
long ans = 0;
for(long i = -10000; i <= 10000; ++i){
//try to find a pair whose sum = i.
//debug print.
if(i % 100 == 0)
std::cerr << i << std::endl;
for(auto iter = data_map.begin(); iter != data_map.end(); ++iter){
long x = iter->first;
long y = i - x;
if(x == y)
continue;
auto search_y = data_map.find(y);
if(search_y != data_map.end()){
++ans;
break;
}
}
}
std::cout << ans << std::endl;
return 0;
}
【问题讨论】:
-
嗯,1M的数字范围是多少?
-
@thecoder 没有指定这样的范围。但它们很大——大约 10^11。
-
当您说:
t is each of [-10000, 10000]时,您的意思是“正好 +10000 或 -10000”还是“在[-10000, 10000]范围内”?请问两者中的哪一个。 -
t采用[-10000, 10000]范围内的所有值 -
我想我已经做到了最短时间。请检查我的答案中的代码,让我知道它在您的数据集上的表现。
标签: c++ hashtable unordered-map