算法std::includes
接受两个已排序的范围,并检查set2是否在set1中(即set2的每个元素是否包含在set1中)?
我想知道为什么eel.is/c++draft说这个算法的复杂度最多是2·(N1+N2-1)
次比较?
同样地,
1. cppreference
2. cplusplus
对此也有相同的陈述。
我认为它应该最多只需要2·N1
次比较,在max(set2) >= max(set1)
时达到最坏情况。
算法std::includes
接受两个已排序的范围,并检查set2是否在set1中(即set2的每个元素是否包含在set1中)?
我想知道为什么eel.is/c++draft说这个算法的复杂度最多是2·(N1+N2-1)
次比较?
同样地,
1. cppreference
2. cplusplus
对此也有相同的陈述。
我认为它应该最多只需要2·N1
次比较,在max(set2) >= max(set1)
时达到最坏情况。
2 < 3
就会提前退出。first1
,当first1 == last1
时返回结果,每次迭代最多执行2次比较,并且不包含嵌套循环。我不认为这种方法会执行超过2xN1
次比较。first1 == last1
,算法将返回false。实际上,在每种情况下,当N1 < N2
时,它将在N1
次迭代后返回false。 - MrPisarikstd::includes
返回true,第一个范围需要包含与第二个范围相同数量的副本。 - Matt Hellige∀a∈S2,a∈S1
,即使|S2| > |S1|
也可以成立,因为S1和S2不是集合,而是具有潜在重复元素的范围。 - Justinstd::includes
的意图感到困惑。但最终同意,在澄清规范后应重新审视函数的复杂性:
复杂性要求与当前描述一致,并且如果/当描述被修复以实际描述算法“应该”做什么时,应进行修复。看起来LWG已经在处理此事。当规范被修复后,我将回复那个lib线程,请求重新审视复杂度。