任務排程器

2022-07-23 03:39:11 字數 2775 閱讀 6511

給你乙個用字元陣列tasks表示的cpu需要執行的任務列表。其中每個字母表示一種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在1個單位時間內執行完。在任何乙個單位時間,cpu可以完成乙個任務,或者處於待命狀態。

然而,兩個相同種類的任務之間必須有長度為整數n的冷卻時間,因此至少有連續n個單位時間內cpu在執行不同的任務,或者在待命狀態。

你需要計算完成所有任務所需要的最短時間

示例 1:

輸入:tasks = ["a","a","a","b","b","b"], n = 2

輸出:8

解釋:a -> b -> (待命) -> a -> b -> (待命) -> a -> b

在本示例中,兩個相同型別任務之間必須間隔長度為 n = 2 的冷卻時間,而執行乙個任務只需要乙個單位時間,所以中間出現了(待命)狀態。

public int leastinterval(char tasks, int n) 

// 任務總數

int m = freq.size();

listnextvalid = new arraylist();

listrest = new arraylist();

set> entryset = freq.entryset();

for (map.entryentry : entryset)

int time = 0;

for (int i = 0; i < tasks.length; ++i)

} time = math.max(time, minnextvalid);

int best = -1;

for (int j = 0; j < m; ++j)

}} nextvalid.set(best, time + n + 1);

rest.set(best, rest.get(best) - 1);

} return time;

}

需要注意的是,執行任務是需要時間的,這裡第乙個任務執行完時time1

根據我們的策略,我們需要選擇不在冷卻中並且剩餘執行次數最多的那個任務。

這裡第乙個任務既可以是任務a,也可以是任務b,於是按照遍歷的順序,先執行任務a。

執行完第乙個任務a,任務a的執行次數減1,同時任務a的下一次執行的time4

time2時,只能執行任務b。執行完第二個任務b,任務b的執行次數減1,同時任務a的下一次執行的time5

time3時,發現任務a和任務b都在冷卻中,而任務a的time離現在更近,所以直接跳到任務a的time去執行任務a。

解釋**:

以下**表示跳到下乙個執行任務的time

// ...

time = math.max(time, minnextvalid);

// ...

以下**的rest.get(j) > rest.get(best)表示選擇不在冷卻中並且剩餘執行次數最多的那個任務。

int best = -1;

for (int j = 0; j < m; ++j)

}}

public int leastinterval(char tasks, int n) 

// 具有最多執行次數的任務數量

int maxcount = 0;

set> entryset = freq.entryset();

for (map.entryentry : entryset)

} return math.max((maxexec - 1) * (n + 1) + maxcount, tasks.length);

}

maxexec為最多的執行次數,maxcount為具有最多執行次數的任務數量,n為任務的冷卻時間,tasks為任務列表。以tasks = ["a","a","a"], n = 2為例,我們使用乙個寬為n+1的矩陣視覺化地展現執行任務a的時間點。

注意到這裡兩個任務a之間間隔兩個格仔,任務a正好都在同一列上,計算所需時間為(3 - 1)*(2 + 1) + 1 = 7

同理,以tasks = ["a","a","a","b","b","b"], n = 2為例,計算所需時間為(3 - 1)*(2 + 1) + 2 = 8

如果maxcount > n + 1,那麼計算所需的最短時間為任務的總數tasks.length

參考:

任務排程器

leetcode621 解題思路一 排序 規定n 1個任務為一輪,保證同一輪中乙個任務最多只能被安排一次。在每一輪中,將當前的任務按照它們剩餘的次數降序排序,並選擇剩餘次數最多的n 1個任務依次執行。如果任務的中種類t n 1,則只能選擇全部的t種任務,其餘時間空閒。也就是利用貪心,因為冷卻時間的存...

python celery 任務排程器

celery是python開發的分布式任務排程模組,今天抽空看了一下,果然介面簡單,開發容易,5分鐘就寫出了乙個非同步傳送郵件的服務。celery本身不含訊息服務,它使用第三方訊息服務來傳遞任務,目前,celery支援的訊息服務有rabbitmq redis甚至是資料庫,當然redis應該是最佳選擇...

任務排程器 Quartz

開發過程中需要用到定時任務,記錄一下配置過程 1 目標bean timingjob class com.quartz.timing.timingjobservice bean 2 jobdetail 排程任務 timingtrigger class org.springframework.sched...