Zählen ohne Aufzählen
Die Produktregel, Permutationen gegen Kombinationen, das Schubfachprinzip und warum rohe Gewalt explodiert.
Jede Zählfrage ist eigentlich eine Frage danach, wie viele Antworten ein Entscheidungsverfahren hat. Eine Art, solche Fragen zu beantworten, kennen Sie schon: eine Schleife schreiben, aufzählen, die Ausgabe ansehen. Das funktioniert, solange die Ausgabe klein ist, und dann hört es vollständig auf zu funktionieren, nicht allmählich. In dieser Lektion geht es darum, die Zahl zu bekommen, ohne die Liste je zu erzeugen.
/* multiplication rule */
3 starters * 4 mains * 2 desserts = 24
plate: 4 letters, 3 digits
26^4 = 456976
26^4 * 10^3 = 456976000
/* addition rule */
12 routes + 7 routes = 19 routesDie Produktregel ist das Fundament, und sie ist wirklich so einfach: kann man eine erste Wahl auf a Arten treffen und danach eine zweite auf b Arten, so kann man das Paar auf a mal b Arten treffen. Zwei Faustregeln halten sie ehrlich. Multiplizieren Sie, wenn die Wahlen nacheinander geschehen; addieren Sie, wenn es Alternativen sind, die nie zusammen auftreten. Fast jeder Zählfehler ist eine dieser beiden Regeln an der Stelle, an die die andere gehört hätte.
/* ordered choice: pile of 10 people, 3 different prizes */
10 choices, then 9, then 8
P(10, 3) = 10 * 9 * 8
= 720
P(n, r) = n! / (n - r)!Zehn Personen und drei verschiedene Medaillen ergeben siebenhundertzwanzig Möglichkeiten, und die Produktregel allein bringt Sie dorthin: zehn Möglichkeiten für Gold, neun verbleibende für Silber, acht für Bronze. Das ist eine geordnete Auswahl, geschrieben als P von n und r, und die Formel ist ein fallendes Produkt, das nach r Faktoren abbricht, also n Fakultät geteilt durch n minus r Fakultät. Die Zahl ist nur groß, weil die Reihenfolge als Information zählt.
/* unordered choice: same 10 people, 3 identical seats */
C(n, r) = P(n, r) / r!
C(10, 3) = 720 / (3 * 2 * 1)
= 720 / 6
= 120Nun lassen wir die Reihenfolge weg. Dieselben drei Personen in anderer Anordnung auf dem Podium sind kein anderes Ergebnis, wenn die Preise gleich sind, sondern eine Gruppe. Jede Dreiergruppe wurde drei Fakultät mal gezählt, einmal pro Anordnung, also korrigiert die Division durch drei Fakultät genau diese Überzählung. Das ist der ganze Grund, warum der Divisor r Fakultät ist und nicht irgendeine andere Korrektur: es ist die Zahl der Anordnungen, die Sie gerade beschlossen haben zu ignorieren. C von 10 und 3 ist 120, sechsmal kleiner als die geordnete Antwort, und die Merkregel lautet: Kombinationen sind Permutationen mit herausgeteilter Reihenfolge.
Das Schubfachprinzip ist das erste Zählargument, das eine garantierte Antwort liefert statt einer wahrscheinlichen. Wenn n Gegenstände in m Fächer gelegt werden und n größer ist als m, enthält ein Fach mindestens zwei. Das ist alles, es ist offensichtlich, und es ist dennoch eines der nützlichsten Werkzeuge der Algorithmenanalyse, weil es aus reinem Zählen Gewissheit erzeugt. Eine echte Anwendung: eine Hashtabelle hat mehr mögliche Schlüssel als Körbe, also sind Kollisionen kein Zeichen einer schlechten Hashfunktion, sondern eine mathematische Gewissheit. Eine gute Hashfunktion verteilt sie gleichmäßig, statt sie zu beseitigen. Jedes Argument der Art, es werde keine Kollisionen geben, weil der Hash gut sei, ist falsch, bevor es beginnt.
Das Schubfachprinzip erklärt auch, warum die Frage, wie viele Menschen man braucht, damit zwei denselben Geburtstag haben, nicht die Frage ist, die alle zuerst beantworten. Man vergleicht die Zahl der Menschen mit der Zahl der Tage und sagt hundertachtzig. Aber die Fächer sind nicht Menschen gegen Tage, sondern Menschenpaare gegen Tage, und die Zahl der Paare wächst quadratisch, während die Zahl der Menschen linear wächst. Bei dreiundzwanzig Menschen gibt es zweihundertdreiundfünfzig Paare, und die Chance auf mindestens eine Übereinstimmung liegt schon bei etwa der Hälfte. Das ist dieselbe Form wie das Kollisionsargument oben, und deshalb ist eine zufällige Kennung mit vierundsechzig Bit in Ordnung, während eine mit sechzehn Bit ein Produktionsvorfall ist.
birthday problem, 365 days
two people differ: 364 / 365
23 people:
C(23, 2) = 23 * 22 / 2 = 253 pairs
(364 / 365)^253 = 0.4995
1 - 0.4995 = 0.5005
70 people: 1 - (364 / 365)^2415 > 0.999Lesen Sie die Geburtstagszahlen als Warnung über die Intuition, nicht als Kunststück. Sechzig Menschen ergeben eintausendsiebenhundertsiebzig Paare, und die Chance auf einen gemeinsamen Geburtstag steigt über neunundneunzig Prozent. Daran ist arithmetisch nichts Feinliches; die Überraschung entsteht allein daraus, dass wir paarweise Ereignisse schätzen, als wären sie unabhängig, und das sind sie nicht. Die praktische Fassung für eine Entwicklerin lautet: der Raum der Kollisionen ist quadratisch in der Zahl der Objekte, also liegt die Geburtstagsschranke immer viel niedriger als die naive.
/* brute force, 10^9 steps per second */
n = 1 2! = 2
n = 10 10! = 3.6 * 10^6
n = 13 13! = 6.2 * 10^9 6 seconds
n = 15 15! = 1.3 * 10^12 22 minutes
n = 18 18! = 6.4 * 10^15 74 days
n = 20 20! = 2.4 * 10^18 77 years
n = 25 25! = 1.6 * 10^25 5 * 10^8 yearsUnd schließlich: deshalb ist Zählen für Algorithmen wichtig. Eine Permutationssuche über zwanzig Elemente ist nicht zwanzigmal langsamer als eine über ein Element, sondern zwanzig Fakultät, was die Zahl der Sekunden, die das Universum existiert, mit großem Abstand übersteigt. Die Sprünge zwischen den Zeilen unten sind keine glatte Kurve, sondern eine Klippe, und diese Klippe ist der Grund, warum ein bei kleinen Eingaben korrekter Algorithmus bei echten völlig unbrauchbar sein kann. Wenn jemand sagt, ein Problem sei schwer, meint er meist, die Lösung durch rohe Gewalt sei eine Permutationszahl, und keine Hardware ändert das.
Praxis
Ein Verein hat 10 Mitglieder. Gold, Silber und Bronze gehen an drei verschiedene Mitglieder, und die Medaillen sind verschiedene Gegenstände. Auf wie viele Arten lassen sich die Medaillen vergeben, und warum?
Hinweise
- Entscheiden Sie zuerst, ob Gold, Silber und Bronze verschiedene Preise sind. Wenn ja, ist eine andere Reihenfolge derselben drei Personen ein anderes Ergebnis.
- Gehen Sie von 10 * 9 * 8 aus und fragen Sie dann, ob dieselben drei Personen mehr als einmal gezählt wurden.
Ordnen Sie jeder Zählsituation ihre Antwort zu. Jede Antwort rechts wird genau einmal verwendet.
Hinweise
- Schreiben Sie jede Situation als Produkt und vergleichen Sie dann die Produkte: der Unterschied ist immer ein zusätzlicher Faktor.
- Die Schlüssel sind zu Paaren gruppiert, die bis auf einen zusätzlichen Faktor r dieselbe Zahl ergeben.
Bringen Sie dieses Schubfachargument in die richtige Reihenfolge. Behauptung: unter je 10 Socken, von denen jede eine von 9 Farben hat, haben mindestens zwei dieselbe Farbe.
- 1also wird mindestens eine Farbe von zwei oder mehr Socken genutzt
- 2es gibt aber 10 Socken, und das ist mehr als 9
- 3würde jede Farbe von höchstens einer Socke genutzt, ließen sich höchstens 9 Socken unterbringen
- 4es gibt 10 Socken und 9 Farben
- 5betrachten Sie jede Socke als Taube und jede Farbe als Fach
Hinweise
- Die Kiste hat neun Fächer, und Sie sind dabei, zehn Dinge hineinzulegen, also benennen Sie zuerst die Tauben und die Fächer.
- Denken Sie bei den letzten beiden Schritten daran, was das Fach mit zwei Dingen mit der Aussage des vorigen Schrittes macht.
Fragen zu dieser Lektion
Warum mit Logik und Mengen beginnen?
Weil alles andere darauf aufbaut. Datenbanken sind Mengen, Programme sind boolesche Entscheidungen, und „ist das schnell genug?“ ist die Mathematik des Wachstums. Wer das überspringt, erlebt spätere Fächer als Auswendiglernen.
Was sagt Big-O eigentlich aus?
Wie der Aufwand wächst, wenn die Eingabe wächst. Es ist keine Stoppuhr: Es sagt, ob sich die Zeit bei doppelten Daten verdoppelt oder vervierfacht. Dieser Unterschied entscheidet, ob ein Programm den echten Einsatz übersteht.
Ist das kostenlos?
Ja. Die erste Ebene jedes Fachs ist kostenlos und braucht kein Konto. Tiefere Ebenen und die höheren Stufen sind kostenpflichtig — genau das hält das Projekt am Leben.
Für welches Alter ist das gedacht?
Für neugierige Jugendliche ab etwa 12 Jahren und für Erwachsene, die bei null anfangen. Programmiererfahrung wird nicht vorausgesetzt; die Lektionen zu Netzwerken und Physik brauchen keine Mathematik über Schulniveau.
Muss ich schon programmieren können?
Nein. Logik, Physik und Netzwerke beginnen bei null. Code schreibst du im Bereich Programmiersprachen — und auch der fängt vorne an.
Muss ich etwas installieren?
Nein. Alles läuft im Browser: Theorie, Übungen und die interaktiven Simulationen. Es gibt nichts herunterzuladen und nichts einzurichten.
Wie lange dauert ein Fach?
Eine Lektion dauert 10 bis 15 Minuten. Eine Junior-Stufe umfasst etwa 12 bis 20 Lektionen, also einige Wochen regelmäßiger Übung statt eines Abends.
Muss ich der Reihenfolge folgen?
Innerhalb einer Stufe öffnen sich die Ebenen nacheinander, weil jede auf der vorherigen aufbaut. Zwischen den Fächern bist du frei: beginne mit Logik, Physik oder Netzwerken.