-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
16. Dez 2015
Das sehe ich auch so.
Es wäre halt einfacher, wenn man nur eine einfache "Id" als Integer übergeben müsste, die dann von der Komponente in einen passenden Hashwert umgerechnet wird.
Es würde Fehlermöglichkeiten halt auf einfache Weise reduzieren.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Man muss es halt richtig machen, damit es funktioniert. :-)
Der Fehler lag dann darin, dass ich GetHashCode unzureichend überschrieben habe.
Vielleicht wäre es gut gewesen, eine Funktion "DefiniereIntegerwertFürHashcodeBerechnung" zu haben, die man überschreiben kann.
Aber wenn man weiß wie, dann geht es ja auch so. :-)
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Ok, ich akzeptiere die Formel mal so. :-)
Warum der Strom aus der Steckdose kleckert kann ich ja auch nicht bis ins Detail erklären.
Die 3 Sekunden werden schon weitestgehend zum Erzeugen der Objekte und füllen mit Daten benötigt, das Dict braucht somit nur einige Millisekunden.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Ich habe das mal in mein Projekt eingebaut und komme so auf 3 Sekunden.
Ich ahne auch inzwischen, wo mein Denkfehler lag.
Ich dachte, ich übergebe in GetHashCode einen eindeutigen Integer oder Word-Wert und danach errechnet die Dictionary-Komponente daraus den "wirklichen" Hashwert für das korrekte Fach. M.E. war dieser auch abhängig von der Größe des Dictionarys.
Schließlich übergibt Sir...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Ok, sofern weitere Details interessant sind will ich mal ein wenig die Hosen runter lassen.
TGuid = record
private
...
public
...
class operator Equal(const Guid1, Guid2: TGuid): Boolean;
...
property TS1: TDateTime read get_TS1 write fTS1;
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Bei Video2Brain ist ein interessantes Tutorial zu Datenstrukturen und darin auch zu Hash-basierten Strukturen.
https://www.video2brain.com/de/videotraining/programmieren-lernen-datenstrukturen
Ist halt leider kostenpflichtig.
Das ist recht einfach gehalten und daher gut verständlich.
Was Emba im Detail umgesetzt hat kann ich nicht wirklich nachvollziehen.
Insbesondere erschließt sich mir...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Der Sir wollte nur zeigen, dass die Anzahl der Einträge letztlich kein Problem darstellt, was ich nun auch einsehe.
Offenbar muss man aber für die Berechnung des Hashwertes eine optimale Lösung finden, was mir vorliegend nicht gelungen ist.
Deshalb hat sich mein Dic nicht performant genug verhalten.
Aber ich habe mit der einfachen sortierten Liste eine für mich sehr gut passende...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Das verbitte ich mir! :stupid:
Die Zeiten messe ich schon richtig.
In Tausender-Schritten braucht der Import jeweils unter 1 Sekunde (da wird jeweils noch ein wenig mehr getan als nur ein Create).
Zweimal dauert es aber deutlich länger:
bei 197.000: (00:00:25)
bei 394.000: (00:02:55)
Es liegt offenbar wirklich daran, dass der Hashwert ungünstig ermittelt wird.
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
15. Dez 2015
Oh, ich habe jetzt mal mein Dictionary mit einer binären Liste (also Liste mit binärer Suche) ersetzt.
Es werden 420.000 Objekte erzeugt und gespeichert.
Das Ergebnis überrascht mich:
Dictionary:
420.000: (00:00:01) -> 00:06:57
Binäre Liste: (aufsteigend)
420.000: (00:00:00) -> 00:00:04
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
13. Okt 2015
@Sir Rufo
Also so völlig ohne Plan macht das m.E. keinen Sinn.
@Dejan Vu
Die Bilder sehen schön bunt aus. :-)
Sehr viel mehr verstehe ich da leider nicht. :oops:
Bis sich das Gegenteil erweist vertraue ich einfach mal drauf, dass das Dict mit meinem Integer gut zurecht kommt...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
12. Okt 2015
Hmm, ich sehe nicht, warum meine jetzige Lösung dann langsam sein soll.
Ich nutze Integerwerte 0..99999, die relativ gleichmäßig verteilt sind.
Also sind nachher bis 100.000 Töpfe vorhanden, die irgendwann einige Einträge enthalten.
Als alternatives Kriterium könnte ich meinen zweiten Zeitstempel nehmen. Der ist weitestgehend eindeutig, sollte also i.d.R. nur einmal im Projekt vorliegen....
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
12. Okt 2015
Hmm, dann habe ich Dich falsch verstanden. :-(
In meinem Fall gibt die Hashfunktion 0..99999 zurück.
Das wären doch dann bis 100000 Töpfe und wenige Kollisionen. -> https://de.wikipedia.org/wiki/Hashfunktion
Ist das nicht ok?
Nach meinem Gefühl wäre vielleicht ein div 10 oder div 100 sinnvoll, damit nicht so viele Töpfe angelegt werden!?
Was würde Deine Umrechnung bringen?
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
12. Okt 2015
Super, dann sollte alles passen.
Danke!
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
12. Okt 2015
Ok, vielen Dank!
Hier wurde das auch schon mal behandelt: http://www.delphipraxis.net/184801-duplicate-values-tdictionary.html ("Compare" gibt es allerdings nicht zum überschreiben.)
Grundsätzlich funktioniert es jetzt.
Aber was mir noch nicht ganz klar ist, ist was ich als GetHashCode angeben soll.
Macht der Comparer nochmal etwas mit meinem Result oder muss ich selbst etwas Sinnvolles...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
11. Okt 2015
Jetzt habe ich das Problem teilweise schon wieder. :-(
Mal ein paar Auszüge:
TGuid = record // eigene GUID
private
fTS1: TDateTime;
fTS2: TDateTime;
fC: LongWord;
function get_AsString: String;
function get_TS1: TDateTime;
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
8. Aug 2015
Komisch, ich habe mir mal zur Fehlersuche den Inhalt des Dictionarys ausgeben lassen.
Dann hat es funktioniert - auch nach Entfernen der Logs.
Da hatte wohl der Linker irgend etwas verwurschtelt...?
// CodeSite.Send('Get:' + IntToStr(MyDict.Count));
// for Key in MyDict.Keys do
// begin
// S1 := Key.AsString;
// Value := nil;
// MyDict.TryGetValue(Key,...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
7. Aug 2015
@Schönling
Ok, wenn das Dict. kopiert und die Hashwerte neu berechnet werden, dann ist das nachvollziehbar. Das wird dann sicher etwas dauern.
@TiGü
Ok, dann scheint mein Ansatz erst mal nicht völlig falsch zu sein, was evtl. auch möglich gewesen wäre.
Ich hatte in der Nacht dann keine Neven mehr, das Problem noch weiter zu zerlegen.
Ich denke inzwischen, für meinen Fall ist die binäre...
-
Forum: Algorithmen, Datenstrukturen und Klassendesign
Delphi
by stahli,
7. Aug 2015
Ich halte Interfaces, die eine GUID haben, in einer Liste.
Mit Hilfe binärer Suche werden die Interfaces anhand der GUID sortiert eingefügt und wieder herausgesucht.
Das funktioniert schnell und gut.
Jetzt wollte ich testen, ob es mit einem Dictionary noch schneller ginge.
Irgendwas mache ich offenbar falsch.
Count erhöht sich nach einem Add. Aber der Eintrag wird dann nicht gefunden.