鴿舍原理求最大間隙

2021-07-23 03:29:16 字數 2709 閱讀 5877

鴿舍原理:也稱"抽屜原理"或利克雷原則,它是乙個重要而又基本的數學原理,應用它可以解決各種有趣的問題,並且常常能夠得到令人驚奇的結果,許多看起來相當複雜,甚至無從下手的問題,利用它能很容易得到解決。

原理1:把n+1個元素分成n類,不管怎麼分,則一定有一類中有2個或2個以上的元素。

原理2:把多於m×n個物體放到n個抽屜裡,那麼一定有乙個抽屜裡有m+1個或者m+1個以

上的物體。

原理2-1:把m個元素任意放入n(n<=m)個元素,則一定有乙個集合至少有k個元素。

其中 k= [m/n](表示向上取整)。

(抽屜原理的一般含義為:"如果每個抽屜代表乙個集合,每乙個蘋果就可以代表乙個元素,假如有 n+1或多於n+1個元素放到n個集合中去,其中必定至少有乙個集合裡至少有兩個元素。" )

-----

鴿舍原理求最大間隙:

問題描術:

最大間隙問題:給定n個實數x1,x2,……,xn,求這n個數在實軸上相鄰2個數之間的最大差值。假設對任何實數的下取整方法耗時為o(1),設計解最大間隙問題的線性時間演算法。

程式設計任務:

對於給定的n個實數x1,x2,……,xn。程式設計計算它們的最大間隙。

輸入: 5

2.3 

3.1 

7.5 

1.5 

6.3輸出:

3.2

**如下:

#include

#include

#include

#include

#include

#include  

//for memset()

#include  

//for floor()

#define _print_ 0

using namespace std;

//開啟檔案,將資料儲存到vector型別的vec中

template

int readfile(string filename, vector &vec)

string str("");

getline(ifile, str);//第一行資料總個數,也可以直接統計vec長度

str = "";

while (getline(ifile, str))

else  

} }

return vec.size(); }

//列印vector模板中的元素

template

inline void printvec(vector &vec)

std::cout << std::endl; }

//找到vector中最小值對應的下標

template

inline int getminindex(vector &vec)

} return min_index; }

//找到vector中最大值對應的下標

template

inline int getmaxindex(vector &vec)

} return max_index; }

//獲得最大間隙

template

t getmaxgap(int n,vector &vec)

bucket;

int max_index = getmaxindex(vec);

int min_index = getminindex(vec);

t maxnum = vec[max_index];

t minnum = vec[min_index];

t buck_len = (maxnum - minnum)*1.0 / (n-1);

bucket* buck = new bucket[n - 1];

memset(buck, 0, (n - 1)*sizeof(bucket));

int buck_num(0);

//將n個元素每個元素放置到對應的桶內

buck[0].low = minnum; buck[0].high = minnum; buck[0].hasnum = true;

buck[n - 2].low = maxnum; buck[n - 2].high = maxnum; buck[n - 2].hasnum = true;

for (int i = 0; i < n; ++i)

else

else if (vec[i] < buck[buck_num].low)

} }

//在n-1個桶的邊界找到最大間隔

t maxgap = 0;

t curgap=0;

int pre_index = 0; 

//上乙個非空的桶的位置

for (int i = 1; i <= n - 2;++i)

pre_index = i; }

} delete buck;

return maxgap; }

//將資料寫入output檔案

template

inline int writefile(string filename, t n)

ofile << n;

cout << "write over." << endl;

return 0; }

int main()

#endif

return 0;

}

letcode 164求最大間距(鴿巢原理)

給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。輸入 3,6,9,1 輸出 3 解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。輸入 10 輸出 0 解釋 陣列元素個數小於 2,因此返回 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...