Hallo!
Ich suche eine Funktion in php oder c++, die mir in halbwegs kurzer Zeit ausgibt, wie oft Strings in einem Array vorkommen. Und zwar möcht ich von allen Strings im Array wissen, wie oft sie vorkommen. Die größe des Arrays ist bei ungefähr 30.000-50.000 String-Einträgen, also ziemlich groß. Kennt wer eine ähnliche Funktion?
Wie oft ist ein String in einem Array?
-
-
ich würde empfehlen, das array mit einer schleife zu durchlaufen und von jedem string einen hash zu berechnen (hash funktionen sind bei php eingebaut). dann brauchst du nur noch ein zweites array, in dem die jeweiligen hashwerte eine zahl zugeordnet bekommen (vorkommen).
-
An das hab ich auch schon gedacht, aber vielleicht gibts schon eine ähnliche Funktion in irgendeiner Lib, die schneller ist.
-
Assoziative Arrays würden sich in PHP anbieten, wobei ich aber nicht weiß wie gut oder schlecht da die Performance ist. Ich würde es einfach mal ausprobieren.
Mit Hash-Werten wäre ich eher vorsichtig, weil die u. U. nicht eindeutig sind, wodurch ein Eintrag im String-Array in seltenen Fällen den falschen Zähler im 2. Array hochzählen kann. Es kommt jetzt darauf an ob es exakt stimmen muss oder ob es reicht wenn es "fast stimmt" (wenn es z.B. eine Statistik ist).
-
Assoziative Arrays würden sich in PHP anbieten, wobei ich aber nicht weiß wie gut oder schlecht da die Performance ist. Ich würde es einfach mal ausprobieren.
Notfalls kann man sich auch assoziative Arrays mittels AVL-Bäumen oder sowas selber basteln. Jedenfalls ist so ziemlich jede Datenstruktur besser als ein unsortiertes Array von Strings mit Mehrfachvorkommen...ZitatMit Hash-Werten wäre ich eher vorsichtig, weil die u. U. nicht eindeutig sind
Trotzdem ein großer Schritt vorwärts, wenn man nur noch eine (normalerweise sehr kurze) Liste von Strings mit genau dem Hashwert betrachten muß. -
Ich komm grad drauf, dass die Liste alphabetisch sortiert ist, was die Sache um einiges erleichtert..
Danke für die Antworten.
mfg -
wenn die liste alphabetisch sortiert ist bietet sich ja eine binaere suche an.
@assoziative arrays: bin mir nicht sicher wie das in PHP ist, aber in der regel werden solche dictionary structuren durch hashtabellen realisiert und der zugriff ist sehr schnell. Besonders auch, da assoziative arrays in PHP direct in C implementiert sind.
@AVL baume, häufigkeit von strings, komplexe fragen auf eine grosse datenmenge:
Hier gibt es einen (wie ich finde recht coolen) trick: Anstatt eines Arrays benutzt man als Datenstruktur eine in-memory SQLite datenbank!
Hab ich persoenlich noch nicht gemacht, aber es klingt sehr vielversprechend:
Die daten kann man ansprechen wie jede andere datenbank auch ("select count(string) from strings where string = ...")
Es gibt kaum mehraufwand im code. Eine im memory datenbank anlegen und darin suchen erfordert fast so wenig zeilen code wie die pure array variante. Zumindest in Ruby und Python aber in PHP geht das sicher auch recht schick, da PHP ja soweit ich weiss SQLite seit Version 5 schon mit dabei hat.
SQLite ist extrem effizient, da es wie jedes andere RDBMS intern mit AVL Baumen arbeitet. Man kann auch Indicies auf die spalte legen.
SQLite ist in C und auf performance programmiert. da geht die post ab.
-
binäre Suche? Nein das geht hier nicht.. ich such ja nicht nach einem String, sondern ich such nach den Vorkommnissen aller Strings in dem Array. Wobei ich nicht mal alle Elemente in ein Array speichern werd. 50.000 Strings in ein Array.. nein ich werd eine Liste machen.. einen Eintrag nach dem anderen einlesen und mit dem nächsten vergleichen. Wenn der Eintrag der gleiche ist, dann inkrementier ich das Ergebnis für den String, ansonsten häng ich ein neues Element mit dem aktuellen String an die Liste. Ich glaub so isses relativ schnell.
-
binäre Suche? Nein das geht hier nicht.. ich such ja nicht nach einem String, sondern ich such nach den Vorkommnissen aller Strings in dem Array.
Sobald du mittels Binärsuche ein Vorkommen vom String gefunden hast, kannst du schauen, wie oft vor und nach diesem der gleiche vorkommt und hast auch die Anzahl der Vorkommen.Zitatnein ich werd eine Liste machen.. einen Eintrag nach dem anderen einlesen und mit dem nächsten vergleichen. Wenn der Eintrag der gleiche ist, dann inkrementier ich das Ergebnis für den String, ansonsten häng ich ein neues Element mit dem aktuellen String an die Liste. Ich glaub so isses relativ schnell.
Was heißt "relativ" schnell? Wenn du wenige unterschiedliche Strings hast, dann ist ein Array mit Binärsuche sicher besser. Wenn du viele verschiedene Strings hast, dann nimm zumindest einen binären Suchbaum statt einer Liste... Es gibt einiges, was besser ist als lineare Suche. -
vielleicht bringts aber auch das?
http://at.php.net/manual/en/function.array-count-values.php -
Nein PHP hab ich ausgeschlossen, aber das Programm steht längst. Es war nicht durchgängig sortiert, damit hab ich die binäre Suche auch nicht machen können. Ich habs linear gemacht, aber ein bisschen optimiert. Und zwar hab ich den Anfangsbuchstaben geprüft, bevor ich den ganzen String verglichen hab. Zusätzlich hab ich schon erkannte/vorgekommene Strings markiert, damit ich sie nicht nochmal vergleichen muss. Somit hab ich viel Zeit gesparrt und für meine Anwendung reichts. Danke.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!