AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Daten auf Einzigartigkeit überprüfen...
Thema durchsuchen
Ansicht
Themen-Optionen

Daten auf Einzigartigkeit überprüfen...

Ein Thema von Nelphin · begonnen am 13. Dez 2009 · letzter Beitrag vom 14. Dez 2009
Antwort Antwort
Seite 2 von 2     12   
Nelphin

Registriert seit: 2. Feb 2009
Ort: Kaiserslautern
71 Beiträge
 
Turbo Delphi für Win32
 
#11

Re: Daten auf Einzigartigkeit überprüfen...

  Alt 14. Dez 2009, 08:39
Zitat von Uwe Raabe:
Dann versuch doch mal folgenden Trick - sollte lineare Laufzeit bringen:

//funktionierende procedure von oben
Erstmal vielen Dank!!!!!
bei meinem 120000 -> 20000 beispiel schafft dein code es in 0,8 sekunden! SUPER!
bei einem 2,3 Mio -> 430000 beispiel hats 192 sekunden gedauert, das ist zwar lang aber in anbetracht des datenvolumens ersteinmal vertretbar. (Dauert ja schon fast 20 sekunden das ding zu laden)

deinen trick habe ich nicht verstanden aber er scheint zu funktionieren ich werds heut abend nach der arbeit nochmal zeile für zeile durchgehen, aber was slopt.objects[i] ist weiss ich nicht und was idx := slopt.AddObject(sl[i], TObject(i)); macht weiss ich auch net.

aber erstmal vielen herzlichen dank!!! wochenende doch noch gerettet!
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#12

Re: Daten auf Einzigartigkeit überprüfen...

  Alt 14. Dez 2009, 10:00
Es war gestern schon zu spät für ausführliche Erläuterungen, aber nun:

Das Problem mit der sortierten Stringliste ist, daß bei jedem Add die Inizes umsortiert werden können. Daher kann man den von Add zurückgegebenen Index auch nur bis zum nächsten Add gebrauchen.

Statt nur einfach einen String zu der Liste hinzuzufügen, geben ich diesem noch einen Referenzwert, den Index in der Originalliste, mit. Zu diesem Zweck missbrauche ich das Objects-Property der Stringliste, das eigentlich ein TObject hält, aber durch Typecasting auch Integer verkraftet. Der Vorteil der Objects ist, daß sie beim Umsortieren mitgeführt werden.

Bei dupIgnore wird ein bereits vorhandener String bei einem Add nicht in die Liste aufgenommen, insbesondere wird bei AddObject auch das zugehörige Objects-Property nicht geändert. Der nachfolgende Abruf liefert also für den gleichen String auch immer den gleichen Referenzwert zurück. Diesen speichere ich im Index-Array.

Nachdem alle Strings zugefügt wurden, stehen im Index-Array nun allerdings die Werte des jeweiligen Objects-Property des zugehörigen Strings und nicht wie gewünscht der Index in der optimierten Liste. Um dieses Manko zu beheben baue ich einen temporären inversen Index auf, der mir für jeden Referenzwert den zugehörigen Index in slopt liefert. Das geht recht schnell, da hierzu lediglich die slopt durchlaufen werden muss.

Mit diesem temporären Index übersetze ich dann die Einträge des Index-Array in die korrekten Werte.

Übrigens: lineare Laufzeit ist das auch nicht, aber O(n*log n) sollte es schon sein.
Uwe Raabe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 08:37 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