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