什麼是「熵」?信息論中的「熵」用來描述信息量,信息量越高,熵就越低,反之越高。在天然語言處理中,咱們經常使用最大熵模型,顧名思義,最大熵指的是信息量最小,也就是在原有的信息自己基礎之上,不去假設新的信息量,使整個系統的熵達到最大。最大熵模型在天然語言處理中之因此能達到不錯的效果,其內在牽扯到天然界的規律。天然界造就的系統在沒有外來能量補充的狀況下老是熵增的,並且趨向於最大。看到一盒火柴灑在地上,若是結果很混亂,那纔是天然的,若是仍是很整齊的擺放着,咱們就會懷疑是否是別人故意給擺好的。數組
固然,今天咱們不討論最大熵模型,咱們討論「最大熵」原則在程序接口設計中的指導做用。函數
考慮一個簡單的冒泡排序程序,我編寫了以下函數:spa
1 void sort(int a[],int n) 2 { 3 int i,j,t; 4 for(j=0;j<n-1;j++){ 5 for(i=0;i<n-1-j;i++){ 6 if(a[i]>a[i+1]){ 7 t=a[i]; 8 a[i]=a[i+1]; 9 a[i+1]=t; 10 } 11 } 12 } 13 }
這個函數有什麼問題?確實沒有問題,由於它能正確給int類型的數組排序。可是若是咱們的數組不是int類型的呢?這樣,咱們的函數就無法使用了。之因此設計出以上的代碼,就是由於我沒有考慮的「最大熵」原則,即我假設了個人函數只用來爲int類型的數組排序,「int類型」是我在原有信息之上添加的信息,無形中我讓熵減少了,限制了程序的使用範圍。因此,通過一番改進,獲得了下面的程序:設計
1 template <class T>void sort(T a[],int n) 2 { 3 int i,j; 4 T t; 5 for(j=0;j<n-1;j++){ 6 for(i=0;i<n-1-j;i++){ 7 if(a[i]>a[i+1]){ 8 t=a[i]; 9 a[i]=a[i+1]; 10 a[i+1]=t; 11 } 12 } 13 } 14 }
在這裏,我使用了C++的模板技術,將熵增長了,這樣,就能接受任意支持比較操做符和賦值操做符的類型的數組了。滿意了嗎?不,其實熵仍是挺小的,由於咱們還只能接受數組輸入,這裏的數組又是咱們假設的信息量。若是不是數組咱們的函數就無法解決這個排序問題了。其實咱們能夠發現,這個函數的排序過程其實並不要求輸入必定是數組,只要輸入類型支持下標操做符,就能夠用冒泡法進行排序,因而,獲得了下面的程序:code
1 template <class T,class In> 2 void sort(In input, int n) 3 { 4 int i, j; 5 T t; 6 for (j = 0; j<n - 1; j++){ 7 for (i = 0; i<n - 1 - j; i++){ 8 if (input[i]>input[i + 1]){ 9 t = input[i]; 10 input[i] = input[i + 1]; 11 input[i + 1] = t; 12 } 13 } 14 } 15 }
這樣的話,即便咱們傳入一個vector類型,sort函數不用修改就能夠直接可用。blog
用模板來增長信息熵,使得程序的適用範圍迅速擴大,因而可知C++模板功能之強大,C++語言中STL標準模板庫的設計原理也是基於此。排序
今天的例子舉得很簡單,時間有限,點到即止。謝謝閱讀,水平有限,歡迎指正錯誤。接口