甚至在数组中分配数字
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了甚至在数组中分配数字相关的知识,希望对你有一定的参考价值。
我的问题是我有一个给定的n个数字在1到100之间。目标是选择5个数字,这导致最小的总距离。通过将初始阵列中的每个数字的距离与5个拾取的数字中最接近的数字相加来计算总距离。
我(有点)试过和想过的:
- 取数组的平均数并将其除以5得到有用的东西?
- 将数组长度除以5,数字x,然后第一个数字是数组[x],第二个数字是数组[x * 2],依此类推
例
- 输入[5,10,15,20,...,85,90,95,100]
- 输出[10,30,50,70,90](可能有更好的输出,但我希望这可以明确目标)
正如你所看到的,我很丢失,只是无法提出解决方案。可能有一个非常简单的解决方案,我只是没有得到。
我只是在寻找暗示而不是解决方案,我不想自己解决这个问题。
这是一个在多项式时间内工作的算法。
首先,对你的n
数组进行排序。接下来,计算一个2-dim数组,其中每个0 <= i <= j < n
包含最佳元素的索引,以填充从i
th元素到j
th元素的范围。从该最佳阵列中填写每个区间的总距离的类似数组。
作为上述示例输出的示例,第一个2-dim数组可能如下所示:
optimal_index = [
[ 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9],
[ 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10],
[ 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10],
[ 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11],
[ 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11],
[ 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12],
[ 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12],
[ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13],
[ 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13],
[ 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14],
[10, 10, 11, 11, 12, 12, 13, 13, 14, 14],
[11, 11, 12, 12, 13, 13, 14, 14, 15],
[12, 12, 13, 13, 14, 14, 15, 15],
[13, 13, 14, 14, 15, 15, 16],
[14, 14, 15, 15, 16, 16],
[15, 15, 16, 16, 17],
[16, 16, 17, 17],
[17, 17, 18],
[18, 18],
[19],
]
其中从i
到j
的最佳元素的索引是在optimal_index[i][j-i]
。使用相同的索引方案,成本矩阵将是:
optimal_cost = [
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210, 245, 280, 320, 360, 405, 450, 500],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210, 245, 280, 320, 360, 405, 450],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210, 245, 280, 320, 360, 405],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210, 245, 280, 320, 360],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210, 245, 280, 320],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210, 245, 280],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210, 245],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180, 210],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150, 180],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125, 150],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100, 125],
[ 0, 5, 10, 20, 30, 45, 60, 80, 100],
[ 0, 5, 10, 20, 30, 45, 60, 80],
[ 0, 5, 10, 20, 30, 45, 60],
[ 0, 5, 10, 20, 30, 45],
[ 0, 5, 10, 20, 30],
[ 0, 5, 10, 20],
[ 0, 5, 10],
[ 0, 5],
[ 0],
]
那么如果我们用2个元素填充范围呢?这是一个考虑每个范围的问题,并且在每个点上查看我们可以划分它的成本。新数据结构只需要包含“最靠近第一个元素”和“最接近第二个元素”之间的区域。从这个部门我们可以采取任何范围并快速将其划分为最佳2,然后告诉您两个选定的元素是什么,以及总成本。这可以用类似的矩阵填充。请注意,之前的optimal_cost
矩阵将使这些计算非常简单。
接下来,4个元素的范围怎么样?这与2个元素的范围完全相同,除了我们现在在第一对和第二对之间划分。但逻辑是一样的。
最后,我们有5个元素的问题呢?这只是计算最接近前4个元素和最接近最后4个元素之间的最佳划分的问题。所以尝试所有的可能性。
这填补k
事物的自然概括在一个大小n
阵列是O(n^3 log(k))
。
以上是关于甚至在数组中分配数字的主要内容,如果未能解决你的问题,请参考以下文章