磁盘调度SSTF(最短寻道时间优先算法)python
python相对于c/c++来说对于内存要求太高,它的运行速度也更慢,所以关于计算机底层算法还是用c/c++实现最好,用python最多是练习一下算法的逻辑,肯定是不能实际应用的
list1=list(map(int,input().split()))
list_seek=list(map(int,input().split()))
list_seek=sorted(list_seek)# 对数据排序,方便寻找离得最近的数
def Shortest_Seek(list_seek_sorted,track):
for i in range(len(list_seek)): # 遍历尝试寻找离track最近的数
if list_seek_sorted[i]>=track: # 寻找大于track的且最近的数(找到了说明这个数比track大且离得最近,这个数之前的那个数笔track小且离得最近)
if i>=1: # 如果这个数不是列表中的第一个(如果是第一个说明左边没有比track小的数了,所以就没必要和左右两边的数比较了)
if list_seek_sorted[i]-track>=track-list_seek_sorted[i-1]: # 左边的数离track近。这里注意>=,当两边一样距离的时候选择小的
next_track=list_seek_sorted.pop(i-1)
return next_track,list_seek_sorted
else: #右边的数(也就是当前i所在位置的数)离track近
next_track=list_seek_sorted.pop(i)
return next_track,list_seek_sorted
else: # 如果是第一个数就直接输出,因为左边没数了
next_track=list_seek_sorted.pop(i)
return next_track,list_seek_sorted
break # 找到一个大于track且满足条件的数就退出循环
else: # 如果遍历完还没有找到,说明track比所有数都大,所以输出列表中最后一个,因为它离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)# 获取下一个要到达磁道位置
result+=abs(next_track-now_track) # 计算差值
now_track=next_track # 磁头移动至下一个磁道
# 循环获取最近的磁道,记录差值并移动
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)