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
在这里对您没有帮助。