Algorithm 最小化路径切换的算法

Algorithm 最小化路径切换的算法,algorithm,time-complexity,dijkstra,Algorithm,Time Complexity,Dijkstra,我有一个列表的形式是l=[[1,2,3],[3,4,6],…]。有m子列表,每个子列表代表一个玩家。每个玩家可以执行许多任务(有n任务)。我希望通过最小化玩家之间的切换次数,找到所有步骤的最短路径。因此,基本上让同一玩家尽可能多地连续执行任务。我正试图写一个算法来优化它,它在多项式时间内运行,但是我在想出一个好的方案时遇到了一些困难。我想可能是这样,但我不确定如何调整它以适应我的情况。下面是我想要的具体例子 示例 n=5,m=3,这样我们有一个列表l=[[1,2,5],[1,3,5],[2,3,

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

示例

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

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

i、 e.首先选择玩家0,然后交换给玩家2执行3项任务,而不是返回给玩家0执行最后一项任务


我只是在寻找伪代码或是向正确的方向推进。真正的挣扎和暴力不会对大量的人起作用

由于让玩家执行的连续任务少于他所能完成的任务是没有好处的,一个简单的贪婪算法就足以找到最佳解决方案:

  • 从任务1开始,找到能够从第一个任务开始执行最多连续任务的玩家

  • 从先前找到的玩家无法执行的第一个任务开始,找到能够从该任务开始执行最多连续任务的玩家

  • 重复此操作,直到完成所有任务

  • 以下是该算法是最优的证明:

    假设有一个最优解决方案,玩家A通过j执行任务i,然后玩家B通过k执行任务j+1

    如果有任何玩家(包括A)可以通过j+1执行任务i,那么我们可以使用该玩家来执行这些任务,解决方案也会一样好或更好。B将通过k执行任务j+2,并且玩家切换的数量将相同,或者j+1=k,我们根本不需要玩家B

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


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

    我投票将此问题作为主题外的问题来结束,因为这似乎更适合您从何处得到此问题?任何约束,例如:
    n
    的最大值、
    m
    l
    ?@PhamTrung这是我遇到的编码问题的抽象。没有最大值,它们会变得很大。你能在这里分享你的暴力方法吗?这需要O(n*m)时间,这是最佳的。哈,是的。我的意思是说O(N)时间,也就是说,输入的大小是线性的,也就是O(N*m),使用OP的原始变量。再想一想,通过对子列表进行二进制搜索来找到连续的条纹,我们应该能够做得比线性的好(假设它们按照示例中的排序)。这一时间取决于条纹的数量和长度,在最佳情况下为O(n log m)。