C++ 改进的特定排序序列的交集

C++ 改进的特定排序序列的交集,c++,algorithm,c++11,stl,C++,Algorithm,C++11,Stl,我需要执行两个有序序列的交集[begin1,end1),[begin2,end2)。在查看可能的实现部分后,显然决定使用not是个好主意 我不喜欢这一点的原因是我的序列非常大(最多1e6项),我不知道是哪一项。以下代码行: while (first1 != last1 && first2 != last2) { ... 意味着交叉点可能会在整个序列上运行。 因此,我的问题是: STL优化版本中是否有可以利用std::lower_bound的思想,将全扫描减少到M+O(ln N)

我需要执行两个有序序列的交集
[begin1,end1)
[begin2,end2)
。在查看可能的实现部分后,显然决定使用not是个好主意 我不喜欢这一点的原因是我的序列非常大(最多1e6项),我不知道是哪一项。以下代码行:

while (first1 != last1 && first2 != last2) { ...
意味着交叉点可能会在整个序列上运行。 因此,我的问题是:


STL优化版本中是否有可以利用
std::lower_bound
的思想,将全扫描减少到
M+O(ln N)

您认为可以得到低于
N log N
的值吗?您仍然需要对其中一个输入执行线性扫描,或者您不知道在另一个输入中搜索的是什么。如果它们的大小非常不同,我想迭代较短的可能会有所帮助。您不能先调度
.size()
两个序列,然后将较小序列的
.front()
传递到
std::lower_bound
以将开始迭代器放入较大序列中,然后将较小序列的
.begin()
/
end()
与此开始迭代器和
.end()一起使用
使用
std::set_intersection
?可能的实现结果大小可能是
Min(N,M)
,因此您不能希望形成对数时间。使用
merge
方法可以实现线性时间(可能的实现利用它),如果您只有前向迭代器,那么您将(可能)必须遍历整个序列。
lower\u bound
在这方面对您没有帮助。您认为您可以得到低于
N log N
的值吗?您仍然需要对其中一个输入执行线性扫描,或者您不知道在另一个输入中搜索什么。如果它们的大小非常不同,我想,迭代较短的输入可能会有所帮助。难道你不能先分派两个序列的
.size()
,然后将较小序列的
.front()
传递到
std::lower_bound
以获得一个开始迭代器到较大序列中,然后将较小序列的
.begin()
结束()与此开始迭代器和
.end()一起使用吗
使用
std::set_intersection
?可能的实现结果大小可能是
Min(N,M)
,因此您不能希望形成对数时间。使用
merge
方法可以实现线性时间(可能的实现利用它),如果您只有前向迭代器,那么您将(可能)必须遍历整个序列。
lower\u bound
在这里对您没有帮助。