【问题标题】:Finding largest difference between two elements in array using at most 3/2n comparisons [duplicate]使用最多 3/2n 比较找到数组中两个元素之间的最大差异[重复]
【发布时间】:2023-03-06 19:52:01
【问题描述】:

我正在处理一个带有整数元素的未排序数组,

A={a_1,a_2,...,a_n}

找到数组中两个元素之间的最大差异(max|a_i-a_j|)在最坏的情况下最多使用3/2n比较。(运行时间无关紧要,我们不能使用诸如最大值或最小值之类的操作)。

我真的怀疑这是否可能:要找到两个元素的最大差异,在最坏的情况下,我们不应该总是需要大约 2n 比较,因为我们需要使用大约 n 个比较来找到最大的元素数组和另一个 n 比较以找到数组的最小元素?我不知道在哪里可以削减操作。

我也考虑过分而治之。假设我将这个数组分成 2 个长度为 n/2 的子数组,但后来我遇到了同样的问题,因为在每个子数组中找到最大值和最小值,需要进行大约 n 比较,所以总共会有 2n 比较。

非常感谢您提供有关如何执行此操作的提示。

【问题讨论】:

  • 这些元素的本质是什么?允许哪些操作?
  • @AndrewVershinin 抱歉,我将编辑问题以澄清。
  • @maraca 是的,这就是我想要找到的
  • cppreference 提出了一个实现std::minmax_element 的示例,其复杂度为3/2 n。基本思想是通过 2 个元素处理 2 个元素。
  • 诀窍是进行成对比较。较低的进入最小候选者,较高的进入最大候选者。然后你重复这个过程。例如。要获得最小值,您可以成对比较候选人并删除所有较高的候选人,直到剩下 1 个数字。如果第一步的数字相等,则将其添加到两个候选人中,然后您可以删除其中一个。

标签: algorithm max


【解决方案1】:

cppreference 提出了一个实现std::minmax_element 的示例,复杂度为 3/2 n。基本思想是用 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/2 n)

注意:n 中为奇数,最后一个元素必须单独考虑。

【讨论】:

    【解决方案2】:

    很简单,找到最大差异等于找到数组元素的最小值和最大值。另一方面,您可以find the minimum and the maximum of an array simultaneously with 3n/2 comparison(所有常用编程语言中的第三种方法,即C#、C++、Python、C和Java):

    如果 n 是奇数,则将 min 和 max 初始化为第一个元素。

    如果 n 为偶数,则将 min 和 max 分别初始化为前两个元素的最小值和最大值。

    对于其余元素,成对挑选它们并比较它们 最大值和最小值分别为最大值和最小值。

    比较总数:偶数和奇数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
    

    【讨论】:

      猜你喜欢
      • 2013-03-27
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多