Autor Beitrag
longhugo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35


Dephi 7, WinXP, C++
BeitragVerfasst: Di 27.09.05 07:40 
Hi Leute,

ich habe folgende Aufgabe: Es gibt einen Plain Text, in dem verschiedene
Sätze mit einem Marker gekennzeichnet sind. Der Marker hat immer den gleichen
Inhalt. Also z.B.: [Marker]Hier ist der erste Text[Marker]Hier kommt
wieder ein Stücktext[Marker]und so weiter.

Meine Frage: Was ist der optimale und performanteste Algorithmus, mit
dem ich den Text parse und die Marker finde, so dass ich den folgenden Text
extrahieren kann. Die Textdatei kann bis zu 100kb Plaintext sein.

Ist es am schnellsten mit Pos, mit Strcomp oder ggf. mit TParser oder doch
lieber mit 'nem Pointer? Sollte die Textdatei einem String zugeordnet werden
oder ist TStringStream oder TMemoryStream am schnellsten? Hat jemand damit Erfahrungen
gemacht? und wenn ja ggf. einen Codeschnipsel?

Viele Grüße
Hugo
arj
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 378

Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
BeitragVerfasst: Di 27.09.05 08:14 
Wenn es dir einfach nur darum geht diese Stellen herauszufinden sehe ich mehrere Möglichkeiten:
  • String-Such-Algorithmen (Boyle-Moore,...) -> Müsste ziemlich flott sein.
  • RegExp (Performance keine Ahnung, müsste man testen)

Ich würde den Text blockweise aus der Datei lesen (und dabei überprüfen ob du nicht zufällig gerade einen Marker in der Mitte getrennt hast :)) eventuell mit MMF (aber ob das soviel bringt kann ich dir auch nicht sagen), dann eine der obigen Methoden anwenden und jeden gefundenen in eine StringList schreiben. Wäre für mich das performanteste.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Di 27.09.05 15:40 
user profile iconarj hat folgendes geschrieben:

  • String-Such-Algorithmen (Boyle-Moore,...) -> Müsste ziemlich flott sein.
  • RegExp (Performance keine Ahnung, müsste man testen)


Das Ding heisst Boyer-Moore (nur damit googel was ausspuckt). RegExp sind nur dann schnell, wenn sie als DEA implementiert sind, sonst nicht so sehr. Andere Suchalgorithmen wäre KMP (Knuth-Morris-Pratt).
Such mal nacht FastStrings.pas bei den Schwyzern www.swissdelphicenter.ch oder bei torry oder den DSP. Das hat, glaube ich, sowas dabei... Warte mal... stimmt, ist dabei

www.droopyeyes.com/d...ShowProduct&ID=4
{Edit]
Ich würde Die Datei in einen Stream einlesen und mal schauen, ob ich Boyer-Moore direkt auf den Stream ansetzen kann. Wenn nicht, dann kopier den Filestream in einen Stringstream und setz BM auf den DataString an.
[/edit]
Viel spass.

_________________
Na denn, dann. Bis dann, denn.
longhugo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35


Dephi 7, WinXP, C++
BeitragVerfasst: Mi 28.09.05 14:22 
Faststrings ist echt optimal...danke für den Tipp...nu geht das ratz-fatz!