Περπατώντας έξω από ένα κατάστημα που σερβίρει καφέδες διαφόρων ειδών συναντά κανείς τον ισχυρισμό που φαίνεται στο Σχήμα 3.1, που αρχικά φαίνεται μάλλον εξωφρενικός. Είναι όμως;
Ας υποθέσουμε ότι κάποιος πίνει τον καφέ του με ή χωρίς ζάχαρη, με ή χωρίς γάλα. (Οι ποσότητες γάλατος και ζάχαρης που μπορεί κανείς να έχει είναι σταθερές. Δεν υπάρχει με ολίγη.) Πόσα διαφορετικά είδη από καφέ πρέπει να μπορεί να φτιαξει ένα καφενείο ώστε να μπορεί να εξυπηρετήσει όλους τους πελάτες;
Η απάντηση είναι 4:
Αν σκεφτούμε λίγο προσεκτικότερα θα συνειδητοποιήσουμε ότι
και ότι ο λόγος που η απάντηση είναι αυτή είναι
ότι κάθε μια από τις δύο δυνατές επιλογές όσον αφορά το περιεχόμενο
σε γάλα μπορεί να συνδυαστεί με κάθε μία από τις δύο δυνατές επιλογές
που αφορούν στο περιεχόμενο σε ζάχαρη.
Η αρχή του πολλαπλασιασμού ανεξάρτητων επιλογών κωδικοποιεί την απλή αυτή παρατήρηση που κάναμε:
Ας υποθέσουμε ότι έχουμε να παραγματοποιήσουμε μια σύνθετη επιλογή, η οποία συνίσταται από την πραγματοποίησηεπί μέρους επιλογών, που πραγματοποιούνται ανεξάρτητα η μία από την άλλη, είναι δηλ. τέτοιες οι επί μέρους επιλογές ώστε η επιλογή τιμών για κάποιες από αυτές να μην επηρεάζει τις δυνατότητες που υπάρχουν για τις υπόλοιπες. Τότε το συνολικό πλήθος δυνατοτήτων που έχουμε για τη σύνθετή μας επιλογή είναι το γινόμενο των
δυνατοτήτων για τις επί μέρους επιλογές μας.
Σε πιο αυστηρή γλώσσα η αρχή του πολλαπλασιασμού ανεξαρτήτων επιλογών εκφράζεται ως εξής
(γενικά με
συμβολίζουμε τον πληθάριθμο-πόσα στοιχεία έχει-του συνόλου
):
A = ['Sweet', 'Medium', 'No Sugar'] B = ['With milk', 'No milk'] for x in A: for y in B: print "Sugar: ", x, " Milk: ", yΤρέξτε το πρόγραμμα. Πόσες γραμμές τυπώνει; Τροποποιήστε το πρόγραμμα ώστε να συμπεριλαμβάνει και ένα επιπλέον χαρακτηριστικό του καφέ, το μέγεθος, το οποίο έχει τρεις δυνατές τιμές:
C = ['Large', 'Medium', 'Small']
Υπόδειξη: Πόσους μονοψήφιους, πόσους διψήφιους και πόσους τριψήφιους μπορείτε να φτιάξετε;
Λύστε το ίδιο πρόβλημα για πινακίδες μοτοσυκλετών: 3 γράμματα ακολουθούμενα από ένα αριθμό που μπορεί να είναι μονοψήφιος, διψήφιος ή τριψήφιος αλλά όχι 0.
Υπόδειξη: Εμμέσως υποθέτουμε εδώ ότι όλα τα δυνατά αποτελέσματα αυτού του πειράματος είναι εξίσου πιθανά.
Αν είναι λοιπόν ο αριθμός όλων των δυνατών αποτελεσμάτων τότε το κάθε ένα από αυτά εμφανίζεται
περίπου το
του χρόνου (με συχνότητα δηλ.
). Πρώτα λοιπόν θα πρέπει να βρείτε το
: πόσα
είναι τα δυνατά αποτελέσματα αυτού του πειράματος; Πόσα είναι δηλ. τα δυνατά ζεύγη
, με
Αντί να μετρήσουμε λοιπόν τα στοιχεία του
Για να μετρήσουμε τώρα τις -άδες (3.4) σκεφτόμαστε ως εξής:
για να επιλέξουμε μια τυχούσα
-άδα πρέπει να κάνουμε
ανεξάρτητες
επιλογές, μια για κάθε
, και σε κάθε μια από αυτές τις επιλογές
έχουμε δύο δυνατότητες.
Άρα, το πλήθος δυνατοτήτων για τη συνολική επιλογή είναι
.
def subsets(s): n = len(s) # empty set contains only the empty set if n==0: return [[]] # s1 is set s without its first element s1 = s[1:] f = s[0] # f is the first element of set s # all subsets of s not containing its first element, f p1 = subsets(s1) # p2 will contain all subsets of s containing f p2 = [] for x in p1: p2.append([f]+x) return p2+p1Κατανοήστε το πώς δουλεύει αυτή η συνάρτηση subsets. (Η συνάρτηση αυτή είναι αναδρομική (recursive), καλεί δηλ. τον εαυτό της.) Μπορείτε να τη δοκιμάσετε ως εξής:
s = ['a', 'b', 'c', 'd'] print subsets(s)για να πάρετε το output
[['a', 'b', 'c', 'd'], ['a', 'b', 'c'], ['a', 'b', 'd'], ['a', 'b'], ['a', 'c', 'd'], ['a', 'c'], ['a', 'd'], ['a'], ['b', 'c', 'd'], ['b', 'c'], ['b', 'd'], ['b'], ['c', 'd'], ['c'], ['d'], []]
Τα σύνολα αυτά μπορούν να είναι και κενά.
Για να απαντήσουμε σκεφτόμαστε ως εξής, και ο τρόπος αυτός σκέψης αποτελεί υπόδειγμα για το πώς σκεφτόμαστε στην πλειονότητα των περιπτώσεων. Για να μετρήσουμε λοιπόν τα συγκεκριμένα αντικείμενα βρίσκουμε, κατ' αρχήν, μια διαδικασία για να τα κατασκευάσουμε. Αυτή η διαδικασία πρέπει να είναι τέτοια ώστε
Είναι φανερό πως αν έχουμε δύο διαφορετικές ακολουθίες από τις
αυτές επιλογές, τότε αυτές οδηγούν σε δύο διαφορετικά αντικείμενα,
σε δύο διαφορετικά δηλ. ζεύγη ξένων υποσυνόλων
.
Έτσι, το πλήθος των αντικειμένων που μας ενδιαφέρει είναι ίσο με
το πλήθος των δυνατών ακολουθιών επιλογών μας.
Είναι επίσης φανερό ότι οι
απλές επιλογές που απαρτίζουν αυτή την ακολουθία
επιλογών είναι ανεξάρτητες μεταξύ τους, αφού κάθε φορά, και ότι
και να έχουμε επιλέξει μέχρι στιγμής, τρείς είναι οι δυνατές επιλογές μας
για τον τρέχοντα αριθμό
, δηλ. να επιλέξουμε
.
ή
.
Έτσι, το τελικό αποτέλεσμα είναι
Υπόδειξη: Αφαιρέστε από την απάντηση που δόθηκε στο Παράδειγμα 3.1 μια κατάλληλη ποσότητα που αντιπροσωπεύει επιλογές που δεν πληρούν το κριτήριο της μη κενότητας που έχουμε θέσει.
Μια συνάρτηση από το σύνολο στο σύνολο
είναι απλά μια αντιστοίχιση
κάθε στοιχείου του
σε κάποιο στοιχείο του
.
Αν
και
πόσες τέτοιες συναρτήσεις υπάρχουν;
Η απάντηση είναι
:
Υπόδειξη:
Υπόδειξη: Πόσες επιλογές έχετε για την εικόνα του ;
Υπόδειξη: Πόσοι δεν έχουν;
Εφαρμόστε το αποτέλεσμά σας στον αριθμό και απαριθμήστε και τους διαιρέτες του έναν-έναν μαζί
με το ανάπτυγμα του καθενός σε γινόμενο πρώτων.
Mihalis Kolountzakis 2015-11-28