磁碟排程演算法(FCFS,SSTF,SCAN)
阿新 • • 發佈:2018-12-23
#include<bits/stdc++.h> using namespace std; int a[2000]; //磁軌位置 int n; //磁軌數量 int begin; //初始位置 void init() { srand(time(0)); n=(rand()%20)+1; // 0-1000 for(int i=0;i<n;i++) a[i]=(rand()%20)+1; //0-1000 begin= (rand()%20)+1; } int abs(int x) { return x<0?-x:x; } int er_fen(int b[],int x) { int l=0,r=n-1; //printf("r=%d\n",r); while(l<=r) { int mid=(l+r)>>1; if(b[mid]>x) { r=mid-1; } else l=mid+1; } //printf("! %d %d %d\n",x,l,r); return r; } void FCFS() //先來先服務 { int sum=0; printf("路徑:\n"); printf("%d",begin); int t=begin; //為了不改變起始點 for(int i=0;i<n;i++) { sum+=abs(t-a[i]); printf(" --> %d",a[i]); t=a[i]; } printf("\n"); printf("總移動數: %d\n",sum); } void SSTF() //用二分搜尋優化 時間複雜度 O(nlogn) { int sum=0; int b[2000]; int vis[2000]={0}; //記錄訪問過的點 for(int i=0;i<n;i++) //為了不改變原始資料 b[i]=a[i]; int t=begin; sort(b,b+n); //排序用於二分 printf("路徑:\n"); printf("%d",begin); for(int i=0;i<n;i++) { int s=er_fen(b,t); //二分 int l=s,r=s+1; while(l>=0&&vis[l]) { l--; } while(r<n&&vis[r]) { r++; } if(l>=0&&!vis[l]&&abs(b[l]-t)<abs(b[r]-t)) { sum+=abs(b[l]-t); vis[l]=1; t=b[l]; } else { sum+=abs(b[r]-t); vis[r]=1; t=b[r]; } printf(" --> %d",t); } printf("\n"); printf("總移動數: %d\n",sum); } void SCAN_down() //電梯法先下降 { int sum=0; int b[2000]; for(int i=0;i<n;i++) //為了不改變原始資料 b[i]=a[i]; int t=begin; sort(b,b+n); //排序用於二分 int s=er_fen(b,t); printf("路徑:\n"); printf("%d",begin); for(int i=s;i<n;i++) { sum+=abs(t-b[i]); printf(" --> %d",b[i]); t=b[i]; } for(int i=0;i<s;i++) { sum+=abs(t-b[i]); printf(" --> %d",b[i]); t=b[i]; } printf("\n"); printf("總移動數: %d\n",sum); } void SCAN_up() //電梯法先上升 { int sum=0; int b[2000]; for(int i=0;i<n;i++) //為了不改變原始資料 b[i]=a[i]; int t=begin; sort(b,b+n); //排序用於二分 int s=er_fen(b,t); printf("路徑:\n"); printf("%d",begin); for(int i=0;i<=s;i++) { sum+=abs(t-b[i]); printf(" --> %d",b[i]); t=b[i]; } for(int i=s+1;i<n;i++) { sum+=abs(t-b[i]); printf(" --> %d",b[i]); t=b[i]; } printf("\n"); printf("總移動數: %d\n",sum); } int main() { init(); printf("FCFS:\n"); FCFS(); printf("SSTF:\n"); SSTF(); printf("SCAN(down):\n"); SCAN_down(); printf("SCAN(up):\n"); SCAN_up(); }