2016-05-01 10 views
0

私はついにシャノンエントロピーの計算を行うコードを見つけましたが、C#を完全に理解していないので、 ?私は純粋にコードを理解していて、何をしているのではないのですか?私はあなたが尋ねるならば、デルファイを理解しています。このC#コードを理解すると、エントロピーの理論ではなく、コードだけを意味する

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

「コードについて」は不明ですか?メソッド、2つのループのシーケンス、いくつかの変数の代入、辞書、いくつかの数学..非常に手続き型、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. あなたは、文字列sを取り、タイプdouble(基本的には浮動小数点数)の何かを返すShannonEntropyと呼ばれる機能を持っています。
  2. 文字 - >整数のマップ(辞書)をインスタンス化し、mapと呼んでください。
  3. 文字列内のすべての文字をループします(s)。そのループ中にキャラクターがマップにあるかどうかを確認します(map)。一致していない場合は、その文字を1にマップします。マップ内に既に存在する場合は、値を増やします。最後に、各文字のマップを表示する頻度をsにします。
  4. doubleresultを宣言し、入力文字列の長さであるlenと呼ばれる整数を宣言し、それを0
  5. を設定します。
  6. マップのすべての文字をループします。ループの間に、それが現れる頻度の頻度を計算します。
    • 我々はfrequencyという変数を宣言し、文字列の長さで割った数(私たちはマップに格納された値)に設定します - ので、周波数がすべてのsに表示される各文字の割合に設定されます私たちはループします。
    • 周波数(所与の文字が現れた割合)を取り出し、周波数のログ(基数2)で乗算し、製品を取り出してresult(これは最初は0)から引きます。
  7. ループが終了すると、resultが返されます。
0

Varは変数マップを初期化しています。新しい辞書はvarに辞書を追加しました。辞書は文字列またはchar値に整数を与えます。Value、red = 1、blue = 2、green = 3などとしましょう。私は、文字列にcharがある限り、foreachはループを実行すると思います。 if()は、内部のステートメントがこのケースのように真または偽である場合にのみコードをコンパイルすることを知っている必要があります..math.logはメソッドです。最後に結果を返します。私はCに精通していません。#私はCとJavaに精通しています。

関連する問題