贪婪算法。如何解决这个问题?

时间:2019-11-04 17:34:53

标签: algorithm

假设给定两组A和B,每个组包含n个正整数。您可以选择重新排列每个集合的顺序。重新排序后,让ai是集合A的第i个元素,让bi是集合B的第i个元素。然后,您将收到(a1 ^ b1)×(a2 ^ b2)×...×( an ^ bn)。给出一个将收益最大化的多项式算法。

答案: 我认为,如果我们对这两个集合进行越来越多的排序,问题将会解决。它需要o(nlog(n))时间。 有人反对吗?

2 个答案:

答案 0 :(得分:0)

作为提示,我们可以将问题简化为另一个简单版本。如果您通过公式log,我们将有:

b1 log(a1) + ... + bn log(an)

现在假设我们有两个向量V1 = <b1, b2, ..., bn>V2 = <a1, a2, ..., an>。因此,公式是这两个向量(V1.V2)的点积。通过点积的定义,我们知道V1.V2 = |V1|*|V2|* cos(theta)。通过置换V1V2的元素,我们知道V1V2的范式不会改变。因此,我们需要最大化cos(theta)thetaV1V2之间的度数)。因此,我们需要最小化theta(以最大化cos(theta))。

答案 1 :(得分:0)

很容易证明贪心算法-即将最大数与最大指数配对,然后将第二大数与第二大指数配对,以此类推-是最优的。

假设产品包括两个术语a[i] ** b[i]a[j] ** b[j],其中a[i] < a[j]b[i] > b[j]。由此得出(a[i] ** b[j]) * (a[j] ** b[i])大于(a[i] ** b[i]) * (a[j] ** b[j])的原因是它们相差(a[j] / a[i]) ** (b[i] - b[j])的因数,b[i]假设是一个大于1的数与大于0的幂的乘方,因此系数大于1。因此,我们可以通过将b[j]与{{1}}交换来改善收益,因此原始收益并不是最优的,因为可以通过进行交换来改善收益。

从这个意义上说,您的贪婪算法确实是正确的,因为它确实可以最大程度地提高回报。