磁盤調(diào)度SSTF(最短尋道時間優(yōu)先算法)python
python相對于c/c++來說對于內(nèi)存要求太高,它的運行速度也更慢,所以關(guān)于計算機底層算法還是用c/c++實現(xiàn)最好,用python最多是練習(xí)一下算法的邏輯,肯定是不能實際應(yīng)用的
list1=list(map(int,input().split()))
list_seek=list(map(int,input().split()))
list_seek=sorted(list_seek)# 對數(shù)據(jù)排序,方便尋找離得最近的數(shù)
def Shortest_Seek(list_seek_sorted,track):
??? for i in range(len(list_seek)): # 遍歷嘗試尋找離track最近的數(shù)
??????? if list_seek_sorted[i]>=track: # 尋找大于track的且最近的數(shù)(找到了說明這個數(shù)比track大且離得最近,這個數(shù)之前的那個數(shù)筆track小且離得最近)
??????????? if i>=1: # 如果這個數(shù)不是列表中的第一個(如果是第一個說明左邊沒有比track小的數(shù)了,所以就沒必要和左右兩邊的數(shù)比較了)
??????????????? if list_seek_sorted[i]-track>=track-list_seek_sorted[i-1]: #? 左邊的數(shù)離track近。這里注意>=,當(dāng)兩邊一樣距離的時候選擇小的
??????????????????? next_track=list_seek_sorted.pop(i-1)
??????????????????? return next_track,list_seek_sorted
??????????????? else: #右邊的數(shù)(也就是當(dāng)前i所在位置的數(shù))離track近
??????????????????? next_track=list_seek_sorted.pop(i)
??????????????????? return next_track,list_seek_sorted
??????????? else: # 如果是第一個數(shù)就直接輸出,因為左邊沒數(shù)了
??????????????????? next_track=list_seek_sorted.pop(i)
??????????????????? return next_track,list_seek_sorted
??????????? break # 找到一個大于track且滿足條件的數(shù)就退出循環(huán)
??? else: # 如果遍歷完還沒有找到,說明track比所有數(shù)都大,所以輸出列表中最后一個,因為它離track最近
??????? next_track=list_seek_sorted.pop(-1)
??????? return next_track,list_seek_sorted
# 初始化
result=0
now_track=list1[1] #初始磁頭位置
next_track,list_seek=Shortest_Seek(list_seek,now_track)# 獲取下一個要到達(dá)磁道位置
result+=abs(next_track-now_track) # 計算差值
now_track=next_track # 磁頭移動至下一個磁道
# 循環(huán)獲取最近的磁道,記錄差值并移動
while list_seek:
??? next_track,list_seek=Shortest_Seek(list_seek,now_track)
??? result+=abs(next_track-now_track)
??? now_track=next_track
print(result)