1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Wie oft ist ein String in einem Array?

    • Suche
  • Swoncen
  • 30. August 2006 um 17:05
  • Unerledigt
  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 30. August 2006 um 17:05
    • #1

    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?

    640K ought to be enough for anybody. :eek2:

  • mdk
    26
    mdk
    Emeritus
    Reaktionen
    130
    Punkte
    7.120
    Beiträge
    1.390
    • 30. August 2006 um 17:10
    • #2

    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).

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 30. August 2006 um 17:18
    • #3

    An das hab ich auch schon gedacht, aber vielleicht gibts schon eine ähnliche Funktion in irgendeiner Lib, die schneller ist.

    640K ought to be enough for anybody. :eek2:

  • Christoph R.
    16
    Christoph R.
    Mitglied
    Reaktionen
    36
    Punkte
    2.626
    Beiträge
    428
    • 30. August 2006 um 17:57
    • #4

    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).

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 30. August 2006 um 18:18
    • #5
    Zitat von Christoph R.

    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...

    Zitat

    Mit 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ß.

    *plantsch*

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 30. August 2006 um 18:34
    • #6

    Ich komm grad drauf, dass die Liste alphabetisch sortiert ist, was die Sache um einiges erleichtert..

    Danke für die Antworten.

    mfg

    640K ought to be enough for anybody. :eek2:

  • a9bejo
    21
    a9bejo
    Mitglied
    Reaktionen
    42
    Punkte
    4.697
    Beiträge
    913
    • 30. August 2006 um 18:43
    • #7

    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.

    lg, Benjamin Ferrari, bookworm.at

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 30. August 2006 um 21:19
    • #8

    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.

    640K ought to be enough for anybody. :eek2:

  • Plantschkuh!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    Punkte
    6.173
    Beiträge
    1.181
    • 11. September 2006 um 18:57
    • #9
    Zitat von Swoncen

    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.

    Zitat

    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.


    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.

    *plantsch*

  • duracell
    5
    duracell
    Mitglied
    Punkte
    220
    Beiträge
    40
    • 12. September 2006 um 08:15
    • #10

    vielleicht bringts aber auch das?
    http://at.php.net/manual/en/function.array-count-values.php

  • Swoncen
    22
    Swoncen
    Mitglied
    Reaktionen
    1
    Punkte
    5.331
    Beiträge
    993
    • 12. September 2006 um 08:56
    • #11

    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.

    640K ought to be enough for anybody. :eek2:

  • Maximilian Rupp 27. Dezember 2024 um 12:05

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung