【发布时间】:2021-01-31 13:20:36
【问题描述】:
输入一个包含 n 个实数的数组 A[lo..hi]。
要求:
- 不应使用排序算法。
- 复杂性:
O(nlgn)
类似问题:Divide and Conquer to find maximum difference in an array
我的解决方案:
int minimum_diff (A[lo..hi])
{
int mid = (lo + hi) / 2;
int min_diff = Math.abs(A[mid+1] - A[lo]);
for (int i = lo; i <= mid; i++)
{
for (int j = mid + 1; j <= hi; j++)
{
if (Math.abs (A[j] - A[i]) < min_diff)
min_diff = Math.abs (A[j] - A[i]) ;
}
}
int left_min_diff = minimum_diff(A[lo..mid]);
int right_min_diff = minimum_diff(A[mid+1..hi);
return max(max(left_min_diff, right_min_diff), min_diff);
}
我的解决方案出了什么问题,我的解决方案的复杂性是 O(nlgn)?
(我认为我的解决方案的复杂度是 O(n^2) 所以这是错误的?)
【问题讨论】:
-
在计算主元和元素之间的差异时重复对数组进行分区。将大小为 2 的数组作为特例处理,这样您就可以声称您实际上并未对数组进行排序。
-
@user3386109 这将如何找到,例如输入
0, 10, 20, 30, 25, 11, 15, 5的最小差值为 1(在 10 和 11 之间)? -
“最小绝对差”是否意味着它们的绝对(即无符号)值的差异,例如
-5和7的最小绝对差是 2?还是12,不管你是比较-5vs7,还是7vs-5? -
@Andreas 具有最小差异的元素(在您的示例中为 10 和 11)永远不会被分区分开。那是因为它们之间没有可以用作枢轴的数字。所以只有两种可能。它们中的任何一个都将被选为基准点,并与另一个进行比较。或者它们最终会出现在一个大小为 2 的子数组中,并且将计算它们的绝对差。根本不可能将它们放入单独的分区中。
-
欢迎您!
A[lo..hi]是否暗示数组中的项目已排序?好吧,它们似乎是索引。请解释一下(我不知道您使用的是哪种编程语言)...也许您可以提供一些示例数据。
标签: algorithm