Christoph Zurnieden: HTML-Anwendung mit Suche auf CD-Rom

Beitrag lesen

Hi,

Es handelt sich nur um 300 bis 400 Wörter. Da dürfte das Aufsplitten nicht nötig sein.

Es geht hier nicht um die Wortanzahl, Herr Kollege, sondern um die Masse insgesamt. Das mögen zwar nur 300 Worte sein, aber wenn die Definitionen lang sind und auch dort gesucht werden soll kann man da auf die Schnauze fallen. Man kann modernen Browsern zwar viel zumuten, aber bei mehr als ca 500 kib könnte der eine oder andere schlapp machen (möcht' hier keine Namen nennen ;-); selbst wenn nicht würde der Rechner stark belastet. Fällt bei bei den modernen GHz-Boliden wahrscheinlich nicht auf, aber ich weiß ja nicht, wie Deine Kommilitonen ausgestattet sind.

Kannst du mir noch sagen, was du meinst mit

Wenn das nur die Fachwörter sind: lade einfach eine CSV-Datei als >>Javascript bzw statt CSV gleich ein fertiges JS-Array.

?
Ich habe für das Studium schon einige Sachen mit Javascript gebastelt, kann mich aber nicht an das Laden von CSV-Dateien erinnern. Wie funktioniert das?

Einfach in ein IFrame laden und per Javascript parsen.

Gibt es gute Dokumentationen darüber?

Ähh ... ah, doch:http://developer.apple.com/internet/webcontent/iframe.html

Hier im Archiv dürfte darüber aber auch einiges zu finden sein, das habe ich schon des öfteren einmal diskutiert gesehen.

Wenn es wirklich so wenig, wie oben angegeben sind, würde ich das aber direkt in ein Javascript-Array laden:

myArray = new Array(
  "wort1|wort2|definition",
);

Du kannst auch mehrdimensionale Arrays benutzen (ist einfacher und läßt sich etwas schneller durchsuchen), die kannst Du aber leider nicht direkt erzeugen, sondern mußt das nach und nach machen:

myArray    = newArray(Anzahl); // Anzahl muß nicht mitgegeben werden, ist dann aber leichter für den JS-Interpreter.

myArray[0] = new Array("wort1","wort2","definition1");
myArray[1] = new Array("wort3","wort4","definition2");
myArray[2] = new Array("wort5","wort6","definition3");
...

Es gibt hier einen Featureartikel darüber. Etwas anders gelöst aber im Grunde doch ziemlich gleich. Vor allem in der Problemstellung.

Was Du wahrscheinlich noch brauchst ist eine binäre Suche in Javascript.

Die Variable "lang" stellt hier den Zähler für das dreiteilige Unterarray:"Wort1,Wort2,Definition". Nicht vergessen: Arrays zählen ab 0, also ist "Wort1" auch Nummer 0!

function binSearch(needle, haystack, lang){

var low          = 0;
  var middle       = 0;
  var high         = haystack.length -1;

var round        = 0;

while(low <= high){
    round++;
    middle = Math.floor((low + high)/2);
    if(needle < haystack[middle][lang])
      high = middle - 1;
    else if (needle > haystack[middle][lang])
      low = mid + 1;
    else
       return middle;
  }
  return -1;
}

Vorsicht: ungetestet! (Aber in C hat's zumindest so funtkioniert ;-)

Wenn Du das Array derart gestaltest mußt Du da im schlimmstem Falle dreimal durch, wenn auch jedesmal nur mit O(log(n)). Du kannst auch ein assoziatives Array nehmen, aber da müßtest Du Dich entscheiden, welche Abteilung am meisten gesucht wird. Da in den Definitionen wohl eher selten gesucht wird, dürfte das "wort1" bzw "wort2" sein. Wenn es insgesamt jedoch _wirklich_ wenig Masse ist, könntest Du auch einfach zwei assoziative Arrays anbieten. Bezweifele aber einen deutlich spürbaren Effekt, da müßte die Kiste schon ziemlich lahm sein.

Ein Problem gibt es bei all dem noch: falsch geschriebene Worte und Suche mit regulären Ausdrücken (nein, ist im Endeffekt wirklich nur _ein_ Probem ;-). Das dürfte schwierig einzubauen sein wenn man auf die binäre Suche nicht verzichten möchte.

so short

Christoph Zurnieden