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,哪个站点是正确的,谁能解释这个最大数量或比较是如何计算的,即:
警告:在每个读过帖子的人(包括我)意识到他们不知道自己在说什么之前,这个答案上的名声就被增加了。如果在将来的某个时候有一个被接受的答案,它与关于该算法的所有文档都不一致,请更加注意 简言之: 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个元素的位置并不重要,它仍然进行完全相同数量的比较
比较有两种可能的定义,它们显然会给出不同的答案:
比较==算法中的所有比较操作
在这种情况下,将进行以下比较:
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