如何快速搜索列表中的元素

时间:2017-07-31 19:34:44

标签: c++ list

我有两个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
                }
            }
        }

如何优化此代码以更快地搜索元素? 谢谢。

1 个答案:

答案 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;
        }
    }
}