List 在没有暴力的情况下,能否找到安排任务的最短时间?

List 在没有暴力的情况下,能否找到安排任务的最短时间?,list,math,optimization,scheduled-tasks,code-complexity,List,Math,Optimization,Scheduled Tasks,Code Complexity,如果我有一个整数列表,表示完成一项任务所需的时间,并且我有x个工作人员,在完成一项任务所需的时间结束之前,他们只能处理一项任务,那么我能找到在最佳情况下可能需要的最短时间吗?我不需要精确的排列来组成这个最小的完成时间,只需要时间 例如,为了简单起见,如果我有一个列表[2,4,6],我有两个工人,那么如果我从2开始,然后从4开始,当2完成时,6将开始,这意味着完成所有任务需要8秒。然而,如果我以6和2开始,那么当2完成时,4将与6同时开始和完成,因此,如果按此顺序完成任务,只需要6秒 有没有办法知

如果我有一个整数列表,表示完成一项任务所需的时间,并且我有x个工作人员,在完成一项任务所需的时间结束之前,他们只能处理一项任务,那么我能找到在最佳情况下可能需要的最短时间吗?我不需要精确的排列来组成这个最小的完成时间,只需要时间

例如,为了简单起见,如果我有一个列表[2,4,6],我有两个工人,那么如果我从2开始,然后从4开始,当2完成时,6将开始,这意味着完成所有任务需要8秒。然而,如果我以6和2开始,那么当2完成时,4将与6同时开始和完成,因此,如果按此顺序完成任务,只需要6秒

有没有办法知道它只需要6秒,这比n好!还是保证时间尽可能短的暴力复杂性?提前感谢您的帮助。如果我遗漏了任何细节或您感到困惑,请随时提问

编辑:请帮助:(


编辑2:是否有可能?有人知道吗?

如果是单个工人,那么实际所需的总时间与所有任务时间的总和相同

jobs = [ 2, 4, 6, etc... ]
time_required = SUM( jobs )
如果有两个工人,则给定一个特定的工作顺序,所需的总时间可以通过以下方式确定:首先将每个任务的所需时间分配给与之相关联的当前最低和的工人,然后获得与每个工人相关联的最高和:

define type worker  = vector<time_t>
define type workers = min_priority_queue<worker> using worker.sum() # so the current worker.sum() (the sum of `time_t` values in `vector<time_t>`) is the priority-queue key.
define type task    = int

jobs = [ 2, 4, 6, etc... ]

# Use two workers:
workers.add( new worker )
workers.add( new worker )

# Iterate once through each job:
foreach( task t in jobs ) {

    minWorker = workers.getMinWorker() # priority queue "find-min" operation
    minWorker.add( t )
}

# Determine which worker will work the longest time:
time_required = workers.getMaxWorker().sum() # priority queue "find-max" operation

我认为在这种情况下,找到“在最佳情况下可能需要的最短时间”与确定任务的执行顺序(即确定排列)需要相同的工作量.我对这个问题没有想太多,但它让我想起了。然而,找到一个最小下界是一个更简单的问题,我认为这是你要寻找的术语,而不是“最佳情况”.同意,我想要最短时间的原因是这样,而不是迭代到n!为了找到最佳排列,我可以迭代,直到找到最短时间,然后中断,所以我只是想知道是否有一些公式或东西可以确定小于n的最短时间!欢迎通知我背包问题这很有趣@DaiBTW,您可能还想看看,因为我认为您的问题是一个调度问题的实例,其中所有工人对每个任务都有相同的成本-在这种情况下,您最多可以在
O(n^4)
提供的时间(其中
n==workers*tasks
)内找到最佳解决方案(无需寻找边界)哪个比
O(n!)好
。您正在寻找任务集合的makespan。之前有很多工作要审查。@HighPerformanceMark您知道我在哪里可以找到这项工作要审查吗?我做了一些研究,感谢您通知我makespan这个术语,它很有帮助,但我能找到的几乎所有算法都涉及一些sti像x任务这样的操作必须在y之前完成,我对我的程序没有这样的规定,所以他们的算法对我没有多大帮助。谢谢你的帮助!很好的解决方案,在[8,2,2,2]的情况下,找到前半个任务的总和(对于两个工人)并不总是最小的,但不幸的是,在[8,2,2,2]的情况下最好的解决方案是8秒,但最大数的前半部分的总和是10。任何排序都不会有帮助,除非我能提前知道最短的时间,否则就不可能知道何时爆发。谢谢你的帮助!@mizuprogrammer我的帖子说,找到降序排序值的前半部分的总和我很抱歉,你是对的,我误读了,你的解决方案是对的,但对于下界,它并不总是最大的数字,因为我不能假设我总是有和我做任务一样多的工人。谢谢你的帮助!:)@Dai
jobs = [ 2, 4, 6, etc... ]

worker_count = 2

jobs.sortDescending() # O(n log n)

# if there's 50 jobs and 2 workers, then take the first 25 jobs and sum them...
# ...that's an upper_bound for the time required to complete all tasks by 2 workers, as it assumes that 1 unlucky worker will get all of the longest tasks

upper_bound = jobs.take( jobs.count / worker_count ).sum()