【问题标题】:Algorithm to minimizing switching between paths最小化路径之间切换的算法
【发布时间】:2018-03-08 09:16:09
【问题描述】:

我有一个l = [[1,2,3],[3,4,6],...] 形式的列表。有m 子列表,每个子列表代表一个玩家。每个玩家可以执行多项任务(有n 任务)。我想通过最小化玩家之间的切换次数来找到通过所有步骤的最短路径。所以基本上让同一个玩家尽可能频繁地连续执行任务。我正在尝试编写一个算法来优化它在 多项式时间 中运行,但我在想出一个好的方案时遇到了一些麻烦。我在想它可能像Dijkstra's algorithm,但我不确定如何调整它以适应我的情况。下面是我想要的具体示例。

示例

n = 5 和 m = 3 这样我们就有一个列表 l = [[1,2,5],[1,3,5],[2,3,4]]

算法将返回 [0,2,2,2,0]

即玩家 0 将首先被选中,然后切换到玩家 2 完成 3 个任务,而不是回到玩家 0 完成最后一个任务。

我只是在寻找伪代码或朝着正确的方向推进。真正的挣扎和蛮力对于大量的人来说是行不通的!

【问题讨论】:

  • 我投票结束这个问题,因为它似乎更适合cs.stackexchange.com
  • 你从哪里得到这个问题?任何约束,即:n、m、l 的最大值?
  • @PhamTrung 这是我遇到的编码问题的抽象。没有最大值,它们可以变得很大。
  • 你能在这里分享你的蛮力方法吗?

标签: algorithm time-complexity dijkstra


【解决方案1】:

既然让玩家执行的连续任务比他能做的少,那么简单的贪心算法就足以找到最佳解决方案:

  1. 从任务 1 开始,找出能从第一个任务开始执行最多连续任务的玩家。

  2. 从之前找到的玩家无法完成的第一个任务开始,从该任务开始,找到能够执行最多连续任务的玩家。

  3. 重复直到完成所有任务。

这里证明了这个算法是最优的:

假设有一个最佳解决方案,让玩家 A 执行任务 i 到 j,然后玩家 B执行任务 j+1 到 k。

如果有任何玩家(包括A)可以执行i到j+1的任务,那么我们可以使用该玩家改为执行这些任务,解决方案将一样好或更好。要么B会执行j+2到k的任务,玩家切换的次数相同,要么j+1 = k,我们根本不需要播放器 B。

因此,存在一个最优解,其中每个被选中的玩家最大化该玩家可以执行的连续移动的数量。事实上,由于每个这样的解决方案都是等价的,所以它们都是最优的。

编辑:在我写这篇文章的时候,Pham 建议使用段树,但不需要如此复杂的数据结构。如果子列表已排序,并且您从每个任务编号到可以找到它的子列表位置建立索引,那么您可以在 O(N) 时间内完成此操作。

【讨论】:

  • 这将花费 O(n*m) 时间,这是最优的。
  • 哈,是的。我的意思是说 O(N) 时间,即输入的大小是线性的,使用 OP 的原始变量是 O(n*m)
  • 再想一想,我们应该能够通过在子列表上使用二进制搜索来找到连续的条纹(假设它们按照示例中的排序)来做得比线性更好。这个时间取决于条纹的数量和长度,最好的情况是 O(n log m)。
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2021-04-18
  • 2019-05-03
相关资源
最近更新 更多