接口設計中的「最大熵」原則

什麼是「熵」?信息論中的「熵」用來描述信息量,信息量越高,熵就越低,反之越高。在天然語言處理中,咱們經常使用最大熵模型,顧名思義,最大熵指的是信息量最小,也就是在原有的信息自己基礎之上,不去假設新的信息量,使整個系統的熵達到最大。最大熵模型在天然語言處理中之因此能達到不錯的效果,其內在牽扯到天然界的規律。天然界造就的系統在沒有外來能量補充的狀況下老是熵增的,並且趨向於最大。看到一盒火柴灑在地上,若是結果很混亂,那纔是天然的,若是仍是很整齊的擺放着,咱們就會懷疑是否是別人故意給擺好的。數組

固然,今天咱們不討論最大熵模型,咱們討論「最大熵」原則在程序接口設計中的指導做用。函數

考慮一個簡單的冒泡排序程序,我編寫了以下函數: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標準模板庫的設計原理也是基於此。排序

今天的例子舉得很簡單,時間有限,點到即止。謝謝閱讀,水平有限,歡迎指正錯誤。接口

相關文章
相關標籤/搜索