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个数字。若第一步的数字相等,你们就把它加到两个候选者身上,然后你们就可以去掉其中一个。