Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#17

Re: Gibt es ein Modell für "Doppelt verkettete Listen&a

  Alt 24. Nov 2006, 07:17
Jetzt hackt nicht auf Gausi rum, er hat aus meiner Sicht die richtigen Argumente vorgebracht.

Zb.
Zitat:
TList kopiert nicht um, wenn gelöscht wird,
sondern setzt die entsprechenden Stellen auf NIL.
Gausi hat aber denoch recht. TListe kopiert immer um wenn man einen Array Eintrag aus dem Array LÖSCHT, nicht auf NIL setzt.

Also

Array[3] = (Object1, Object2, Object3)

Lösche Eintrag Object2

Array[2] = (Object1, Object3)

Bei TList MUSS hier umkopiert werden, und obige Operation IST die Löschoperation -> .Delete()

Bei "echten" Listen im Sinne der Informatik handelt es sich immer um irgendeine Form von Zeigerobjekten, also Listen die sich bilden wenn man Objekte über Zeiger untereinander Verkettet. Man redet deshalb auch gerne von Ketten oder Chains da das wohl nicht so irritierende Wörter sind wie "Liste".

Chains/Ketten/verlinkte Listen haben eben den entscheidenden Vorteil das sie keinerlei Speicher-umkopier-operationen bei den Einfüge/Entfernen Opertionen benötigen. Dafür benötigen sie

- mehr Speicher für ihre Verwaltungtsstrukturen -> Zeiger -> besonders bei verlinkten Listen mit mehr als einer Verlinkung (sprich einfach verkettete Listen sind identisch zu Array Listen im Speicherverbrauch, alles was drüber ist ist ineffizienter im Speicherverbrauch)

- mehr Aufwand beim Umsortieren und Suchen in der Liste, dh. die Algorithmen zur Suche in Array-Listen (QuickFind, QuickSort etc.pp) sind im Vergleich zu deren Counterparts für verlinkte Listen viel einfacher und effizienter.

- der Aufwand den also verlinkte Listen mitsich bringen lohnt sich in den meisten Fällen nicht. Nur wenige, ganz spezielle Aufgaben wie Stacks, FIFO, FILO Buffer etc.pp. sind mit verlinkten Listen effizienter.

In den meisten Fällen benötigt man an eine Array Liste auf Irgendwas, die man

1.) einmalig füllt
2.) danach sortiert
3.) dann ständig quasi tot im Speicher hält und nur lesend darauf zugreift
4.) von Zeit zu Zeit mal was einfügt oder löscht
5.) alles wieder freigibt

In solchen Szenarien lohnen verlinkte Listen nicht, und das ist das was wir am häufigsten benötigen. Ergo: es gibt keine VCL im Delphi für verlinkte Listen.

Ein weiterer Punkt ist das ein Array[] eine quasi Informationstheoretisch Feste Struktur ist. Arrays sind also in jeder Programmiersprache sehr gleich. Verlinkte Listen dagegen sind nur von ihrer Wirkungsweise identisch aber fast niemals von ihrer realen Implementierung. Denn exakt diese Implementierungsunterschiede machen verlinkte Listen erst effizient im Vergleich zu anderen Verfahren.

Fazit: ein generisches VCL Object für verlinkte Listen macht garkeinen Sinn, da auf Grund der sehr unterschiedlichen Aufgabenstellungen an solche Listen eine solche Basis Klasse immer zu ineffizient auf das zu lösende Problem wäre.

Denoch: verlinkte Listen sind aus Sicht der Informatik nur eine "Untergruppe" von anderen Algorithmen den "Bäumen" bzw. Trees. Aus Sicht dieser Definition sind verlinkte Liste quasi degenerierte und nicht balanzierte Bäume. Solche Bäume lösen aber ganz andere Aufgaben/Probleme die so nicht mher 1 zu 1 mit Array Listen verglichen werden können. Auf diese Probleme bezogen wären die Bäöume/verlinkten Listen wiederum effizienter, auch in den Operationen der Suche/Sortierungen/Indizierungen !

Gruß Hagen
  Mit Zitat antworten Zitat