Generizität: Difference between revisions
From Alda
Jump to navigationJump to search
(New page: == Generizität == '''Definition''' Algorihmen und Datenstrukturen so zu entwerfen und implementieren, dass sie möglichst vielvältig verwendbar sind. Gem...) |
No edit summary |
||
Line 2: | Line 2: | ||
== Generizität == | == Generizität == | ||
- | |||
'''Definition''' | |||
Algorihmen und Datenstrukturen so zu entwerfen und implementieren, dass sie möglichst vielvältig verwendbar sind. | Algorihmen und Datenstrukturen so zu entwerfen und implementieren, dass sie möglichst vielvältig verwendbar sind. | ||
Line 29: | Line 23: | ||
#Beispiel : Kopieren eines Containers | #Beispiel : Kopieren eines Containers | ||
::: def copyArray(a): | ::: def copyArray(a): | ||
Line 78: | Line 75: | ||
''' | '''Wie kann man so zwischen einem Array und einer Liste navigieren, dass man den Unterschied nicht mehr merkt?''' | ||
--> Vereinheitlichung der Zieldatenstruktur : | |||
standardisierte Funktion "append" | |||
*Array hat sie schon | |||
*Liste : definiere Klasse DoublyLinkedList | |||
::class SentinelTag : pass # keine Daten | |||
::class DoublyLinkedNode: | |||
:::def__init__(self,data = sentinelTag(), next = None) | |||
::::if next is None: | |||
:::::self.prev = self.next = self | |||
::::else : | |||
::::: self.next = next | |||
::::: self.prev = next.prev | |||
::::: next.prev.next = self | |||
::::: next.prev = self | |||
::def isSentinel(self) : return isinstance(self.data, sentinelTag) | |||
::class DoublyLinkedList : | |||
:::::def__init__(self): | |||
:::::::self.sentinel = DoublyLinkedNode() | |||
:::::::self.size = 0 | |||
::def__len__(self): return self.size #len(l) | |||
::def append(self, value): | |||
::::DoublyLinkedNode(value, self.sentinel) | |||
::def__iter__(self): | |||
::::: return ListIterator(self.sentinel.next) |
Revision as of 22:06, 13 June 2008
Generizität
-
Definition
Algorihmen und Datenstrukturen so zu entwerfen und implementieren, dass sie möglichst vielvältig verwendbar sind.
Gemeint sind :
- verschiedene Anwendungen
- mit vielen Kombinationsmöglichkeiten
- als wiederverwendbare Bibliothek
- Code austauschen in Bibliotheken
--> Dies soll ohne Neuimplemenation geschehen
- Beispiel : Kopieren eines Containers
- def copyArray(a):
- r =[]
- for k in a
- r.append(k)
- def copyArray(a):
- class Node :
- def__init__(self,data,next)
- self.data = data
- self.next = next
- def__init__(self,data,next)
- class Node :
- return k
- def copyArrayToList(a) :
- if len(a) == 0 : return None
- first = last = Node (a[0], None)
- for k in a[1:] :
- last.next = Node(k, None)
- last = last.next
- return first
- def copyArrayToList(a) :
- def copyListToArray(l):
- r = []
- while l is not in None :
- r.append(l.data)
- l = l.next
- return r
- def copyListToArray(l):
Beobachtung :
Für N Datenstrukuren ist der Implementaionsaufwand <math>O({N^2})</math>.
Alle Funktionen machen das gleiche mit uninteressanten Unterschied
Verbesserung durch Verallgemeinerung zweier Aspekt :
- Navigation durch die Quelldaten
- Aufbauen der Zieldatenstruktur
Wie kann man so zwischen einem Array und einer Liste navigieren, dass man den Unterschied nicht mehr merkt?
--> Vereinheitlichung der Zieldatenstruktur :
standardisierte Funktion "append"
- Array hat sie schon
- Liste : definiere Klasse DoublyLinkedList
- class SentinelTag : pass # keine Daten
- class DoublyLinkedNode:
- def__init__(self,data = sentinelTag(), next = None)
- if next is None:
- self.prev = self.next = self
- else :
- self.next = next
- self.prev = next.prev
- next.prev.next = self
- next.prev = self
- if next is None:
- def__init__(self,data = sentinelTag(), next = None)
- def isSentinel(self) : return isinstance(self.data, sentinelTag)
- class DoublyLinkedList :
- def__init__(self):
- self.sentinel = DoublyLinkedNode()
- self.size = 0
- def__init__(self):
- class DoublyLinkedList :
- def__len__(self): return self.size #len(l)
- def append(self, value):
- DoublyLinkedNode(value, self.sentinel)
- def__iter__(self):
- return ListIterator(self.sentinel.next)