【问题标题】:how to place elements in matrix optimally so that distance from other elements is minimum?如何以最佳方式将元素放置在矩阵中,以使与其他元素的距离最小?
【发布时间】:2019-07-19 14:49:44
【问题描述】:

我有一个 7x4 阶的矩阵 我在矩阵中有 4 个零 我想放置这些零以使每个其他元素与其中一个零的距离最小?我应该如何解决这个问题?

【问题讨论】:

  • 我认为,将一个矩阵分成4个子矩阵,然后将零放在每个子矩阵的中心
  • 你如何定义“距离”?
  • 根据我的解决方案位置将是 (1,1) (1,2) (5,1) (5,2)
  • @trincot 距离是每个元素之间的一个单位
  • 你如何定义“单位”?对角线步长是 1 还是 2 单位?你想优化什么?平均距离?中距离?距离最短的单元格数量?

标签: algorithm matrix combinations


【解决方案1】:

当矩阵的大小和/或零单元的数量是可变输入时,编程会成为一个更有趣的问题。

作为第一步,您将确定一个单元格和一个零单元格之间的最大距离的下限。在 7x4 矩阵的具体情况下,我们有 28 个单元。我们可以选择 4 个零单元格。

让我们首先尝试仅一步(距离 1)到达所有其他单元格。每个零单元有 4 个邻居,因此包括它自己在内,它最多代表 5 个与它的距离最多为 5 的单元。如果它们都是不同的,我们最多可以找到 4x5 = 20 个距离为大多数 1 具有零单元格。但是我们在矩阵中有 28 个单元格,所以这永远行不通。

如果我们以 2 的距离进行相同的推理,那么每个零单元周围可以有 13 个单元(包括它自己),它们与该零单元的距离最多为 2。所以在最好的情况下,我们可以覆盖 4x13=52 个单元。所以有可能找到距离为 2 的解决方案(但还不确定)。这将是一个单元格与零单元格的最大距离的下限。

其次,为每个单元格注册与它的距离最多为该距离的邻居。

最后,执行以下步骤:

  1. 选择具有最少邻居的单元格 A。第一次是角单元(四个中的任何一个)。

  2. 从 A 的邻居中选择具有最多邻居的单元格 B。在 B 中放置一个零并将此选项添加到解决方案中。

  3. 删除所有与 B 相邻的单元格,包括它自己,并将它们也从其他单元格的邻居列表中删除。

  4. 如果我们重复了 4 次(所以我们放置了 4 个零),请检查是否没有剩余单元格。如果是这样:找到解决方案。如果不是,则回溯,并将在第 2 步或第 1 步中做出的选择更改为次优选择,......等等。在最坏的情况下,您还必须在最小距离上回溯,并尝试增加距离。请注意,对于 7x4 矩阵,不需要回溯。第一次尝试就找到了解决方案。

  5. 对于剩余的单元格,从步骤 1 开始重复。

以下是具体 7x4 矩阵的每个步骤的可视化表示:

为了提高效率,您需要将单元格存储在允许在恒定时间内识别具有最多/最少邻居的单元格的数据结构中。 Min-Max Heap 会有所帮助,尽管对于像 7x4 这样的小输入数组大小,它可能不值得。

【讨论】:

  • 谢谢,我仔细阅读了它,我可能需要再阅读几次才能将其转换为代码。是我将来应该学习解决此类问题的一些已知算法吗?
  • 在我看来,一个人边做边学。你解决的编程问题越多,你的直觉就越敏锐,可以处理下一个问题。实际上,我确信如果输入(数组、零的数量)变得更大,这个特定的问题需要更多的想法来改进。
猜你喜欢
  • 1970-01-01
  • 2014-04-08
  • 2015-05-05
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多