【问题标题】:Divide and conquer approach to find the minimum difference(absolute value) between two elem in array A[lo..hi]分而治之的方法来找到数组 A[lo..hi] 中两个元素之间的最小差异(绝对值)
【发布时间】:2021-01-31 13:20:36
【问题描述】:

输入一个包含 n 个实数的数组 A[lo..hi]。

要求:

  1. 不应使用排序算法。
  2. 复杂性: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 之间)?
  • “最小绝对差”是否意味着它们的绝对(即无符号)值的差异,例如-57 的最小绝对差是 2?还是12,不管你是比较-5 vs 7,还是7 vs -5
  • @Andreas 具有最小差异的元素(在您的示例中为 10 和 11)永远不会被分区分开。那是因为它们之间没有可以用作枢轴的数字。所以只有两种可能。它们中的任何一个都将被选为基准点,并与另一个进行比较。或者它们最终会出现在一个大小为 2 的子数组中,并且将计算它们的绝对差。根本不可能将它们放入单独的分区中。
  • 欢迎您! A[lo..hi] 是否暗示数组中的项目已排序?好吧,它们似乎是索引。请解释一下(我不知道您使用的是哪种编程语言)...也许您可以提供一些示例数据。

标签: algorithm


【解决方案1】:

更新 糟糕!我在想这个问题被标记为。 Java的TreeSet是一个内置的binary search tree(准确来说是Red-Black tree),所以其他语言中任何类似的数据结构都可以使用。

在 Java 中,使用 TreeSet 以及 lower(E e)higher(E e) 方法来查找之前看到的最接近的值。

由于每个输入值调用的3个方法(add()lower()higher())都是O(log n),所以结果是O(n登录 n).

“不应该使用排序算法”这样的人为限制,这个问题是一个测试或挑战,所以我将把实际的编码留给你。

【讨论】:

  • @trincot 问题中的“要求”列表并没有说它必须是“分而治之”,所以这只是 OP 使其成为 潜力 XY problem通过选择分而治之的方法。
  • 是的,我同意这是一个潜在的 XY 问题。我看不出分而治之如何有助于解决这个问题。也许我应该忽略问题的主题。
  • 我需要更详细地了解这个想法。看起来像快速排序,在最深的递归级别省略了交换。
猜你喜欢
  • 2014-07-26
  • 2018-03-10
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
相关资源
最近更新 更多