Informatik II (37-836)

Werbung
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
Herunterladen