2016-05-01 7 views
0

Ich fand schließlich einen Code möglicherweise Shannon Entropy Berechnung funktioniert, aber da ich C# überhaupt nicht völlig verstehe, könnte jemand mir helfen, es vollständig zu begreifen ? Ich meine rein den Code zu verstehen, NICHT was er tut. Ich verstehe Delphi, wenn du fragst.Verständnis dieses C# -Codes, ich meine nur den Code, nicht die Theorie von Entropie

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

"Was" über den Code ist unklar? Es gibt eine Methode, zwei Schleifen über Sequenzen, einige Variablen mit Zuweisungen, ein Dictionary und etwas Mathe. Sehr prozedural, wie Delphi. – user2864740

+0

@ user2864740 das Wörterbuch ist mir unklar – Vlastimil

+0

Es hat die gleiche Rolle wie ein TDictionary in Delphi: http://delphi.about.com/od/beginners/a/using-t-dictionary-hash-tables-in-delphi .htm - siehe http://www.dotnetperls.com/dictionary, https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.110).aspx usw. – user2864740

Antwort

1
  1. Sie haben eine Funktion ShannonEntropy genannt, die s einen String und gibt etwas vom Typ double (im Grunde eine Fließkommazahl).
  2. Sie instanziieren eine Karte (Wörterbuch) von Zeichen -> Ganzzahlen und nennen es map.
  3. Schleife über jedes Zeichen in der Zeichenfolge s. Überprüfen Sie während dieser Schleife, ob sich der Charakter in unserer Karte befindet (map). Ist dies nicht der Fall, mappen Sie dieses Zeichen auf 1. Wenn es sich bereits in der Karte befindet, erhöhen Sie den Wert. Am Ende haben wir eine Karte von jedem Charakter zu einer Zählung, wie oft es in s erscheint.
  4. Deklarieren einen double Namen result und setzte es 0.
  5. eine ganze Zahl len genannt angeben, die die Länge der Eingabezeichenfolge ist.
  6. Schleife über jedes Zeichen in unserer Karte. Während der Schleife berechnen wir die Häufigkeit, wie oft sie auftritt.
    • Wir erklären, eine Variable namens frequency und legen Sie es auf den Zählwert (der Wert, den wir in der Karte gespeichert) durch die Länge des Strings aufgeteilt - so die Frequenz auf den prozentualen Anteil der einzelnen Zeichen gesetzt wird, dass jeder in s erscheint Zeit wir Schleife.
    • Jetzt nehmen wir die Häufigkeit (der Prozentsatz, den das gegebene Zeichen erschien) und multipliziere es mit dem Log (Basis 2) der Frequenz, nimm das Produkt und subtrahiere es von result (was ursprünglich 0 war).
  7. Sobald wir mit dem Schleifen fertig sind, geben wir die result zurück.
0

Var initialisiert variable map, neues Dictionary hat dem var ein Dictionary hinzugefügt. dictionary gibt dem String oder einem char-Wert einen ganzzahligen Wert, sagen wir Rot = 1, Blau = 2, Grün = 3 usw. Ich denke foreach lässt die Schleife so lange laufen, wie es char in String gibt. Sie müssen wissen, ob() es kompiliert den Code nur, wenn die Anweisung innerhalb ist wahr oder falsch wie in diesem Fall.Math.log ist eine Methode. Am Ende geben wir das Ergebnis zurück. Ich bin nicht sehr vertraut mit C# Ich bin vertrauter mit c und Java.

Verwandte Themen