C++ 为什么是c++;算法包括最多2*(count1+;count2)-1个比较

C++ 为什么是c++;算法包括最多2*(count1+;count2)-1个比较,c++,algorithm,C++,Algorithm,在阅读一篇文章时,我注意到上面写着: 在两个范围内的两倍距离内最多线性:执行最多2*(count1+count2)-1比较(其中countX是firstX和lastX之间的距离) 然而,缔约国: 最多2个·(N1+N2-1)比较,其中N1=std::distance(first1,last1)和N2=std::distance(first2,last2) 根据定义,N1==Count1和N2==Count2,哪个站点是正确的,谁能解释这个最大数量或比较是如何计算的,即: 定义这种最大复杂性的最坏

在阅读一篇文章时,我注意到上面写着:

在两个范围内的两倍距离内最多线性:执行最多
2*(count1+count2)-1
比较(其中countX是firstX和lastX之间的距离)

然而,缔约国:

最多2个·(N1+N2-1)比较,其中N1=std::distance(first1,last1)和N2=std::distance(first2,last2)

根据定义,N1==Count1和N2==Count2,哪个站点是正确的,谁能解释这个最大数量或比较是如何计算的,即:

  • 定义这种最大复杂性的最坏情况是什么
  • 是否有人可以解释该场景中的步骤,并显示上面哪一个(cplusplus或cppreference)具有正确的比较次数

  • 警告:在每个读过帖子的人(包括我)意识到他们不知道自己在说什么之前,这个答案上的名声就被增加了。如果在将来的某个时候有一个被接受的答案,它与关于该算法的所有文档都不一致,请更加注意

    简言之: 2*(无论什么)位很容易解释,我在下面已经解释过了。这(无论什么)一点让我完全困惑,就我所知,它应该是这样的

    2*(count1)
    
    2*(N1)
    
    绝对与第二个范围的长度无关。要么我遗漏了什么(很可能),要么文档有误(这不是很好吗…)

    如果你想了解我的推理,请参见下文。如果我错了,有人有正确的答案,让我知道,这样我可以删除这篇文章

    为什么是2*(count1等) 如果你问为什么它是2次(count1+count2)-1,关键是这一行:

    对于第一个版本,使用运算符<对元素进行比较;对于第二个版本,使用comp对元素进行比较。如果(!(a 每次它比较两个元素,它就做两个比较:我不等于它,它不等于我

    它要做的这些“比较对”的最大数量是非常难以确定的。事实上,我想不出来。据我所知,它应该与第二范围的长度无关

    为什么不是(count1+count2-1)或(count1+count2-1) 我已经看了好几天了,并且根据中的代码示例做了一些测试,我真的不知道这是怎么回事

    算法意味着,OP挖掘的一个来源说range2必须是range1的子集,并且两者都已排序,因此没有必要对元素进行两次检查。这意味着算法必须最多检查range1中的所有元素,如果range2中的元素大于range1中的任何元素,还需要额外检查一次。不仅如此,在range2中有2个或20个元素的位置并不重要,它仍然进行完全相同数量的比较

    比较有两种可能的定义,它们显然会给出不同的答案:

    比较==算法中的所有比较操作 在这种情况下,将进行以下比较:

  • 我到达最后一个range2元素了吗
  • 我到达最后一个range1元素了吗
  • 范围2元素是否小于范围1元素
  • 是范围2元素>范围1元素
  • 在简单的情况N1==N2==1中,这可能会生成至少6个比较(例如,1,2,3,4,1,2:where range1={1}和range2={10}),这远远超出了两种算法的允许范围。所以不可能是这样

    比较==检查elem1和elem2是否相等 在本例中,range1的每个元素都有两个比较,直到它找到range2的所有元素,或者它到达range1的末尾并停止(在发现它已经到达range1的末尾时)

    因此,据我所知,复杂性与N2的长度无关,复杂性应该是

    2*(count1)
    
    2*(N1)
    
    请注意,对于“比较”的定义,2*(N1+N2-1)似乎仅适用于N2==1,2*(N1+N2)-1从不适用,因为在非最大复杂度情况下比较的数量仅为奇数(range2具有不在range1中且不大于max(range1))的数字)

    对比较的任何其他定义都是选择性的。我能想到的另一件事是编译器优化了某些步骤,比如当元素没有增加时,不检查它是否再次达到范围2的末尾(这也会使算法根据需要依赖于N2),但我看不到任何其他的东西,它可以优化出来,以使数字下降到某个东西,符合或声明的复杂性完全


    …还有谁有更好的答案吗?我现在和OP一样对此感到好奇。

    警告:在每个读过帖子的人意识到他们不知道自己在说什么(包括我)之前,这个答案上的名声就被增加了。如果在将来的某个时候有一个被接受的答案,它与关于该算法的所有文档都不一致,请更加注意

    简言之: 2*(无论什么)位很容易解释,我在下面已经解释过了。这(无论什么)一点让我完全困惑,就我所知,它应该是这样的

    2*(count1)
    
    2*(N1)
    
    绝对与第二个范围的长度无关。要么我遗漏了什么(很可能),要么文档有误(这不是很好吗…)

    如果你想了解我的推理,请参见下文。如果我错了,有人有正确的答案,让我知道,这样我可以删除这篇文章

    为什么是2*(count1等) 如果你问为什么它是2次(count1+count2)-1,关键是这一行:

    对于第一个版本,使用运算符<对元素进行比较;对于第二个版本,使用comp对元素进行比较。如果(!(a