AGB  ·  Datenschutz  ·  Impressum  







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

fast array search with delphi

Ein Thema von bernhard_LA · begonnen am 21. Jun 2011 · letzter Beitrag vom 6. Jul 2011
Antwort Antwort
Seite 1 von 2  1 2      
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#1

fast array search with delphi

  Alt 21. Jun 2011, 13:52
mein code sieht ungefähr so aus :

Delphi-Quellcode:
    vector = record
            prev: integer;
            sx,sy: word;
            ex,ey: word;
            next: integer;
            status: boolean;
            end;


    V : array of vector; /// ...


   im array befinden sich ~ 1 mio vectoren

ich benötige eine ultra schnelle suche um mir alle Vector-indices auszugeben die :
zb. sx:= 34 und sy:= 50 haben oder eine Suche für :
ex:= 45; ey:=50; eine Suche über alle Elemnte in meinem array ist nicht akzeptabel.

kann man etwas wie http://www.swissdelphicenter.ch/torr...de.php?id=1916 auf mein problem anwenden ...

Geändert von mkinzler (21. Jun 2011 um 16:30 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: fast array search with delphi

  Alt 21. Jun 2011, 13:53
Hallo,

Dann musst du das Array vorher sortieren.
Sonst kommst du nicht drumrum das ganze Array jedes mal zu durchsuchen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: fast array search with delphi

  Alt 21. Jun 2011, 15:15
Dann musst du das Array vorher sortieren.
Und das Sortieren geht dank Generics in D2010+ auch recht einfach:

Delphi-Quellcode:
  
TArray.Sort<vector>(V, TDelegatedComparer<vector>.Create(
  function(const Left, Right: vector): Integer
  begin
    result := CompareValue(Left.sx, Right.sx);
    if result = EqualsValue then
      result := CompareValue(Left.sy, Right.sy);
  end));
Dummerweise ist die Sortierung immer nur auf eine Suchanfrage beschränkt (hier sy,sy). Wenn man nach ex,ey suchen möchte, muss eine andere Sortierung vorliegen. Als Lösung aus diesem Dilemma bietet sich eine Indizierung des Vector-Arrays an. Man macht dann einen Index für sx,sy und einen für ex,ey. Sinnvollerweise baut man da gleich die entsprechenden Klassen, die das Ganze kapseln (die globalen Variablen waren hoffentlich nur als Beispiel gedacht!).

Du bekommst allerdings Probleme, wenn sich die Daten in den Vektoren (oder das Vector-Array selbst) ständig ändern. Dann müsste die Sortierung jedesmal mitgeführt werden. Ohne eine umfassendere Beschreibung des eigentlichen Problems ist da eine belastbare Antwort schwierig.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: fast array search with delphi

  Alt 21. Jun 2011, 16:26
der code kommt von : http://cardhouse.com/computer/vectcode.htm, ist uralt, vermutlich noch tp5.5

das problem liegt in der procedure :

Delphi-Quellcode:
procedure simplifyvector;

var
  m,m2: integer;

begin
  for m := 1 to Vnum do
    for m2 := m + 1 to Vnum do
      begin
        if equalvectors(m,m2) then
          removevectors(m,m2);
      end;

end;
bei einer bitmap mit 4000x4000 pixel und ggf. 1 mio black pixel( Vnun) dauert die procedure simplifyvector ~ 1e6 * 1e6 operationen ... gleichbedeutend mit einem blue screen .

Geändert von mkinzler (21. Jun 2011 um 16:29 Uhr) Grund: Delphi-Tag eingefügt
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

AW: fast array search with delphi

  Alt 21. Jun 2011, 20:38
Das Hauptproblem ist einen guten und effizienten Algorithmus für die Vektorisierung zu finden.
Nicht ohne Grund kann Vektorisierungssoftware über 2000 Euro kosten.
Würde man das Bild in 8 * 8 Kacheln unterteilen und dann jede Kachel einzeln in Vektoren überführen,
dann könnte man viel Zeit sparen.
Anschliessend müsste man die richtungsgleichen Vektoren an den Grenzen vereinigen.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: fast array search with delphi

  Alt 21. Jun 2011, 21:02
Der Algorithmus ist wirklich alles andere als effizient - sowohl in der Laufzeit, als auch im Speicherverbrauch.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: fast array search with delphi

  Alt 21. Jun 2011, 22:16
Ich habe mir den Algorithmus auch mal näher angeschaut.

Die zeitintensive procedure simplifyvector kann entfallen, wenn addsquarevector vorher auf equalpoints prüft und nur nicht vorhandene Werte in die V-Liste aufnimmt, also nur, wenn IndexOfVector minus 1 ist.

Delphi-Quellcode:
function IndexOfVector (const sx, sy, ex, ey: integer): integer;
var
  M: integer;
begin
  Result:= -1;
  for M:= 1 to VNum do
    if equalpoints (sx, sy, V[M].sx, V[M].sy) then
      if equalpoints (ex, ey, V[M].ex, V[M].ey) then
      begin
        Result:= M;
        Break;
      end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: fast array search with delphi

  Alt 22. Jun 2011, 08:13
Ich habe mir den Algorithmus auch mal näher angeschaut.

Die zeitintensive procedure simplifyvector kann entfallen, wenn addsquarevector vorher auf equalpoints prüft und nur nicht vorhandene Werte in die V-Liste aufnimmt,
Das wird so nicht funktionieren, da SimplifyVector ja nicht nur Vektoren entfernt, sondern auch die angrenzenden Vektoren verbindet.

Die Methode AddSquareVector erzeugt ja gerade eine verkette Liste von vier Vektoren, die ein Quadrat um den schwarzen Punkt bilden. Liegen zwei schwarze Punkte nebeneinander, werden die überlappenden beiden Vektoren entfernt und die beiden Quadrate zu einem Rechteck verbunden (jetzt sechs Vektoren). Das geht dann so weiter, bis die schwarzen Flächen von Ketten vieler kurzer Vektoren umschlossen sind. Im dritten Schritt werden dann die kolinearen Vektoren zusammengefasst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.153 Beiträge
 
Delphi 12 Athens
 
#9

AW: fast array search with delphi

  Alt 22. Jun 2011, 08:22
Man könnte aber auch eine generische TList verwenden, statt dem Array ... equivalent zu dem schongezeigten TArray.Sort<vector>
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: fast array search with delphi

  Alt 22. Jun 2011, 09:02
ich bin dabei eine LookUptabelle für die matching-vektoren zu bauen, leider geht

VLookUp = array of array of TIntgerlist nicht, da ich im ersten Schritt

setlength(VLookUp, imagesize_x, imagesize_y); bei einem Bild mit 2000 x 2000 pixel 4 mio IntegerListen im Speicher anlegen müsste ...


mein Plan :
SimplifyVectorEXT benötigt 4E6 *~ 4E3 zugriffe , immerhin um den Faktor 1000x schneller



procedure SimplifyVectorEXT;

var
m, m2: integer;

begin
for m.......
for m2 := getbestminrange(m) to getbestmaxrange(m) // ich muss nur +- 1 Zeile absuchen !!!!
begin
if EqualVectors(m, m2) then
RemoveVectors(m, m2);
end;

end;

Geändert von bernhard_LA (22. Jun 2011 um 09:04 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:04 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