最大間隙問題
給定 n 個實數,求這n個實數在數軸上相鄰2個數之間的最大差值,設計解最大間隙問題的線性時間演算法
分析:輸入n個實數時是無序的,但不能排序,一旦排序就不滿足"線性時間演算法"要求
最直接的方法:
接收n個輸入的實數後,排序(從小到大或者從大到小都可以),再計算它們之間的間隙,找出最大的間隙。
但是這種排序不是線性時間演算法。
可以用鴿籠原理(也叫做抽屜原理)解決
步驟:1、接收輸入的實數,找出最大值和最小值
2、max和min可以通過遍歷得知,把min到max之間的間隙等分,分成n-1個區間,每個區間都是大小相等的。
那麼,min屬於第乙個區間,max屬於最後乙個區間。並且第i個區間的上限是第i+1個區間的下限。每個區間的大小為
gap=(max-min)/(n-1)
3、把除去max和min的另外n-2個數放到n-1個區間裡。numofbucket是每個實數所屬的區間號,count陣列中對應的那個值加1,
證明該區間擁有至少乙個實數。
把low[i]設定成max,把high[i]設定成min,是為了便於後面的判斷
4、最後判斷最大的間隙時,如果乙個區間內有兩個或者以上的實數,那麼它們之間的間隙肯定不是最大的,因為這些數都
擠到一塊了。相反,跨區間的數才可能產生最大的間隙
#includeint main()
} //把除去max和min的另外n-2個數放到n-1個區間裡
int*count=new int[n-1];
float*high=new float[n-1];
float*low=new float[n-1];
float gap=(max-min)/(n-1);
for(i=0;ihigh[numofbucket]) }
//第乙個區間裡面肯定有數,最起碼min在裡面
float temp=0;
float left=high[0]; //第乙個桶裡肯定有數
//輸出最大的間距
for(i=1;itemp)
temp=low[i]-left;
left=high[i];
} }
printf("%.2f\n",temp);
return 0;
}
最大間隙問題
最大間隙問題 問題描述 最大間隙問題,給定n 11,x2,xn,求這n個數在實軸上相鄰2個數之間的最大差值。假設對任何實數的下取整函式耗時o 1 設計乙個計算複雜性最低的演算法解決最大間隙問題。演算法設計 對給定的n個實數x1,x2,xn,計算它們的最大間隙。資料輸入 輸入資料由檔名為 zdjian...
最大間隙問題
問題描述 最大間隙問題 給定n 個實數x1,x2 xn,求這n 個數在實軸上相鄰2 個數之間的最大差值。假設對任何實數的下取整函式耗o 1 設計解最大間隙問題的線性時間演算法。程式設計任務 對於給定的n 個實數x1,x2,xn,程式設計計算它們的最大間隙。資料輸入 輸入資料由檔名為input.txt...
最大間隙問題
給定n個實數,求出相鄰的兩個數,這兩個數的差值是所有相鄰數的最大 例如 1 3 7,8,則答案是3,7 思想如下 找出最大值和最小值,則所有的兩個數 m n max min n 1 因此,設定n 1 個區間,區間長度為 max min n 1,將所有數按照與min的差值對映到這些區間裡 則所有的兩個...