【问题标题】:General algorithm: random sort array, so the distance between objects is maxed通用算法:随机排序数组,所以物体之间的距离最大化
【发布时间】:2015-05-12 17:35:13
【问题描述】:

给定一个随机的非唯一数字数组

[221,44,12,334,63,842,112,12]

随机排序值的最佳方法是什么,但也要尝试最大化距离|A-B|到相邻号码

【问题讨论】:

  • 你的意思是|A-B|的总和吗?应该最大化?
  • 是的,|A-B| 的总和应该最大化
  • 应该是随机的,还是应该最大化相邻单元格的距离?这些都是自相矛盾的。
  • @Benjy Kessler 这很有趣;你猜哪个减少?

标签: algorithm sorting random shuffle


【解决方案1】:

您可以尝试次优贪心算法:

1. sortedArr <- sort input array
2. resultArr <- initialize empty array
3. for i=0 to size of sortedArr
  a. if i%2
    I. resultArr[i] = sortedArr[i/2]
  b. else
    II. resultArr[i] = sortedArr[sortedArr.size - (i+1)/2]

这会将数字从排序输入的左侧和右侧交替放入结果中。例如,如果排序后的输入是:

12, 12, 44, 63, 112, 221, 334, 842

那么输出将是:

12, 842, 12, 334, 44, 221, 63, 112

这可能不是最优的,但它可能非常接近并且在 O(nlogn) 中工作。在您的示例中,最佳值是通过以下方式获得的:

63, 221, 12, 334, 12, 842, 44, 112

得出的总和为 2707。我的算法得出的总和为 2656。我很确定您将无法在多项式时间内找到最优值。 Python 中的蛮力解决方案如下所示:

import itertools
maxSum = 0
maxl = []
for l in itertools.permutations([221,44,12,334,63,842,112,12]):
  sum = 0
  for i in range(len(l)-1):
    sum += abs(l[i]-l[i+1])
  if sum > maxSum:
    print maxSum
    print maxl
    maxSum = sum
    maxl = l
print maxSum
print maxl

【讨论】:

    猜你喜欢
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2022-06-17
    相关资源
    最近更新 更多