【发布时间】:2015-11-26 19:59:52
【问题描述】:
目前,我正在尝试创建一个 2-SUM 算法,给定一组大约 100 万个整数,找到目标值的数量 t (-10,000 由集合中任意两个值 x,y 的总和形成。
我对 t 的单个值的 2-SUM 没有问题,只需使用哈希表并在表中查找每个哈希条目 x 如果存在另一个条目 t-x 。这将在O(N) 时间运行。
但是,现在我必须找到多个 t 值,从 -10000 到 10000。如果我只使用一个普通的 for 循环,那么现在运行时将是 O(N^2)。
我已经尝试过这段代码,它从 -10000 到 10000 对所有 t 进行暴力破解,但它运行速度太慢(大约 1 小时无法执行)。
所以,我的问题是,是否有任何提示可以更好地处理约 20,001 个目标,而无需暴力破解所有 20,001 个值?
这是我用于O(N^2) 解决方案的代码:
for(long long t = -10000; t <= 10000; t++)
{
for(unordered_set<long long>::iterator it=S.begin(); it != S.end(); ++it)
{
long long value = *it;
if((S.find(t-value) != S.end()) & (t-value != value))
{
values++;
//cout << "Found pair target " << t << " " << value << " " << t-value << '\n';
break;
}
}
}
【问题讨论】:
-
第 3 行中的
S是什么? -
are there any hints for better ways是的,确保您的数据集首先排序。 -
@user3437460 我试过使用有序的
set(cplusplus.com/reference/set/set) ,但它有一个对数 O(log N) 访问时间。你知道更好的哈希表吗? -
@erip S 是我使用的数据集(类似哈希表)。
-
@PatrickYu 如果允许您先对数据集进行排序,然后使用合并排序/快速排序等有效算法进行排序,即
O(n log n)。