Ben Kriemann: Mehrere Wörter in einem Text finden - Bitte um Optimierung

Hallo!

Ich möchte einen rund 5000 Zeichen langen Text auf das Vorhandensein verschiedener Wörter überprüfen, welche in einer Datenbank abgespeichert sind (ca. 500 Einträge).

Derzeit lade ich die kompletten Daten und durchlaufe dann den Text:

$text = "Ganz langer Text";
$words = "Folgende Wörter kommen im Text vor:<br><br>";

$words_result = mysql_query("SELECT name FROM tabelle ORDER BY name");
while($words_tmp = mysql_fetch_array($words_result)) {
if(strstr($text,$words_tmp[name])) {
  $words .= $words_tmp[name]."<br>"; } }

Eben musste ich jedoch feststellen, dass diese Methode mit rund 0,8 Sekunden ziemlich lange dauert, was bei einem 500-fachen Durchlauf des Textes eigentlich auch kein Wunder ist. Daher hoffe ich, dass mir jemand von Euch einen Vorschlag bringen kann, wie sich das Ganze optimieren lässt.

Mit bestem Dank im Voraus,
Ben

  1. gudn tach!

    Ich möchte einen rund 5000 Zeichen langen Text auf das Vorhandensein verschiedener Wörter überprüfen, welche in einer Datenbank abgespeichert sind (ca. 500 Einträge).

    zwei ideen dazu, ohne dass ich mir jetzt ueber geschwindigkeit naehere gedanken gemacht habe:

    1. du kannst mal probieren zunaechst den haystack zu splitten (d.h. in die einzelnen woerter aufzuteilen), anschliessend in einen binaeren baum zu sortieren und anschliessend mit 500 binaeren suchdurchlaeufen nach den woertern suchen.

    oder 2. du sortierst beide listen, also haystack (wieder gesplittet) und needles und arbeitest dann beide "parallel" ab, soll in pseudo-code etwa heissen

    i = 0;
    n = needle(i);
    treffer = array();
    foreach h (haystack){
      if(h<n) next; % diese zeile ist eigentlich redundant
      while(h>n) n=needle(++i);
      if(h==n) push(treffer, h);
    }

    prost
    seth