【发布时间】: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 个数字。如果第一步的数字相等,则将其添加到两个候选人中,然后您可以删除其中一个。