AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suchalgorithmus gesucht

Ein Thema von Daniel · begonnen am 9. Okt 2007 · letzter Beitrag vom 10. Okt 2007
 
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Suchalgorithmus gesucht

  Alt 9. Okt 2007, 15:12
Zitat von Daniel:
Hat einer von Euch mal ein Stichwort, nach welchen Verfahren ich da suchen könnte?
Dictionary Of Algorithms and Data Structures Algorithmen allgemein
Charras & Lecroq, Université de Rouen Stringmatching.

Du hast also 30000 kleine Strings und suchst in denen nach Teilstrings? Versuchs mal mit einer Klasse, die ich für eine schnelle inkrementelle Adressensuche geschrieben habe. Ich habe 100000 Adressen, in denen ich nach Namen/Strassen oder Teilen davon suchen muss. Das geht so schnell, das ich damit eine inkrementelle (While you type) darstellung der Ergebnisse hinbekomme (Suchzeit < 50ms). Ich breche allerdings nach 500 gefundenen Adressen ab... Je länger die Strings und je länger der Suchstring, desto schneller ist die Gurke.

Ich habe den Quicksearch-Algorithmus verwendet, einen vereinfachten Boyer-Moore. BM ist -in Delphi implementiert- nicht schnell genug (zuviel overhead), und da ich kein ASM verwende (zu blöd), hab ich eben den QS mit einer Optimierung von Raita implementiert.

Der DAWG von Hagen ist zwar viel schneller, verbrät aber so viel Speicher, das mein 2GB-Teil aufgegeben hat.

So in etwa sollte es funktionieren.

Delphi-Quellcode:
Var
  MyData : TcsPosList;
  iLine, iPos : Cardinal;

Begin
// Daten initialisieren
  MyData := TcsPosList.Create('\'); // Irgendein delimiter, der in deinen Strings nicht vorkommt.
  For i:=0 to 29999 do MyData.Add(DanielsKurzeStrings[i]); // Deine Zeilen in die Struktur einfügen
  MyData.Finalize; // Einfügen abschließen.
//
//
// Suche initialsieren (pro Pattern 1x)
  MyData.Pattern := 'FooBar'; // Suche nach "Foobar";

// Alles durchsuchen
  iLine := 0;
  iPos := 0;
  MyData.First;
  While MyData.FindNext(iLine, iPos, psContains) Do Begin // Oder '...psBeginsWith'
    ListBox1.Lines.Add (MyData.Lines[iLine]);
  End;
...
...
  MyData.Free;
End;
Probier mal, ob Du damit klar kommst (der Code ist selbstverständlich völlig unkommentiert )
Angehängte Dateien
Dateityp: pas csposlist_100.pas (7,7 KB, 26x aufgerufen)
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz