Algorithm 使用最多3/2n比较查找数组中两个元素之间的最大差异
我正在处理一个包含整数元素的未排序数组Algorithm 使用最多3/2n比较查找数组中两个元素之间的最大差异,algorithm,max,Algorithm,Max,我正在处理一个包含整数元素的未排序数组 A={a_1,a_2,...,a_n} 查找数组中两个元素之间的最大差异(max | a|i-a|j |),在最坏的情况下最多使用3/2n比较。(运行时间无关紧要,我们不能使用max或min等操作) 我真的怀疑这是否可能:要找到两个元素的最大差异,在最坏的情况下,我们不应该总是需要大约2n比较,因为我们需要使用大约n个比较来找到数组中最大的元素,再使用n个比较来找到数组中最小的元素吗?我不知道在哪里可以停止手术 我也考虑过分而治之。假设我将这个数组分成两
A={a_1,a_2,...,a_n}
查找数组中两个元素之间的最大差异(max | a|i-a|j |)
,在最坏的情况下最多使用3/2n
比较。(运行时间无关紧要,我们不能使用max或min等操作)
我真的怀疑这是否可能:要找到两个元素的最大差异,在最坏的情况下,我们不应该总是需要大约2n
比较,因为我们需要使用大约n个比较来找到数组中最大的元素,再使用n个比较来找到数组中最小的元素吗?我不知道在哪里可以停止手术
我也考虑过分而治之。假设我将这个数组分成两个子数组,长度为n/2
,但是我遇到了相同的问题,因为在每个子数组中查找最大值和最小值,进行大约n
比较,所以总共会有2n
比较
对于如何做到这一点的提示,我们将不胜感激。很容易说明,找到最大差异等于找到数组元素的最小值和最大值。另一方面,可以(所有的通用编程语言中的第三种方法,即C++、C++、Python、C和java): 如果n为奇数,则将min和max初始化为第一个元素 若n为偶数,则分别将最小值和最大值初始化为前两个元素的最小值和最大值 对于其余的元素,成对地选取它们并比较它们的属性 最大值和最小值分别为最大值和最小值 比较总数:偶数和奇数n不同,见下表:
If n is odd: 3*(n-1)/2
If n is even: 1 Initial comparison for initializing min and max,
and 3(n-2)/2 comparisons for rest of the elements
= 1 + 3*(n-2)/2 = 3n/2 -2
cppreference提出了一个复杂度为3/2N的实现示例。其基本思想是通过2个元素处理2个元素
If A[i+1] > A[i]
A[i+1] is compared with Max
A[i] is compared with Min
Else
A[i] is compared with Max
A[i+1] is compared with Min
考虑了2个要素,3个比较->复杂性O(3/2n)
注:在
n
中,最后一个元素必须单独考虑。这些元素的性质是什么?什么操作是允许的?@AndrewVershinin抱歉,我将编辑问题以澄清。@maraca是的,这就是我试图找到的。参考提出了一个复杂度为3/2N
的实现示例。基本思想是用2个元素处理2个元素。诀窍是进行成对比较。较低的为最小候选,较高的为最大候选。然后你重复这个过程。例如,为了得到最小值,你将两个候选项进行比较,并删除所有较高的候选项,直到剩下1个数字。若第一步的数字相等,你们就把它加到两个候选者身上,然后你们就可以去掉其中一个。