Autor Beitrag
zongo-joe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 134

win xp prof
D3, D4, D7
BeitragVerfasst: Fr 31.10.08 15:50 
Tach zusammen,
ich möchte mit einer liste von etwa 20.000 strings arbeiten (medizinische Codes), in dieser Liste muss ich sortieren, suchen und eine Ähnlichkeitssuche starten (also zB nach Begriffen, die in den Codes vorkommen, suchen).
Da ich keine Ahnung von Datenbanken habe: womit bin ich denn in Delphi am schnellsten, das Arbeiten mit Arrays ist ja net so flott, und auch ne Stringlist hat da keine wesentliche Verbesserung gebracht.
Hat noch einer von Euch einen besseren Vorschlag ?
Danke & Gruß,
Zongo
delphiprogrammierer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Fr 31.10.08 16:01 
Ich würde eine Objectliste machen und dort meine Objecte reinstellen. Die Objekte enthalten dann unter anderem diese Strings.

Ein Array halte ich hier für nicht geeignet.

Happy Helloweeeeeeeen
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 31.10.08 16:29 
Da eine Stringlist auch nur ein Array ist, ist der geringe Unterschied nicht so überraschend. Auch eine Objectlist ist nur ein Array. So pauschal lässt sich das nicht sagen, was da besser ist.

Wie baust du denn das Array (die Stringlist) auf? Wie kommen die Elemente da rein? Wie werden die sortiert? Wie suchst du? Und wie machst du die Ähnlichkeitssuche?

_________________
We are, we were and will not be.
zongo-joe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 134

win xp prof
D3, D4, D7
BeitragVerfasst: Fr 31.10.08 22:50 
sorry, war etwas gehetzt afk

also die Daten lese ich aus einer einfachen textdatei ein und bisher habe ich ein großes array definiert und suche einfach (bei bekanntem Anfang des Suchbegriffs) binär oder (wenn nur Mittelteile des Suchbegriffs bekannt sind) mit ner FOR-Schleife, aber das dauert halt sehr lang...

Wie geht denn das schlauer ?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 31.10.08 22:55 
Ne hashmap oder eine kleine Access-DB.

_________________
Na denn, dann. Bis dann, denn.
zongo-joe Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 134

win xp prof
D3, D4, D7
BeitragVerfasst: Fr 31.10.08 22:59 
na ja, mit DBs kenn ich mich halt gar nicht aus, hab ich noch wie was gemacht.

was ist ne Hashmap ?
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 31.10.08 23:19 
Eine Hashmap ist eine Datenstruktur, die sehr schnell 'Schlüssel' findet. Für Ähnlichkeitssuchen (eben gelesen) ist sie aber nicht geeignet.

_________________
Na denn, dann. Bis dann, denn.
matze
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 4613
Erhaltene Danke: 24

XP home, prof
Delphi 2009 Prof,
BeitragVerfasst: Mo 03.11.08 10:17 
Also eine StringList die du auf sorted := true stellst ist schon mal recht fix, wenn du per IndexOf nach den Elementen suchst.
Mach doch mal ein Testprogramm in dem du dein Szenario mit einer Stringliste und mit einer HashedStringList (unit INI Files) realisierst.

_________________
In the beginning was the word.
And the word was content-type: text/plain.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 03.11.08 12:50 
Sobald du eine Ähnlichkeitssuche machen musst, wirst du immer Geschwindigkeitsprobleme bekommen, da du keinen Schlüssel verwenden kannst.

Gibt es bei der Ähnlichkeitssuche irgendwelche Strukturen, die du nutzen kannst? Ich denke da z.B. an strukturen in den Nummern, die du durchsuchst. Wenn die Nummer in Blöcke geteilt ist und man die Nummer im zweiten Block durchsuchen will, dann bietet es sich an, mehrere Listen zu verwalten.

Beispiel:
Nummern
123 456789
123 423879
123 037561
-
124 436568
124 054715
-
125 476942
125 031278

Damit machst du drei Listen. In jeder sind nur die Nummern des eigenen Blocks drin.
Wird nun nach dem zweiten Block gesucht, musst du nur noch in jeder Liste Schlüssel-Suche machen. Dadurch musst du zwar mehrere Listen durchsuchen, musst aber kein Full-Scan der Gesamtliste machen.
Ist die ganze Nummer bekannt, musst du nur noch in einem Block suchen, was ebenfalls ein Geschwindigkeitsvorteil sein sollte.

Das einzige, was langsamer sein wird, ist das Einlesen der Daten. Aber das sollte eigentlich auch nur am Anfang einmal gemacht werden. Oder ändert sich die Liste ständig?
zuma
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 660
Erhaltene Danke: 21

Win XP, Win7, Win 8
D7 Enterprise, Delphi XE, Interbase (5 - XE)
BeitragVerfasst: Mo 03.11.08 13:00 
Ich würde stattdessen ein Clientdataset nutzen.
Suchen(locate auf gewünschtes Feld) und Sortieren geht da recht fix.
Ähnlichkeitssuche kann man da prima mit Filtern machen.

_________________
Ich habe nichts gegen Fremde. Aber diese Fremden sind nicht von hier! (Methusalix)
Warum sich Sorgen ums Leben machen? Keiner überlebts!