最大間隙問題

2021-07-22 09:59:57 字數 1192 閱讀 3330

最大間隙問題 

給定 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的差值對映到這些區間裡 則所有的兩個...