查找最短执行时间



这是一个在编码平台中提出的问题。我在任何地方都找不到答案。

有3个数组具有程序的执行时间。程序需要按顺序执行。(一个阵列的i+1个th元素不能在同一阵列的i个th之后(。查找最短执行时间。(计算为每个程序的累计执行时间(。

例如:

program1 = [2,1]
program2 = [1]
program3 = [1]

其中一个流程是程序2[0]、程序3[0]、程序1[0]、程序1[1],即[1、1、2、1]上述的执行时间计算为1+(1+1(+(1+1+2(=7(考虑到第一个元素所需的时间为零(

我试着每次取每个数组中最小的一个,但它只适用于某些数组。比如

program1 = [23, 10, 18, 43]
program2 = [70, 1, 1, 1]
program3 = [13, 42]

在本例中,程序2将最后选择,这不是最佳解决方案。

解决这个问题的方法是什么?我能查到类似的问题吗?

您的解释不太好,但我从您的示例中了解到,您有三个数组,每个数组代表一系列需要按照数组中存在的顺序处理的进程(每个值都是完成处理当前进程所需的总时间(。您正在寻找所有进程的最小等待时间总和。每个进程的等待时间计算为所有先前处理的进程的所有处理时间的总和。

如果您正在寻找最佳解决方案,您可以使用这样的动态编程:设dp[i][j][k]是处理来自第一阵列的前i个元素所需的总处理时间,以及处理来自第二阵列的第一j个元素和处理来自第三阵列的第一k个元素。您正在寻找dp[n][m][p],其中n是第一个元素的总数,m是第二个元素,k是第三个元素。

我们的基本情况是dp[1][0]和dp[0][1][0]和dp[0][0][1],其中每个表示从每个数组中获取第一个元素,并且第一个元素将始终等待零次。

现在dp[i][j][k]=min(dp[i-1][j][k+sum1,dp[i][j-1][k]+sum2,dp[i][j][k-1]+sum3(,其中:

sum1=求和来自第一阵列的第一i-1个元素、来自第二阵列的第一j个元素、以及来自第三阵列的第一k个元素。

sum2=求和来自第一阵列的前i个元素,来自第二阵列的前j-1个元素,以及来自第三阵列的第一个k。

sum3=求和来自第一阵列的前i个元素、来自第二阵列的前j个元素、从第三阵列的第一k-1。

通过预处理O(n+m+p(中的所有前缀和,您可以每次在O(1(中计算它们。

总时间复杂度应为O(n.m.p(,因为您将只访问每个状态一次,并且使用上述前缀和计算每个状态的值所需的总时间为O(1(。

如果你不是在寻找最佳解决方案,你可以尝试其他启发式方法,比如选择最小当前元素,或者从数组中选择当前剩余值之和最大/最小的元素,以及更多你可以尝试的想法,这些想法应该在O(n+m+p(时间内运行。

最新更新