160 likes | 286 Views
Wintersemester 2005/06. Einführung in die Informatik für Naturwissenschaftler und Ingenieure ( alias Einführung in die Programmierung) (Vorlesung). Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl für Algorithm Engineering. Kapitel 15: Schablonen. Inhalt
E N D
Wintersemester 2005/06 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl für Algorithm Engineering
Kapitel 15: Schablonen • Inhalt • Motivation: Hashen von beliebigen Objekten • Einführung von Schablonen / Templates • ADT Liste (… schon wieder: jetzt aber wirklich als ADT) • ADT HashTable mit Schablonen Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Wiederholung: Instantiierung der Schablone class ComplexHashTable : public HashTableTemplate<Complex> { public: ComplexHashTable(int aMaxBucket); int Hash(Complex& aElem); }; ComplexHashTable::ComplexHashTable(int aMaxBucket) : HashTableTemplate<Complex>(aMaxBucket) {} int ComplexHashTable::Hash(Complex& aElem) { int h1 = aElem.Re() % maxBucket; int h2 = aElem.Im() % maxBucket; return (h1 + 19 * h2) % maxBucket; } Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Test int main() { ComplexHashTable cht(17); Complex a[400]; int k = 0; for (int i = 0; i < 2000; i++) { Complex elem(rand(), rand()); if (i % 5 == 0) a[k++] = elem; cht.Insert(elem); } int hits = 0; for (int i = 0; i < 400; i++) if (cht.Contains(a[i])) hits++; cout << "Treffer: " << hits << endl; } Ausgabe: Treffer: 400 Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Test Länge der Kollisionslisten Kollisionslisten Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Beispiel: main.gcc HauptprogrammComplex.h Komplexe Zahlen (inline)ListCollection.* Instantiierungen der Schablone List HashCollection.* Instantiierungen der SchabloneHashTableList.* Schablone ListHashTable.* Schablone HashTable Kapitel 15: Schablonen Achtung: Eine Schablone muss in einer Übersetzungseinheit definiert (oder inkludiert) werden, wenn dort diese Schablone instantiiert wird … ... natürlich vor der Instantiierung! Organisation des Codes (insbesondere die Inklusionen) gut überdenken! Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Organisation des Codes Definition der Schablone ListCollection.cpp List.cpp 2. List.h ListCollection.h 1. main.cpp Complex.h 1. HashCollection.h HashTable.h 2. 2. 1. HashCollection.cpp HashTable.cpp Definition der Schablone Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Annahme: Die Klasse BST(binary search tree)ist in Bibliothek gegeben. Nicht veränderbar! class BST { protected: BST *fRoot; private: BST *Insert(BST*, int); public: BST() { fRoot = 0; } int fValue; BST *fLeft, *fRight; void Insert(int aValue) { fRoot = Insert(fRoot, aValue); } }; Kapitel 15: Schablonen Hashing von Binärbäumen sinnvoll, da totale Ordnung auf Binärbäumen nicht offensichtlich Aber: Für Hash-Schablone werden Methoden Equal und Print benötigt! Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Implementierung (zur Erinnerung) BST *BST::Insert(BST* aTree, int aValue) { if (aTree == 0) { BST *node = new BST; node->fValue = aValue; node->fLeft = node->fRight = 0; return node; } if (aTree->fValue > aValue) aTree->fLeft = Insert(aTree->fLeft, aValue); else if (aTree->fValue < aValue) aTree->fRight = Insert(aTree->fRight, aValue); return aTree; } rekursiv Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen • Wie können Methoden Equal und Print hinzugefügt werden? • Erweiterung der Klasse BST um diese Methoden. Geht nicht, da als Bibliotheksklasse unveränderbar! • Ableiten von Klasse BST und Methoden hinzufügen. Gute Idee! Bemerkung: Hier werden nur Methoden und keine Attribute hinzugefügt. Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
cast-Operation: Kapitel 15: Schablonen Die neue Klasse BinTree class BinTree : public BST { private: bool Equal(BinTree*, BinTree*); public: BinTree() : BST() { } bool Equal(BinTree *aTree) { return Equal((BinTree*) fRoot, aTree->GetRoot()); } void Print() { /* to do */ }; BinTree *GetRoot() { return (BinTree*)fRoot; } }; fRoot ist Typ BST*,wird durch castzum Typ BinTree* Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Die neue Klasse BinTree bool BinTree::Equal(BinTree* L, BinTree* R) { if (L == 0) return (R == 0); if (R == 0) return false; if (L->fValue != R->fValue) return false; BinTree *LL, *LR, *RR, *RL; LL = (BinTree*) L->fLeft; LR = (BinTree*) L->fRight; RL = (BinTree*) R->fLeft; RR = (BinTree*) R->fRight; return Equal(LL, RL) && Equal(LR, RR); } Abbruch-bedingungen cast Rekursion Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
public: int Hash() { return Hash((BinTree*)fRoot); } private: int BinTree::Hash(BinTree* B) { const c = 275604541; // large prime number if (B == 0) return 0; int hl = Hash((BinTree*)B->fLeft); int hr = Hash((BinTree*)B->fRight); int h = (hl * 17 + hr) % c; return (h * 23 + B->fValue) % c; } Kapitel 15: Schablonen Die neue Klasse BinTree: Nachtrag Eine Methode, die einen Hashwert für einen Baum liefert, wäre nützlich! Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Instantiierung der Schablone List und HashTable class BinTreeList : public List<BinTree> { public: BinTreeList(); }; ListCollection.h ListCollection.cpp BinTreeList::BinTreeList() : List<BinTree>() {} class BinTreeHashTable : public HashTableTemplate<BinTree> { public: BinTreeHashTable(int aMaxBucket); int Hash(BinTree& aElem); }; BinTreeHashTable::BinTreeHashTable(int aMaxBucket) : HashTableTemplate<BinTree>(aMaxBucket) {} int BinTreeHashTable::Hash(BinTree& aElem) { return aElem.Hash() % maxBucket; } Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Rückblick • Schablonen für Listen und HashTabellen waren vorhanden • Klasse BST (binary search tree) war in Bibliothek vorhanden • Definition der Klasse BinTree durch Ableiten von BST • Methode Equal • Methode Print • Methode Hash • Instantiieren der Schablonen für Liste und HashTabelle • Definition der Konstruktoren • Methode Hash (unter Verwendung von Hash der Klasse BinTree) Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen
Kapitel 15: Schablonen Ergänzungen • Anonyme Klassen→ Instantiierung einer Schablone ohne AbleitenList<double> dblList; dblList.Insert(23.5);sinnvoll, wenn nur selten oder temporär benutzt; lästig, wenn Übergabetyp bei Parametern; dann häufige Notlösung: typedefBsp: typedef List<double> DoubleList; • Funktions-Schablonen→ template <class T> void sort(vector<T>&); void f(vector<int>&vi, vector<string>& vs) { sort(vi); sort(vs); } Rudolph: EINI (WS 2005/06) ● Kap. 15: Schablonen