Buchstabenhäufigkeit in C#

Original von schmitti81
Kann ich da auch eine SortedList nehmen, oder ist die auch wieder langsamer.
Komm mit dem Array irgendwie gar nicht zurecht, wie das geht.

Gruß
schmitti81

Ich will nicht unhöflich klingen, aber dann solltest du wirklich mal einige Grundlagen lernen.
 
Ich weiß, aber ich schaff das am Besten mit einem Beispiel und ich find einfach nix passendes dazu.

Gruß
schmitti81

Edit: Ich weiß einfach nicht wie das Array auszusehen hat.
Code:
string[, ,] = new string[25, 25, 25];

Ist das richtig?
 
Aber wie kann ich dann da die Buchstaben speichern?
Oder speicher ich die gar nicht, sondern nur die Anzahl des Vorkommens,
also an Stelle 0 steht die Häufigkeit von a, an Stelle 1 die Häufigkeit von b usw.??
Danke.

Gruß
schmitti81
 
Original von lightsaver
du hast etwa folgende struktur mit dem array wie ich das meinte:

BS Index Anzahl
___________
| a | 0 | 113 |
|---|---|-------|
| b | 1 | 213 |
|---|---|-------|
| c | 2 | 131 |
|---|---|-------|
| d | 3 | 92 |
|---|---|-------|
| e | 4 | 113 |
|---|---|-------|
.
.
.

und in ascii:
.
.
.
______
| a | 97 |
|---|-----|
| b | 98 |
|---|-----|
| c | 99 |
|---|-----|
.
.
.

wenn du nun einfach mit ord(a) zum beispiel den wert von a holst bekommst du 97 (in c# mit (int) 'a') so, da nun die buchstaben halt die indizes 97 - 123 hätten, verschiebt man den index einfach, daher halt sowas in der art:

index = ((int) 'a') - 97;
array[index]++;

das 'a' ist dann natürlich der buchstabe an der aktuellen stelle. und so zählst du halt einfach nur die passende stelle im array hoch.

wenn du nun sagen wir mal alle vorkommen von 'c' in deinem text wissen willst guckst du einfach nur, was in array[2] steht.

das ist halt ne ganz simple aber vollkommen ausreichende und auch schnelle datenstruktur für dieses spezielle problem

hast es jetzt verstanden?

Hier steht es doch schon, man sollte auch die längeren komplett lesen.
 
die buchstaben stehen nicht drin! im array selber stehen nur die häufigkeiten. auf den buchstaben kannst du nur anhand des index der einzelnen felder im array schließen. die spalten mit bs und index aus meiner erklärung dienen nur der übersicht, die stehen dann aber so nicht im array! (wobei index ja indirekt schon, aber darum musst du dich nicht kümmern!)
 
Hab das jetzt mit einem Array probiert.
Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;

namespace array
{
    class Program
    {
        static void Main(string[] args)
        {
            testfunk();
        }

        public static void testfunk()
        {
            double[] haeufigkeit = new double[26];
            haeufigkeit[0] = 6.51;
            haeufigkeit[1] = 1.89;
            haeufigkeit[2] = 3.06;
            haeufigkeit[3] = 5.08;
            haeufigkeit[4] = 17.40;
            haeufigkeit[5] = 1.66;
            haeufigkeit[6] = 3.01;
            haeufigkeit[7] = 4.76;
            haeufigkeit[8] = 7.55;
            haeufigkeit[9] = 0.27;
            haeufigkeit[10] = 1.21;
            haeufigkeit[11] = 3.44;
            haeufigkeit[12] = 2.53;
            haeufigkeit[13] = 9.78;
            haeufigkeit[14] = 2.51;
            haeufigkeit[15] = 0.79;
            haeufigkeit[16] = 0.02;
            haeufigkeit[17] = 7.00;
            haeufigkeit[18] = 7.27;
            haeufigkeit[19] = 6.15;
            haeufigkeit[20] = 4.35;
            haeufigkeit[21] = 0.67;
            haeufigkeit[22] = 1.89;
            haeufigkeit[23] = 0.03;
            haeufigkeit[24] = 0.04;
            haeufigkeit[25] = 1.13;

//Feld mit Häufigkeiten von Buchstaben in Text
            int[] aiCount = new int[26];

//Beispieltext
            string satz = "fcu kuv gkp gkphcejgt vguvvgzv";
            int anzahl = 0;
            foreach (char buchs in satz)
            {
                if (buchs != ' ')
                {
                    anzahl++;
                    aiCount[(int)buchs - 97]++;
                }
            }
//            for (int i = 97; i < 123; i++)
            for (int i = 0; i < 26; i++ )
            {
                if (aiCount[i] != 0)
                {
                    char cha = Convert.ToChar((int)i+97);
                    Console.WriteLine("Buchstabe " + cha + " kommt: " + aiCount[i] + "mal vor!");
                }
            }
            double prozent = (double)anzahl / 100;
            
//Umrechnung der Anzahl der Buchstaben in Prozent
            for (int l = 0; l < 26; l++)
            {
                int momanz = aiCount[l];
                double neu = momanz + prozent;
                aiCount[l] = Convert.ToInt32(neu);
            }

//Differenz der Haeufigkeiten
            double umrechnung= 0.00;
            double umrechnung2 = 0.00;
            int zahl = 0;
            double[] za = new double[26];
//Einzelne Verschiebungen
            for (int a = 0; a < 26; a++)
            {
                zahl = a;

//Berechnung der Häufgikeitsdifferenz
                for (int k = 0; k < 26; k++)
                {
                    if (zahl > 25)
                    {
                        zahl = 1;
                    }
                    umrechnung2 = aiCount[k] - haeufigkeit[zahl];
                    zahl++;
                    umrechnung= umrechnung+ umrechnung2 * umrechnung2;
                }
                
                za[a] = umrechnung;
            }

//Wird so nicht mehr benötigt
//Momentan fester Verschiebungsfaktor al='f'
                foreach (char bulu in satz)
                {
                    char al = 'f';
                    if (bulu == ' ')
                    {
                        al = ' ';
                    }
                    else
                    {

                        if ('f' - 'e' < 0)
                        {
                            al = Convert.ToChar(bulu + ('e' - 'f'));
                            if (al > 122)
                            {
                                int gross = al - 122;
                                al = Convert.ToChar(96 + gross);
                            }
                        }
                        else
                        {
                            al = Convert.ToChar(bulu - ('f' - 'e'));
                            if (al < 97)
                            {
                                int klein = 97 - al;
                                al = Convert.ToChar(123 - klein);
                            }
                        }
                    }
//Entschlüsselten Text in Datei schreiben
                    FileStream fs2 = new FileStream("D:/test/test2.txt", FileMode.Append, FileAccess.Write);
                    StreamWriter sw = new StreamWriter(fs2);
                    sw.Write(al);
                    sw.Close();
                }
        }
    }
}
Nur irgendwie stimmt der Teil mit der Berechnung nicht(ab Differenz der Häufigkeiten).
Kann mir da vielleicht jemand weiterhelfen?

Ich möchte pro Buchstabe die Differenz der Häufigkeit berechnen, zum Quadrat nehmen und aufsummieren.
Die Verschiebung deren Summe am Kleinsten ist, ist dann die Entschlüsselung.
Aber meine Berechnung ist irgendwie falsch.

Danke
schmitti81
 
Zurück
Oben