[programmers]ディスクコントローラ(Python)
14559 ワード
質問する📚
HDDは一度に1台しか処理できません.ディスクコントローラを実装する方法はいくつかあります.最も一般的な方法は、リクエストの受信順序に従って処理することである.
例:
受け取った要求は同じです.下図のように.
各タスクの要求から終了までの平均時間は10ミリ秒(=(3+11+16)/3)である.
A→C→Bの順に処理すると,各タスクの要求から終了までの平均時間は9 ms(=(3+7+17)/3)となる.
せいげんじょうけん
jobsの長さは1または500以下です.
ジョブの各行は、タスクの[タスクを要求する時間、タスクに要する時間]です.
各タスクについて、タスクを要求する時間は1000を超えません.
各タスクに要する時間は1000時間を超えない.
ハードディスク(HDD)が動作していない場合は、リクエストのタスクを先に処理します.
I/O例
jobsreturn[[0, 3], [1, 9], [2, 6]]9
質問リンク
のり
heapq를 이용한 우선순위 큐
に組み入れる.コード(Python)
import heapq
from collections import deque
def solution(jobs):
answer, count, currenttime = 0, 0, 0
lasttime = -1
jobheap = []
while count < len(jobs):
for job in jobs: #이전 job을 처리하는 동안 발생한 Job을 Heap에 삽입
if lasttime < job[0] <= currenttime:
heapq.heappush(jobheap, (job[1], job[0]))
if jobheap:
work, start = heapq.heappop(jobheap)
lasttime = currenttime
currenttime += work
count += 1
answer += (currenttime - start)
else: #heap에 job이 없는 경우
currenttime += 1
return answer // len(jobs)
別の答え
deque를 함께 사용
仕事がなければ、もう1時間追加するわけではありません.현재 기준 가장 빠르게 들어올 job을 처리
を実現し、時間を短縮しました.def solution2(jobs):
#deque를 사용해서 pop 시간복잡도를 낮춤
tasks = deque(sorted([(x[1], x[0]) for x in jobs], key=lambda x: (x[1], x[0])))
q = []
heapq.heappush(q, tasks.popleft())
current_time, total_response_time = 0, 0
while len(q) > 0:
dur, arr = heapq.heappop(q)
current_time = max(current_time + dur, arr + dur)
total_response_time += current_time - arr
while len(tasks) > 0 and tasks[0][1] <= current_time:
heapq.heappush(q, tasks.popleft())
if len(tasks) > 0 and len(q) == 0: #heap에 job이 없는 경우 가장 빨리 들어올 job을 선정
heapq.heappush(q, tasks.popleft())
return total_response_time // len(jobs)
if __name__ == "__main__":
start = time.time() # 시작 시간 저장
job1 = [[500, 3], [1, 9], [2, 6]]
print("my ans : ", solution(job1), " | ans : 8", " time : ", time.time() - start)
start = time.time() # 시작 시간 저장
job1 = [[500, 3], [1, 9], [2, 6]]
print("my ans : ", solution2(job1), " | ans : 8", " time : ", time.time() - start)
my ans : 8 | ans : 8 time : 0.000179290771484375
my ans : 8 | ans : 8 time : 2.002716064453125e-05
githubコードReference
この問題について([programmers]ディスクコントローラ(Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@minzz/Programmers-디스크-컨트롤러-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol