我有两个list<int>
(s)(都已排序)
list<int> first; // length > 24 000 elements
list<int> second; // length > 3 000 000 elements
我需要获取first
列表的所有元素,以使first
列表中的元素在second
列表中的元素的30之内。
例如:
first = [1,67,1111,10668]
second = [25, 90, 1000, 1004]
output:
1, 67.
我用c ++编写了这段代码,但是当second
(s)长度超过10 000时代码很慢。
int key = 0;
for (std::list<int>::const_iterator iterator = first.begin(), end = first.end(); iterator != end; ++iterator)
{
key = *iterator;
for (int j=key;j<key+30;j++)
{
std::list<int>::iterator it = std::find(second.begin(), second.end(), j);
if ( it != second.end() )
{
//print
}
}
}
如何优化此代码以更快地搜索元素? 谢谢。
答案 0 :(得分:0)
你可以用线性复杂度la std::merge
:
void foo(const std::list<int>& first, const std::list<int>& second, const int limit)
{
auto it1 = first.begin();
auto it2 = second.begin();
while (it1 != first.end() && it2 != second.end()) {
if (*it1 + limit < *it2) {
++it1;
} else if (*it2 + limit < *it1) {
++it2;
} else {
std::cout << *it1 << std::endl;
++it1;
}
}
}