甚至在数组中分配数字

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包含最佳元素的索引,以填充从ith元素到jth元素的范围。从该最佳阵列中填写每个区间的总距离的类似数组。

作为上述示例输出的示例,第一个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],
]

其中从ij的最佳元素的索引是在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))

以上是关于甚至在数组中分配数字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用指针在另一个函数中分配数组

在 C# 中传递 IntPtr 指针后,在非托管 C++ 代码中分配数组,编组类型

数组,数字包装类,字符串的处理

在Javascript中分配对象内部的数组

在c中分配空间并连接到无符号字符数组

在 JME 中拆分文本并在数组中分配值