查找批号是否具有多个间隔的最快方法
Fastest way to find if a lot numbers are in multiple intervals
所以我有一个任务。我得到了 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((。
相关文章:
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- C++方法是否可以根据传递给构造函数的参数具有不同的返回类型?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- 矢量擦除方法是否需要类才能具有 = 运算符?
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- std::is_invocable 用于测试任意方法是否存在的语法(不仅是运算符())
- 这种获取模板参数包中最后一个元素的方法是否有隐藏的开销?
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- c++ 中的抽象方法是否曾经调用过?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 当元组给出参数时,如何检查方法是否存在?
- 如何测试基类中的方法是否已使用谷歌模拟调用和执行?
- 在方法中调用方法是否会导致开销
- 在移出向量上调用 size() 方法是否安全?
- 此工厂方法是否会导致争用条件?
- 这种方法是否对分支的预测产生了影响
- 检查启发式方法是否兼容
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- const 类方法是否阻止在类外部分配变量?