任务调度器——构造

67 阅读1分钟

image.png

图二

image.png

代码:

  1. maxExec记录数量最多的任务数,如示例1中,最多任务数为3个,maxExec=3
  2. maxExecCnt记录(数量最多的任务数)有几个,如示例1中,A,B都是数量最多的,所以maxExecCnt=2
  3. maxExecCnt就是图二最后一列的数量
  4. (maxExec-1)*(n+1) + 1即只做任务A也需要这么多的时间
  5. (maxExec-1)*(n+1) + maxExecCnt即只做任务数最多的那几个任务所需要的时间(这里其实默认maxExecCnt <= n的,但其实无所谓,因为如果>n,那么len(tasks)的值一定更大)
  6. len(tasks)更大就代表我们没有使cpu空闲,自然也就不需要考虑任务调度问题了,直接返回任务数就好了
  7. 最后我们输出更大的那个值就好了
func leastInterval(tasks []byte, n int) int {
    cnt := map[byte]int{}
    for _, t := range tasks {
        cnt[t]++
    }

    maxExec, maxExecCnt := 0, 0
    for _, c := range cnt {
        if c > maxExec {
            maxExec, maxExecCnt = c, 1
        } else if c == maxExec {
            maxExecCnt++
        }
    }

    if time := (maxExec-1)*(n+1) + maxExecCnt; time > len(tasks) {
        return time
    }
    return len(tasks)
}