【问题标题】:Finding product of Absolute Difference of Every pair of integer from an array从数组中查找每对整数的绝对差的乘积
【发布时间】:2020-03-03 16:24:31
【问题描述】:

给定一个数组,求每对整数的绝对差的乘积。

例如:给定 a[]= {2,3, 5, 7 };

输出将是 (3-2) * (5-2) * (7-2) * (5-3) * (7-3) * (7-5) = 240 .

能比 O(n^2) 做得更好吗? 编辑: 所有元素都是不同的。

【问题讨论】:

  • 似乎不太可能,因为因子本身的数量是 O(n^2)... 除非该表达式存在一些疯狂的重新表述。
  • 我使用两个循环编写了代码。其中外循环从 0 到 n-2,内循环从 1 到 n-1。我保留一个变量乘积来跟踪元素的当前乘积——在其中我找到元素 [i] 和元素 [j] 的绝对差并将其乘以乘积变量。循环结束后,我打印产品变量。
  • @ManojBanik 我认为没有必要质疑我的代码。因为它不会比 O(n^2) 更好地考虑解决方案。既然我已经提到我的代码复杂度为 O(n^2),那么很清楚我使用了什么方法。
  • 注意:这显然与范德蒙德矩阵的行列式有关。但我看不出如何使用它来获得更快的计算。

标签: algorithm


【解决方案1】:

如果您必须计算绝对差的总和,那么这就是您的解决方案

基本上,如果你取一个任意数字,我们将它命名为 x,那么你就有了

m * x - n * x,

其中 m 是小于 x 的项目数,n 是大于 x 的 n 个项目数。所以,如果由于某种原因你有一个排序数组,那么每个项目的索引会直接告诉你如果它在数组中是唯一的,那么它有多少更大或更小的项目。如果没有,那么您也可以确定较高和较低元素的数量。

因此,如果数组已排序,则计算结果是线性的。如果数组完全未排序,则对数组进行排序是 n * log(n) 的复杂度,如果您使用合并排序。因此,复杂度是

O(n + n * log(n)) = (n + 1)log(n)

但对于绝对差异的乘积

你有一个形式的产品

(a1 - b1) * ... (...)

由于您有减法乘积,为了找到可用于优化的模式,您需要有关数据的更多信息。您的输入似乎包含素数。产品

(a1 - b1) * (a2 - b2)

a1a2 - a1b2 - b1a2 + b1b2

我不知道任何可以用于优化的模式,所以我认为这具有 O(n^2) 复杂度。

【讨论】:

  • 您能详细说明如何使用它来计算结果吗?我知道元素的排序位置为您提供了较小和较大元素的数量,但是您如何从那里得到结果?请注意,绝对差异是相乘的,而不是相加的。
  • @jdehesa 我的回答解决了总结它们的问题,你的观点是正确的,我解决了提问者要求的其他问题。考虑真正的问题并将编辑或删除此答案。
  • @amit 是的,它的灵感来自那个问题。当我最近访问过这个问题时,我想如果我可以做比 O(n^2) 更好的产品而不是求和。
猜你喜欢
  • 2011-08-16
  • 2023-01-02
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 2021-12-08
  • 2012-09-27
  • 1970-01-01
  • 2020-04-18
相关资源
最近更新 更多