Einstieg in die Informatik mit Java

Ähnliche Dokumente
Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

2.4 Schleifen. Schleifen unterscheiden sich hinsichtlich des Zeitpunktes der Prüfung der Abbruchbedingung:

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Einstieg in die Informatik mit Java

Informatik B von Adrian Neumann

Komplexität von Algorithmen

Kontrollstrukturen: Wiederholungsanweisungen

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Suchen und Sortieren

Programmiervorkurs WS 2012/2013. Schleifen und Methoden

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

Übungen zu Algorithmen

Primitive Datentypen

System.out.println("TEXT");

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Komplexität von Algorithmen

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java

Dr. Monika Meiler. Inhalt

Programmierkurs Java

Aufgabe 1.90: Ein Geschäft gibt ihren Kunden unterschiedliche Rabatte. Schreiben ein Programm, das folgende Rabattklassen vorsieht:

Langzahlarithmetik implementieren Ac 1990 bis 2016

11. Rekursion, Komplexität von Algorithmen

16. Algorithmus der Woche Multiplikation langer Zahlen... schneller als in der Schule

Ideen und Konzepte der Informatik. Programme und Algorithmen Kurt Mehlhorn

Hochschule Niederrhein Einführung in die Programmierung Prof. Dr. Nitsche. Bachelor Informatik WS 2015/16 Blatt 3 Beispiellösung.

WS 2009/10. Diskrete Strukturen

Formale Logik. PD Dr. Markus Junker Abteilung für Mathematische Logik Universität Freiburg. Wintersemester 16/17 Sitzung vom 9.

Einstieg in die Informatik mit Java

Übung Grundlagen der Programmierung. Übung 03: Schleifen. Testplan Testergebnisse

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Einstieg in die Informatik mit Java

Einführung in die Informatik I

Welcher Bruch liegt genau zwischen den Brüchen 1 9 und 1 10? Um diese Frage zu beantworten, musst du das arithmetische Mittel berechnen!

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

Achtung: Groß O definiert keine totale Ordnungsrelation auf der Menge aller Funktionen! Beweis: Es gibt positive Funktionen f und g so, dass

Grundzüge der Informatik Zahlendarstellungen (7)

Überblick. Lineares Suchen

1 Zahlentheorie. 1.1 Kongruenzen

Objektorientierte Programmierung OOP Programmieren mit Java

Einstieg in die Informatik mit Java

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Parallele Prozesse. Prozeß wartet

Grundlagen der Informatik Algorithmen und Komplexität

Über Polynome mit Arithmetik modulo m

Einstieg in die Informatik mit Java

A2.3 Lineare Gleichungssysteme

Student: Alexander Carls Matrikelnummer: Aufgabe: Beschreibung des euklidischen Algorithmus Datum:

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Bruchrechnen in Kurzform

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

Einstieg in die Informatik mit Java

3. Grundanweisungen in Java

Kostenmodell. Daniel Graf, Tobias Pröger. 22. September 2016 (aktualisierte Fassung 5 vom 9. Oktober 2016)

Algorithmen für Kettenbrüche Ac

Kapitel 6. Komplexität von Algorithmen. Xiaoyi Jiang Informatik I Grundlagen der Programmierung

Einführung in die Informatik I

3. Kontrollstrukturen Grundlagen der Programmierung 1 (Java)

Informatik II, SS 2014

Probeklausur: Programmierung WS04/05

Mathematische Grundlagen der Kryptographie. 1. Ganze Zahlen 2. Kongruenzen und Restklassenringe. Stefan Brandstädter Jennifer Karstens

Die einfachsten Anweisungen

Vorab : Von dem indischen Mathematiker D. R. Kaprekar stammt folgender Zusammenhang :

1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster

Dr. Monika Meiler. Inhalt

1 Matrizenrechnung zweiter Teil

Der folgende Vortrag basiert auf dem Text A Polynomial Time Algorithm for the N-Queens Problem von Rok Sosic und Jun Gu aus dem Jahre 1990.

Klassenstufen 7, 8. Aufgabe 1 (6+6+8 Punkte). Magischer Stern:

Algorithmen und Programmierung II

Die for -Schleife HEUTE. Schleifen. Arrays. Schleifen in JAVA. while, do reichen aus, um alle iterativen Algorithmen zu beschreiben

Effizienz von Algorithmen

Klausur Fachprüfung Wirtschaftsinformatik. Name:

Algorithmen und Datenstrukturen

2.6 Potenzen (Thema aus dem Bereichen Algebra)

Einstieg in die Informatik mit Java

Algorithmen und Datenstrukturen

Dr. Monika Meiler. Inhalt

Information in einem Computer ist ein

Der Euklidische Algorithmus Dieter Wolke

Programmiertechnik II

Propädeutikum zur Programmierung

Lösungsvorschlag Serie 2 Rekursion

Java - Schleifen. Bedingung. wiederhole. Anweisung Anweisung Anweisung. Leibniz Universität IT Services Anja Aue

6. Iteration (Schleifenanweisungen)

1 Vorbereitung: Potenzen 2. 2 Einstieg und typische Probleme 3

Effizienz von Algorithmen

Das Jahr der Mathematik

Algorithmen und Datenstrukturen

Transkript:

1 / 31 Einstieg in die Informatik mit Java Effizienz Gerd Bohlender Institut für Angewandte und Numerische Mathematik

Gliederung 2 / 31 1 Überlegungen zur Effizienz 2 Landau-Symbole 3 Eier im Korb 4 Zyklische Ziffern

Gliederung 3 / 31 1 Überlegungen zur Effizienz 2 Landau-Symbole 3 Eier im Korb 4 Zyklische Ziffern

4 / 31 Überlegungen zur Effizienz Benötigte Rechenzeit Ausnutzung der Performance des Computers Beispiel Parallelrechner mit p Prozessoren: Effizienz(p) = Zeit(1) pzeit(p) Benötigter Speicher Aufwand des Programmierers... 2 Beispiele

Gliederung 5 / 31 1 Überlegungen zur Effizienz 2 Landau-Symbole 3 Eier im Korb 4 Zyklische Ziffern

6 / 31 Asymptotischer Aufwand eines Algorithmus Landau-Symbole Schreibweise O(g(n)) Landau-Symbole (Edmund Landau, Göttingen, 1877-1938) Die Funktion f (n) ist O(g(n)), für n, genau wenn es Konstanten n 0 und M gibt mit f (n) < M g(n) für alle n > n 0 Dabei ist g(n) meist eine einfache Funktion, z.b. O(n), O(n 2 ), O(log n),...

7 / 31 Landau-Symbole Anwendung Angaben zum Rechenaufwand eines Algorithmus (asymptotische Komplexität) Angaben zum Speicherbedarf eines Algorithmus Beispiel n n-matrix (n Zeilen, n Spalten) Speicherbedarf O(n 2 ) Rechenaufwand für Addition O(n 2 ) Rechenaufwand für Multiplikation O(n 3 ) n O(n 2 ) O(n 3 ) 10 100 1000 100 10000 1000000 1000 1000000 1000000000

8 / 31 Landau-Symbole Rechenregeln O(c g(n)) = O(g(n)) für eine Konstante c O(g(n) + h(n)) = max(o(g(n), O(h(n)) z.b. O(2n 3 + 3n 2 + 24n + 799) = O(n 3 )

Landau-Symbole Einsatz zum Vergleich von Algorithmen 9 / 31 Beispiel: sortiere n Zahlen x 0, x 1,..., x n 1 Algorithmus 1 (Bubblesort) Algorithmus 2 (Quicksort) n O(n 2 ) O(n log n) 2 4 2 4 16 8 8 64 24... 1000 10 6 10000 10 6 10 12 20 10 6 Algorithmus ist für n = 10 6 etwa 100000 mal schneller. 100000 1 Tag / 1 Sekunde

10 / 31 Landau-Symbole Vorsicht Aber Vorsicht! Alle Aussagen gelten nur asymptotisch für n, also ab einem (unbekannten) n 0 und mit einem (unbekannten) Faktor M. Für ein kleines n könnte Algorithmus 1 durchaus schneller sein als Algorithmus 2.

Gliederung 11 / 31 1 Überlegungen zur Effizienz 2 Landau-Symbole 3 Eier im Korb 4 Zyklische Ziffern

Eier im Korb - Aus einem alten Rechenbuch 12 / 31 Ein Mann stößt den Korb voller Eier einer Marktfrau um. Die Eier gehen zu Bruch. Der Mann will den Schaden ersetzen und fragt wieviele Eier im Korb waren. Die Marktfrau antwortet: Die genaue Zahl weiß ich nicht. Aber wenn ich immer 2 Eier aus dem Korb genommen habe, dann blieb eines übrig. Genauso, wenn ich immer 3, immer 4, immer 5 oder immer 6 Eier heraus genommen habe. Aber wenn ich immer 7 Eier heraus genommen habe, dann blieb keines übrig. Wieviele Eier waren (mindestens) im Korb?

13 / 31 Eier im Korb - Erster Algorithmus Teste alle Zahlen n = 1, 2, 3,... Beginne mit n = 1 Prüfe, ob die Zahl n bei Division durch 2, 3, 4, 5, 6 den Rest 1 ergibt und ob n durch 7 ohne Rest teilbar ist. Ist dies der Fall, dann brich ab und gib das Ergebnis aus. Andernfalls erhöhe n um 1 und prüfe nochmal.

Eier im Korb - Erstes Java-Programm 14 / 31 public class Eier { } public s t a t i c void main ( S t r i n g [ ] args ){ i n t i =0; do i ++; while ( i %2!=1 i %3!=1 i %4!=1 i %5!=1 i %6!=1 i %7!=0); System. out. p r i n t l n ( Es waren + i + Eier im Korb. ) ; }

15 / 31 Eier im Korb - Zweiter Algorithmus Es kommen nur Zahlen in Frage, die bei Division durch 2, 3, 4, 5, 6 den Rest 1 ergeben. Mit etwas Mathematik stellt man fest: Es kommen nur Zahlen in Frage, die bei Division durch kgv(2, 3, 4, 5, 6) = 60 den Rest 1 ergeben. Also: Teste alle Zahlen n = 1, 61, 121... Beginne mit n = 1 Prüfe, ob n durch 7 ohne Rest teilbar ist. Ist dies der Fall, dann brich ab und gib das Ergebnis aus. Andernfalls erhöhe n um 60 und prüfe nochmal.

Eier im Korb - Zweites Java-Programm 16 / 31 public class Eier2 { } public s t a t i c void main ( S t r i n g [ ] args ){ i n t i =1; do i += 60; while ( i%7!= 0 ) ; System. out. p r i n t l n ( Es waren + i + Eier im Korb. ) ; }

17 / 31 Vergleich der Effizienz Programm 2 braucht nur 1/60 der Rechenzeit von Programm 1 Beide Programm brauchen nur Bruchteile einer Sekunde Rechenzeit spielt hier keine Rolle Fazit: Die Arbeitszeit des Programmierers für die mathematischen Überlegungen ist verschwendet Übrigens... es waren 301 Eier im Korb!

Gliederung 18 / 31 1 Überlegungen zur Effizienz 2 Landau-Symbole 3 Eier im Korb 4 Zyklische Ziffern

19 / 31 Zyklische Ziffern - Das Problem Finde eine Zahl mit Endziffer 5 Multipliziere sie mit 5 Ist das Produkt gleich der ursprünglichen Zahl, wenn man die 5 am Ende streicht und dafür vorne anfügt? Beispiel: 5 * abcd5 = 5abcd (mit 4 Ziffern a, b, c, d) Verallgemeinerung: ersetze 5 durch Faktor 2 bis 9 Quelle: Jacques Arsac, Computerdenkspiele selbst programmiert, Problem 3

20 / 31 Zyklische Ziffern - Erster Algorithmus Teste alle Zahlen n = 1, 2, 3,... Beginne mit n = 1 Prüfe, ob die Zahl n die Bedingung Zyklische Ziffern erfüllt Ist dies der Fall, dann brich ab und gib das Ergebnis aus. Andernfalls erhöhe n um 1 und prüfe nochmal.

Zyklische Ziffern - Erstes Java-Programm 21 / 31 public class Z y k Z i f f 1 { } public s t a t i c void main ( S t r i n g [ ] args ){ i n t i =0; do i ++; while ( i 5!= i /10+50000); / / bei 4 Z i f f e r n abcd System. out. p r i n t l n ( Zyklische Z i f f e r n : + i ) ; }

22 / 31 Zyklische Ziffern - Probleme mit diesem Programm Unbekannt, ob 4 Stellen abcd nötig sind oder mehr oder weniger Ggf. müssen alle Stellenzahlen durchprobiert werden Reicht der Zahlbereich von int (9 Stellen) aus? Reicht long (19 Stellen)? Rechenzeit???

23 / 31 Zyklische Ziffern - Mathematische Idee Führe Ziffernvergleich bei 5 abcd5 = 5abcd durch, beginnend bei der niederwertigsten Ziffer. 5 abcd5 = 5abcd führt wegen 5 5 = 25 zu d = 5 Es entsteht ein Übertrag von 2, der im nächsten Schritt zu berücksichtigen ist 5 abc55 = 5abc5 führt wegen 5 5 + 2 = 27 zu c = 7 Es entsteht ein Übertrag von 2 5 ab755 = 5ab75 führt wegen 5 7 + 2 = 37 zu b = 7 Es entsteht ein Übertrag von 3 usw. (egal wie viele Stellen abcd vorliegen) Der Algorithmus ist zu Ende, wenn die berechnete Ziffer = 5 ist, und der Übertrag = 0 ist

24 / 31 Zyklische Ziffern - Zweiter Algorithmus Verallgemeinerung: ersetze 5 durch beliebigen Faktor 2 bis 9 Starte mit Ziffer = Faktor und Übertrag = 0 Berechne das 2-stellige Produkt = Ziffer * Faktor + Übertrag Zerlege Produkt in die niederwertige Ziffer und den höherwertigen Übertrag Wiederhole solange die berechnete Ziffer nicht gleich dem Faktor ist, oder der Übertrag nicht 0 ist

Zyklische Ziffern - Zweites Programm 25 / 31 import java. u t i l. ; public class Z y k z i f f 5 { public s t a t i c void main ( String [ ] args ) { Locale. s e t D e f a u l t ( Locale.US ) ; Scanner sc = new Scanner ( System. in ) ; i n t Faktor, Ziffer, Uebertrag =0, Produkt, Stellen =0; System. out. p r i n t ( Mit welchem Faktor s o l l m u l t i p l i z i e r t werden? ) ; Faktor = sc. nextint ( ) ; / / Faktor einlesen Z i f f e r = Faktor ; / / n i e d e r w e r t i g s t e Z i f f e r = Faktor System. out. p r i n t l n ( Das Ergebnis l a u t e t ( rueckwaerts gelesen! ) : ) ; do { System. out. p r i n t ( Z i f f e r ) ; / / a k t u e l l e Z i f f e r ausdrucken S t e l l e n ++; / / S t e l l e n z a h l bei j e d e r Ausgabe erhoehen Produkt = Z i f f e r Faktor + Uebertrag ; / / neues Produkt, z w e i s t e l l i g Z i f f e r = Produkt % 10; / / neue Z i f f e r = n i e d e r s t e S t e l l e des Produkts Uebertrag = Produkt / 10; / / neuer Uebertrag = hoechste S t e l l e des Produk } / / wiederholen, wenn eine der beiden... while ( Z i f f e r!= Faktor Uebertrag!= 0 ) ; / /... Abbruch Bedingungen v e r l e t z t i s t System. out. p r i n t l n ( ) ; System. out. p r i n t l n ( Es hat + S t e l l e n + S t e l l e n ) ; } }

Zyklische Ziffern - Ergebnisse 26 / 31 c:\b\java>java Zykziff5 Mit welchem Faktor soll multipliziert werden? 5 Das Ergebnis lautet (rueckwaerts gelesen!): 557783964376381959798442216035623618040201 Es hat 42 Stellen

Zyklische Ziffern - Ergebnisse 27 / 31 Mit welchem Faktor soll multipliziert werden? 2 248637498751362501 Es hat 18 Stellen Mit welchem Faktor soll multipliziert werden? 3 3973142715569860268572844301 Es hat 28 Stellen Mit welchem Faktor soll multipliziert werden? 4 465201 Es hat 6 Stellen Mit welchem Faktor soll multipliziert werden? 6 6697760446811726754748050389833022395531882732452519496101 Es hat 58 Stellen Mit welchem Faktor soll multipliziert werden? 7 7975048813263572944101 Es hat 22 Stellen Mit welchem Faktor soll multipliziert werden? 8 8487228562101 Es hat 13 Stellen Mit welchem Faktor soll multipliziert werden? 9 91742202834944046788980825779716505595321101 Es hat 44 Stellen

28 / 31 Zyklische Ziffern - Laufzeit des zweiten Algorithmus 42 Schleifendurchläufe etwa 10 Operationen pro Schleife theoretisch etwa 10 7 Sekunden auf einem handelsüblichen PC mit Java-Overhead (Interpretation, Startup) deutlich unter 1 Sekunde

29 / 31 Zyklische Ziffern - Laufzeit des ersten Algorithmus Er benötigt 10 42 Schleifendurchläufe = etwa 10 43 Operationen Schnellster Rechner zzt. (2007, Quelle: www.top500.org): knapp 10 15 Flops Dieser braucht etwa 10 28 Sekunden zur Lösung 10 28 Sekunden = etwa 10 20 Jahre (1 Jahr = 365 86400 Sekunden = etwa 3 10 7 Sekunden)... aber das Universum existiert erst etwa 10 10 Jahre seit dem Urknall!

30 / 31 Zyklische Ziffern - Laufzeitvergleich der beiden Algorithmen Der erste Algorithmus braucht 10 20 Jahre auf dem schnellsten Rechner der Erde Der zweite Algorithmus braucht einen Bruchteil einer Sekunde auf einem handelsüblichen PC Fazit: Nachdenken über mathematische Hintergründe hat sich gelohnt

Zyklische Ziffern - Wann sind Computer schnell genug für den ersten Algorithmus? Der erste Algorithmus braucht 10 20 Jahre auf dem heute schnellsten Rechner der Erde Supercomputer wurden im letzten Jahrzehnt fast um den Faktor 1000 schneller (Quelle: www.top500.org) In 70 Jahren wäre das (theoretisch!!!) ein Faktor 10 21 Im Jahre 2080 bräuchte der schnellste Computer der Erde noch 1 Monat (sehr theoretisch!!!) 31 / 31