在多个组中找到最相似元素的算法

计算科学 算法
2021-12-22 19:17:56

我想找到一种可以解决以下问题的算法:

考虑 4 组数字:

  • 第 1 组:[10、100、1000],
  • 第 2 组:[101、15、2000],
  • 第 3 组:[20、1500、100],
  • 第 4 组:[150、3000、13]。

我需要从每组中选择一个数字,以便四个选定数字的最大值和最小值之间的差异在所有可能的组合中最小。

在此示例中,数字 10、15、20、13 给出了差异 10,它是最小的。上述问题的答案是 10、15、20、13。

我想知道是否有一种算法可以解决这个问题,并且对于大量组和每个组中的条目数量也相对较好。

编辑:@aurelian-tutuianu 提出了一种复杂度为的算法,该算法涉及对每个组进行排序。我想知道如果不可能对这些组进行排序,那么最好的算法是什么。例如,对于组O(nklogk)

  • 第 1 组:[a1,a2,a3],
  • 第 2 组:[b1,b2,b3],
  • 第 3 组:[c1,c2,c3],
  • 第 4 组:[d1,d2,d3],

我可以找到所有元素之间的成对相似性,但无法对它们进行排序。

1个回答

这是一个解决方案。我们假设组中的数字已排序。我们从以下观察开始:任何候选解决方案都将具有最小的数字和最大的数字。为简化起见,我们固定最小的数字,并检查如果该数字是最小的,哪个是解决方案。该算法遵循以下步骤:

  1. 从每组的第一个数字中取最小的数字。记住组是排序的。在你的情况下,最小的是 10
  2. 找出每个组中最小数字和所有第一个数字之间的最大差异。这保证是给定最小数字的最佳解决方案。
  3. 如果它是目前最好的,请保留解决方案。如果它是找到的第一个解决方案,请保留它以供以后比较。
  4. 从其组中删除最小的元素。如果有多个组,则也从这些组中删除第一个元素。
  5. 如果你有一个空组,那么你就停下来。到目前为止看到的最佳解决方案是最佳解决方案。如果您的组不为空,则继续执行步骤 1。

如果您在花费的每个步骤中将组放入优先级队列或最小堆中,其中是组数。每个解决方案验证需要 k 个步骤。对于所有组的总数数字,您将有运行时间。logkknO(nklogk)

稍后编辑:如果在第 2 步发现差异大于迄今为止的最佳候选者,则可以避免进一步计算,因为您已经知道您不会改进解决方案