Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeitkritische Array-Prüfung (https://www.delphipraxis.net/183220-zeitkritische-array-pruefung.html)

Dejan Vu 21. Dez 2014 13:32

AW: Zeitkritische Array-Prüfung
 
Kommt drauf, wie man es liest. Aber wenn es wirklich dynamische Arrays sind, hast Du recht.

Ich frag mich dann nur, wie das dann eigentlich funktioniert, wenn sich die Arrays parallel irgendwo spontan ändern... :gruebel: Vielleicht ist das doch ein fester Speicherbereich.

Wenn der Code, der die Arrays neu schreibt, auch vom TE ist, kann er da eigentlich die Dictionary gleich erstellen.

himitsu 21. Dez 2014 13:57

AW: Zeitkritische Array-Prüfung
 
Zitat:

Dann scheidet das Casten auf eine flache, eindimensionale Array-Struktur wohl aus.
Nein, direkt ausfallen tut es nicht.

Die maximale Größe ist bekannt und man kann da Array immer mit der maximalen Größe definieren, auch wenn nicht alles verwendet wird. (31 MB sind ja nicht wirklich ein schlimmer Speicherverbrauch > 201*201*201*4)
Man kann auch die 3-dimensionale Struktur auf ein 1-gimensionales Array abbilden.
Delphi-Quellcode:
Arr[x + y*Length(Ax) + z*Length(Ay)*Length(Ax)]


Da hier Alles mit Allem verglichen wird, dann kann man das extrem optimieren, indem man beide Arrays soriert, denn dann kann man das Suchmuster so optimieren, daß die Vergleichsoperationen minimiert werden, da man hier parallel durch die Arrays laufen kann, und so nur ähnliche Werte vergleichen muß, was sich bis hin zu O(Max(m, n)) aka O(Max(Mx*My*Mz, Cx*Cy*Cz)) optimieren lässt. (nicht eingerechnet der Aufwand für den Aufbau und das Sortieren der Vergleichdaten)

Zitat:

Ich frag mich dann nur, wie das dann eigentlich funktioniert, wenn sich die Arrays parallel irgendwo spontan ändern...
Solange sich nur der Inhalt ändert, aber nicht die Größe, dann könnte es gehen, aber dennoch kann es probleme geben, wenn zeitgleich auf den selben Speicherbereich zugegriffen wird.

Uwe Raabe 21. Dez 2014 14:17

AW: Zeitkritische Array-Prüfung
 
Zitat:

Zitat von himitsu (Beitrag 1284295)
Zitat:

Dann scheidet das Casten auf eine flache, eindimensionale Array-Struktur wohl aus.
Nein, direkt ausfallen tut es nicht.

Ein
Delphi-Quellcode:
array of array of array
ist ein dynamisches Array und da liegen die einzelnen Zeilen nie hintereinander - schon allein deswegen nicht, weil der Speicher für die interne Verwaltung immer vor dem ersten Element liegt.

Wenn aber eine neue Deklaration für das Array im Rahmen des Möglichen und Erwünschten liegt, dann kann man ja auch gleich ein eindimensionales Array deklarieren und für den indizierten Zugriff eigene Getter und Setter deklarieren.

Sir Rufo 21. Dez 2014 14:27

AW: Zeitkritische Array-Prüfung
 
Das Problem mit den Arrays ist doch, dass die sich in der Länge ändern können und dann war es dass mit dem linearen Array (bzw. man braucht eine riesige Umkopieraktion).

Wäre da nicht eine Klasse besser, die dieses 3D-Konstrukt beherbergt? Da könnte man dann so einiges kapseln und sichern und auch auf Änderungen reagieren.
Delphi-Quellcode:
TData<T> = class
public
  property Value[x,y,z:Integer] : T read GetValue write SetValue;
end;
Den Zugriff kann man dann über ein Dictionary abbilden
Delphi-Quellcode:
TDataPoint = record
  x, y, z : integer;
end;

FData : TDictionary<TDataPoint,T>;
Und für die Statistik nimmt man sich ein weiteres Dictionary
Delphi-Quellcode:

FStat : TDictionary<T,Integer>;
Der Setter nimmt nun den alten Wert aus der Statistk und fügt den neuen Wert ein. Zum Vergleichen benötigt man nur noch die Statistik.

Ist ein DataPoint nicht im Dictionary, dann gibt es als Wert
Delphi-Quellcode:
Default(T)
zurück und wenn
Delphi-Quellcode:
Default(T)
gesetzt wird, dann wird der Eintrag aus dem Dictionary entfernt.

Dejan Vu 21. Dez 2014 14:35

AW: Zeitkritische Array-Prüfung
 
Zitat:

Zitat von himitsu (Beitrag 1284295)
Man kann auch die 3-dimensionale Struktur auf ein 1-gimensionales Array abbilden.
Delphi-Quellcode:
Arr[x + y*Length(Ax) + z*Length(Ay)*Length(Ax)]
...Da hier Alles mit Allem verglichen wird, dann kann man das extrem optimieren, indem man beide Arrays sortiert,

Steht doch alles schon da. Und eine Dictionary ist immer noch schneller als eine sortierte Liste.
Zitat:

O(Max(m, n))
Das gibt es nicht. O ist hier O(n).

Zitat:

... aber dennoch kann es probleme geben, wenn zeitgleich auf den selben Speicherbereich zugegriffen wird.
Das meinte ich ja (neben dem gar nicht so dynamischen Array).

Wenn es denn dynamische Arrays sind, würde ich an den Stellen ansetzen, die diese Arrays erzeugen und dort einfach ein 'Array of Cardinal' anlegen.

himitsu 21. Dez 2014 14:53

AW: Zeitkritische Array-Prüfung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1284297)
Ein
Delphi-Quellcode:
array of array of array
ist ein dynamisches Array und da liegen die einzelnen Zeilen nie hintereinander - schon allein deswegen nicht, weil der Speicher für die interne Verwaltung immer vor dem ersten Element liegt.

Ich hab nichts Anderes behauptet. :zwinker:

Wenn man die maximale Größe kennt, dann könnte man das auch statisch deklarieren und verwendet dann halt nur den ersten Teil der Felder.
Und selbst bei Größenänderung der genutzten Anteile muß man nichtmal was umkopieren, da sich nichts verschiebt. :stupid:


Einziger Nachteil bleibt im Zugriff/Casten auf das eindimensionale Array, denn entwerder man vergleich immer alles oder man muß Teile überspringen. (bei Letzterem kann man sich den eindimensionalen Zugriff auch sparen und bleibt bei Mehrdimensional)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:43 Uhr.
Seite 2 von 2     12   

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