Informatik II (37-836) Problemlöseverfahren Algorithmen Datenstrukturen Dozent: Prof. Thomas M. Stricker Programmiersprache: C++ Textbuch: Weiss: Algorithms, Data Structures and Problem Solving in C++ • Stacks - Cleanup • Huffman Codes • Simulation 37-836 Informatik II 24.6.98 - 1 © Stricker Simulation Josephus Problem: Biblische Form von Russisch Roulette. • Anzahl Spieler: N • Anzahl Tote: N-1 • Anzahl Ueberlebende: 1 • Schrittweite: M Beispiel N=5, M=2 Datenstruktur: Ring-Liste Operationen: Insert, Iterator++, Delete Analysis: O(M*N) 37-836 Informatik II 24.6.98 - 2 © Stricker Verbesserte Version Bessere Datenstruktur mit Methoden: • Insert O(1),O(logN) • Find smallest O(logN) • Find_Kth_Element O(logN) • Delete smallest, Kth el. O(1),O(logN) Spezielle Priority Queue auf der Basis von • AVL Tree • Binary Heap • Splay Tree 37-836 Informatik II 24.6.98 - 3 © Stricker Simulation von Ereignissen Prozedurales Denken: • ausführen - warten - ausführen - warten • jedem Agenten einen Prozess • Interaktion = Kommunikation Ereignis basiertes Denken: • Ereignis schaft neue Ereignisse • Liste von Ereignissen in Zukunft • Abarbeiten Zeit Schritt für Zeitschritt z.B. Steuerung Modellbahn mit Apple II Effiziente Ereignis Simulation • Abarbeiten in virtueller Zeit • Ordnen der Ereignisse nach Zeit • Sprung zu nächstem interess. Zeitpunkt 37-836 Informatik II 24.6.98 - 4 © Stricker Datenstrukturen Prozedurales Denken: • Lineares Programm • Viele, viele Prozessoren oder dann löst das Betriebssystem das Problem. Ereignis basiertes Denken • Warteschlange mit Ereignissen • je nach Granularität aufwendig Effizientes Simulieren: • Priority Queue für Ereignisse (mit log N worst case) 37-836 Informatik II 24.6.98 - 5 © Stricker Modembank Simulation 3 Modems, Anruf, Verbindungszeit usw. 37-836 Informatik II 24.6.98 - 6 © Stricker Output (Buch S. 404) 37-836 Informatik II 24.6.98 - 7 © Stricker 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #include #include #include #include #include <limits.h> <stdlib.h> <iostream.h> "Heap.h" "Random.h" class Event { public: Event(int Name = 0, long Tm = 0, int Type = DialIn) : Time(Tm), Who(Name), What(Type) { } int operator<( const Event & Rhs ) const { return Time < Rhs.Time; } friend class ModemSim; private: enum {DialIn = 1, Hangup = 2}; int Who; long Time; int What; }; 37-836 Informatik II 24.6.98 - 8 © Stricker 36 class ModemSim 37 { 38 public: 39 ModemSim(int Modems, double AvgLen, long CallIntrvl); 40 void NextCall(long Delta); 41 void Run(long StoppingTime = LONG_MAX); 42 private: 43 Random R 44 BinaryHeap<Event> EventSet; 45 int FreeModems; 46 const double AvgCallLen; 47 const long FreqOfCalls; 48 }; 49 50 ModemSim::ModemSim( int Modems, double AvgLen, long CallIntrvl ) : 51 EventSet( Event( 0 ) ), 52 FreeModems( Modems ), 53 AvgCallLen( AvgLen ), 54 FreqOfCalls( CallIntrvl ) 55 { 56 NextCall( FreqOfCalls ); 57 } 58 59 void ModemSim::NextCall(long Delta) { 60 static long NextCallTime = 0; 61 static int UserNum = 0; 62 EventSet.Insert(Event(UserNum++, NextCallTime)); 63 NextCallTime += Delta; 64 } 37-836 Informatik II 24.6.98 - 9 © Stricker 65 void ModemSim::Run(long StoppingTime) 66 { 67 static Event E; 68 long HowLong; 69 70 while(!EventSet.IsEmpty( )) { 71 EventSet.DeleteMin( E ); 72 if(E.Time > StoppingTime) 73 break; 74 if(E.What == Event::Hangup) { 75 FreeModems++; 76 cout<<"User"<<E.Who <<"hangs up at time"<<E.Time<<'\n'; 77 } else { 78 cout<<"User"<<E.Who <<"dials in at time"<<E.Time<<" "; 79 if(FreeModems > 0) { 80 FreeModems--; 81 HowLong=R.Poisson(AvgCallLen); 82 cout<<"and connects for" 83 <<HowLong<<"minutes\n"; 84 E.Time+=HowLong; 85 E.What = Event::Hangup; 86 EventSet.Insert(E); 87 } else { 88 cout<<"but gets busy signal\n"; 89 NextCall( FreqOfCalls ); 90 } 91 } 92 } 93 94 37-836 Informatik II 24.6.98 - 10 © Stricker