2016-05-01 27 views
0

我終於找到一個代碼可能工作香農熵計算,但由於我不完全理解C#,有人可以幫助我完全掌握它?我的意思是純粹理解代碼,而不是它在做什麼。如果你問,我確實瞭解德爾福。瞭解這個C#代碼,我的意思是隻有代碼,而不是Entropy的理論

public static double ShannonEntropy(string s) 
{ 
    var map = new Dictionary<char, int>(); 
    foreach (char c in s) 
    { 
     if (!map.ContainsKey(c)) 
      map.Add(c, 1); 
     else 
      map[c] += 1; 
    } 

    double result = 0.0; 
    int len = s.Length; 
    foreach (var item in map) 
    { 
     var frequency = (double)item.Value/len; 
     result -= frequency * (Math.Log(frequency)/Math.Log(2)); 
    } 

    return result; 
} 
+0

關於代碼的「什麼」不清楚?有一種方法,序列上的兩個循環,一些賦值變量,一個Dictionary和一些數學......非常程序化,就像Delphi。 – user2864740

+0

@ user2864740字典我不清楚 – Vlastimil

+0

它與Delphi中的TDictionary具有相同的作用:http://delphi.about.com/od/beginners/a/using-t-dictionary-hash-tables-in-delphi .htm - 請參閱http://www.dotnetperls.com/dictionary,https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx等 – user2864740

回答

1
  1. 您有一個名爲ShannonEntropy這需要一個字符串s並返回double類型的東西功能(基本上是一個浮點數)。
  2. 您實例化一個字符 - >整數的地圖(字典),並將其稱爲map
  3. 循環字符串s中的每個字符。在該循環期間,檢查角色是否在我們的地圖中(map)。如果不是,則將該字符映射到1.如果它已經在映射中,則增加該值。最後,我們會將每個角色的地圖顯示在s中。
  4. 聲明一個double名稱result,並將其設置爲0。
  5. 聲明稱爲len的整數,其是輸入字符串的長度。
  6. 循環遍歷我們地圖中的每個字符。在循環過程中,我們將計算出現頻率的頻率。
    • 我們宣佈了一個名爲frequency變量,並將其設定爲計數由字符串的長度除以(我們存儲在地圖中的值) - 這樣的頻率被設置爲每個字符的出現在s每一個百分比我們循環的時間。
    • 現在我們將頻率(給定字符出現的百分比)乘以頻率的對數(基數2),取出產品並從result(最初爲0)中減去它。
  7. 一旦我們完成循環,我們返回result
0

Var正在初始化變量映射,新的字典已經向var添加了一個字典。字典給字符串或char值一個整數值,讓我們說,紅色= 1,藍色= 2,綠色= 3等。我認爲foreach只要字符串中存在char就運行循環。 您必須知道if()它是否僅在內部語句爲true或false時才編譯代碼,因爲在這種情況下.math.log是一種方法。最後我們返回結果。我對c#不是很熟悉,我更熟悉c和Java。