查找批号是否具有多个间隔的最快方法

Fastest way to find if a lot numbers are in multiple intervals

本文关键字:方法 是否 查找      更新时间:2023-10-16

所以我有一个任务。我得到了 n 个数字和 m 个区间,我需要弄清楚第 m 个区间中有多少个数字。我已经编写了一些复杂度为 O(n*m( 的代码,尽管我需要对其进行更多优化。有什么帮助吗?法典:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    cout.tie(0);
    int n,m,temp,temp1;
    vector <pair<int, int>> uogienes;
    vector <int> erskeciai;
cin >> n >> m;
for (int i = 0; i< n; i++){
    cin>>temp;
    erskeciai.push_back(temp);
}
temp = 0;
for (int i = 0; i<m; i++){
    cin>> temp >> temp1;
    uogienes.push_back(make_pair(temp, temp1));
}
for(int i = 0; i<m; i++){
        temp=0;
    for(int h = 0; h<n; h++){
       if(uogienes[i].first <= erskeciai[h] && uogienes[i].second >= erskeciai[h]){
        temp++;
        }
    }
cout  << temp << "n";
}
return 0;

}

正如DAle已经指出的那样。

您可以先对 n 个数字进行排序。一个好的算法,如合并或堆排序,会给你一个复杂的O(n*log(n((。

之后,您需要对每个间隔的"第一"和"第二"部分使用搜索算法。根据算法的不同,复杂度应该在 O(log(n(( - std::lower_bound 处理排序数据时具有 O(log(n(( 的复杂性,因此它足够好。或者对于所有间隔,这将是 O(m*log(n((。

比较搜索结果将为您提供每个间隔中的数字数量。

总的来说,你会有大约 O((m+n(*log(n((。