Σύνοψη Προηγούμενου Πίνακες (Arrays Ορέστης Τελέλης telelis@unipi.gr Τμήμα Ψηφιακών Συστημάτων, Πανεπιστήμιο Πειραιώς Διαδικαστικά θέματα. Aντικείμενο Μαθήματος. Aντικείμενα, Κλάσεις, Μέθοδοι, Μεταβλητές. Κληρονομικότητα, Πολυμορφισμός. Πειραματική Aνάλυση. Πολυπλοκότητα Aσυμπτωτική Ανάλυση. Τελέλης Δομές Δεδομένων 1 / 48 Τελέλης Δομές Δεδομένων 2 / 48 Πίνακες (Arrays Πίνακες (Arrays: Βασικές Λειτουργίες Aπλή, π.χ., arr[10] = 77; Διαδεδομένη δομή αποθήκευσης δεδομένων ίδιου τύπου. Aποθήκευση δεδομένων σε Προσπέλαση δεδομένων με βάση τη θέση τους στη μνήμη. i A A[i] Δισδιάστατος Πίνακας m n είναι πίνακας με m γραμμές και n στήλες. Τα m και n αντιστοιχούν στις δύο διαστάσεις του πίνακα. Αν απαιτείται, μπορεί να χρησιμοποιούνται πολυδιάστατοι πίνακες. Π.χ., του στοιχείου με τιμή 77. από την αρχή, μέχρι να εντοπίσουμε τη θέση όπου είναι αποθηκευμένο το 77. η θέση του στοιχείου προς διαγραφή. Τα στοιχεία σε μεγαλύτερες θέσεις μετακινούνται μία θέση αριστερά. (είναι όμως δυνατό να υλοποιηθεί και με αυτό τον τρόπο. Τελέλης Δομές Δεδομένων 3 / 48 Τελέλης Δομές Δεδομένων 4 / 48
Εισαγωγή Στοιχείου Εστω πίνακας A χωρητικότητας 10 θέσεων Ένα νέο στοιχείο εισάγεται στο πρώτο κενό κελί Aναζήτηση Στοιχείου Η αναζήτηση γίνεται με βάση την τιμή του στοιχείου, έστω το 58. Διατρέχουμε τον πίνακα κελί-κελί από την πρώτη θέση μέχρι την τελευταία θέση στην οποία υπάρχει αποθηκευμένο στοιχείο. Εισαγωγή στοιχείου 37 στη θέση 0: a[0] = 37. Εάν συναντήσουμε το 58, σταματάμε (επιτυχής αναζήτηση. Εισαγωγή στοιχείου 22 στη θέση 1: a[1] = 22. Εισαγωγή στοιχείου 99 στη θέση 2: a[2] = 99. O(1 37 22 99 Μπορεί να μην το συναντήσουμε (αποτυχημένη αναζήτηση. Η αναζήτηση εξετάζει στη χειρότερη περίπτωση όλα τα n στοιχεία = (. 37 22 99 42 11 58 67 71 Τελέλης Δομές Δεδομένων 5 / 48 Τελέλης Δομές Δεδομένων 6 / 48 Συνέπεια και Διπλές Εγγραφές Άρα, δεν προβλέπεται εν γένει να περιέχει το ίδιο στοιχείο 2 φορές. Ο περιορισμός αυτός μπορεί να επιβληθεί από την υλοποίησή μας: Κατά την πράξη της ενός στοιχείου. Ελέγχουμε αν το προς εισαγωγή στοιχείο υπάρχει ήδη αποθηκευμένο. Ο έλεγχος αυτός προϋποθέτει πριν από την Στην περίπτωση αυτή η γίνεται O(n σε χρόνο O(1 Σημειώνεται ότι ίσως η εφαρμογή να απαιτεί διπλές εγγραφές. Διαγραφή Στοιχείου Η διαγραφή ενός στοιχείου απαιτεί πρώτα τον εντοπισμό του. Aφού εντοπιστεί το στοιχείο και διαγραφεί, όλα τα επόμενά του μεταφέρονται μία θέση αριστερά, ώστε να καλυφθεί το κενό. (, διότι: Aναζήτηση χρόνου O(n. Μετακίνηση O(n στοιχείων. 37 22 99 42 11 58 67 71 27 16 37 22 99 42 11 67 71 27 16 Τελέλης Δομές Δεδομένων 7 / 48 Τελέλης Δομές Δεδομένων 8 / 48
Διαγραφή: Εναλλακτική Υλοποίηση Διαγραφή και Διπλές Εγγραφές Αποφεύγουμε την ολίσθηση O(n στοιχείων προς τα αριστερά. Το τελευταίο στοιχείο αντιγράφεται στη θέση του διαγραφόμενου. 37 22 99 42 11 67 71 27 37 22 99 42 11 67 71 27 Η υλοποίηση αυτή είναι επίσης χρόνου O(n. Εξαιτίας της του στοιχείου προς διαγραφή. (από την πράξη : Πρέπει να αποφασίσουμε συμπεριφορά και. του στοιχείου με τιμή X? του στοιχείου με τιμή X? των στοιχείων με τιμή X? Η πρώτη είναι συνήθης επιλογή (τερματισμός στο πρώτο στοιχείο. Μπορούν να υλοποιηθούν όλες οι επιλογές ως χωριστές πράξεις. Τελέλης Δομές Δεδομένων 9 / 48 Τελέλης Δομές Δεδομένων 10 / 48 Πίνακες στη Java: Δημιουργία Πίνακα Πίνακες στη Java: Προσπέλαση Στοιχείων Πίνακα Με χρήση του τελεστή new. [ ] i n t A r r a y ; i n t A r r a y = [ 1 0 0 ] Τα στοιχεία ενός πίνακα προσπελαύνονται με δείκτη μέσα σε αγκύλες. tmp = i n t A r r a y [ 3 ] ; i n t A r r a y [ 7 ] = 6 6 ; [ ] i n t A r r a y = [ 1 0 0 ] ; Εύρεση μεγέθους πίνακα με χρήση του πεδίου length. a r r a y L e n g t h = i n t A r r a y. l e n g t h ; < 0 1 Τελέλης Δομές Δεδομένων 11 / 48 Τελέλης Δομές Δεδομένων 12 / 48
Πίνακες στη Java: Aρχικοποίηση Μερικά Παραδείγματα Ένας πίνακας ακεραίων αρχικοποιείται με το 0 όταν δημιουργείται. Aυτό μπορείτε να το αλλάξετε με τον εξής τρόπο: [ ] i n t A r r a y = { 0, 3, 6, 9, 12, 15, 18, 21, 24, 2 7 ; Ένας πίνακας περιέχει στοιχεία null, ώσπου αυτά να πάρουν τιμές AutoData [ ] c a r A r r a y = AutoData [ 4 0 0 0 ] ; [ ] x, y, z ; S t r i n g [ ] a ; x = [ 3 ] ; y = x ; a = S t r i n g [ 3 ] ; x [ 1 ] = 2 ; y [ 1 ] = 3 ; a [ 1 ] = H e l l o ; [ ] q ; q = [ ] { 1, 2, 3 ; [ ] r = { 7, 8, 9 ; Τελέλης Δομές Δεδομένων 13 / 48 Τελέλης Δομές Δεδομένων 14 / 48 Οργάνωση της Δομής σε Κλάση Η κλάση MyArray (και Αναζήτηση Ενσωμάτωση του πίνακα σε μία κλάση. Η κλάση αυτή θα παρέχει μια διεπαφή μεθόδων υψηλού επιπέδου: insert ( elem find ( elem delete ( elem Δε χρειάζεται ο χρήστης να ασχολείται με το δείκτη του πίνακα. Άρα, ο χρήστης επικεντρώνεται στο τι (όχι στο πώς πρόκειται να εισαχθεί, διαγραφεί και αναζητηθεί. MyArray { [ ] a ; nelems ; H i g h A r r a y ( max { a = [ max ] ; nelems = 0 ; f i n d ( s e a r c h K e y { j ; ( j = 0 ; j < nelems ; j ++ ( a [ j ] == s e a r c h K e y ; ( j == nelems ; ; Τελέλης Δομές Δεδομένων 15 / 48 Τελέλης Δομές Δεδομένων 16 / 48
Εισαγωγή, Διαγραφή Μία μέθοδος εκτύπωσης i n s e r t ( v a l u e { ( nelems >= a. l e n g t h ( ; a [ nelems ] = v a l u e ; nelems + + ; ( ; d e l e t e ( v a l u e { j ; ( j = 0 ; j < nelems ; j ++ ( v a l u e == a [ j ] ; ( j == nelems ; { ( k = j ; k < nelems ; k + + a [ k ] = a [ k + 1 ] ; nelems ; ; d i s p l a y ( { ( j = 0 ; j < nelems ; j ++ System. out. p r i n t ( a [ j ] + ; System. out. p r i n t l n ( ; Τελέλης Δομές Δεδομένων 17 / 48 Τελέλης Δομές Δεδομένων 18 / 48 Σχόλια Σχόλια: Εναλλακτική Υλοποίηση Αναζήτησης/Διαγραφής Η υλοποίηση αυτή επιτρέπει διπλές εγγραφές. Η ελέγχει μόνο αν υπάρχει αρκετός χώρος στον πίνακα. Αν όχι, επιστρέφει, διαφορετικά, επιστρέφει. Στην πράξη της υλοποιείται εκ νέου η αναζήτηση: Διότι απαιτείται η ακριβής θέση του στοιχείου προς διαγραφή. Η ακριβής θέση δε χρησιμεύει σε «εξωτερικό» χρήστη της find. Για το λόγο αυτόν η find επιστρέφει /. Οπότε, επαναλαμβάνεται ο κώδικας της αναζήτησης στη μέθοδο delete. myfind ( s e a r c h K e y { j ; ( j = 0 ; j < nelems ; j ++ ( a [ j ] == s e a r c h K e y ; ( j ; f i n d ( s e a r c h K e y { pos = myfind ( s e a r c h K e y ; ( pos == nelems ; ( ; Τελέλης Δομές Δεδομένων 19 / 48 Τελέλης Δομές Δεδομένων 20 / 48
Σχόλια: Εναλλακτική Υλοποίηση Αναζήτησης/Διαγραφής Σχόλια: Πίνακες Δυναμικού Μεγέθους d e l e t e ( v a l u e { j = myfind ( v a l u e ; ( j == nelems ; { ( k = j ; k < nelems ; k ++ a [ k ] = a [ k + 1 ] ; nelems ; ; Όταν διαπιστώνεται ότι ο πίνακας είναι πλήρης. Δημιουργείται νέος πίνακας, μεγαλύτερου μεγέθους. διπλασιασμός του μεγέθους. Αντιγράφεται όλος ο παλιός πίνακας στον νέο πίνακα. Πραγματοποιείται εισαγωγή του νέου στοιχείου. Η γίνεται στην περίπτωση αυτή O(n χρόνου. Λόγω της αντιγραφής όλων των στοιχείων του παλιού πίνακα. Τελέλης Δομές Δεδομένων 21 / 48 Τελέλης Δομές Δεδομένων 22 / 48 Ταξινομημένοι Πίνακες Ένας πίνακας στον οποίο τα δεδομένα διευθετούνται σε αύξουσα σειρά κλειδιού (ή και φθίνουσα. Η μικρότερη τιμή κλειδιού βρίσκεται στο κελί με δείκτη 0. Κάθε κελί περιέχει τιμή μεγαλύτερη από το προηγούμενο κελί. 11 22 37 42 58 67 71 83 Τελέλης Δομές Δεδομένων 23 / 48 Τελέλης Δομές Δεδομένων 24 / 48
Γραμμική Aναζήτηση Δυαδική Aναζήτηση Μπορώ να εφαρμόσω την αναζήτηση όπως ακριβώς στην περίπτωση του μη ταξινομημένου πίνακα. Διατρέχω τον πίνακα κελί-κελί από την πρώτη θέση μέχρι την τελευταία θέση στην οποία υπάρχει αποθηκευμένο στοιχείο. Εάν συναντήσουμε το 58, σταματάμε (επιτυχής αναζήτηση. Μπορεί να μην το συναντήσουμε (αποτυχημένη αναζήτηση. Λέγεται και και έχει πολυπλοκότητα O(n, όπου n το πλήθος στοιχείων του πίνακα. Πολύ ταχύτερη από τη γραμμική αναζήτηση. Πώς λειτουργεί η εύρεση του στοιχείου με τιμή X? Χωρίζει τον πίνακα στη μέση, σε αριστερό και δεξιό κομμάτι, ελέγχει το κλειδί M που περιέχεται στο μεσαίο κελί, αν X = M, τότε η αναζήτηση είναι επιτυχής. αν X < M επαναλαμβάνει τη διαδικασία στο αριστερό κομμάτι, αν X > M επαναλαμβάνει τη διαδικασία στο δεξιό κομμάτι, Τελέλης Δομές Δεδομένων 25 / 48 Τελέλης Δομές Δεδομένων 26 / 48 Παράδειγμα Δυαδικής Aναζήτησης Δυαδική Aναζήτηση 11 22 37 42 58 67 71 83 1η Επανάληψη: 11 22 37 42 58 67 71 83 2η Επανάληψη: 11 22 37 42 58 67 71 83 3η Επανάληψη: 11 22 37 42 58 67 71 83 11 22 37 42 58 67 83 Κάθε επανάληψη χωρίζει το εύρος των πιθανών τιμών στη μέση. Σε κάθε επανάληψη, υποδιπλασιάζεται το μέγεθος του πίνακα στο οποίο αναζητούμε. (log O(n Τελέλης Δομές Δεδομένων 27 / 48 Τελέλης Δομές Δεδομένων 28 / 48
Τυπική Aπόδειξη Έστω ταξινομημένος πίνακας (π.χ., ακεραίων μήκους L(0 = n. Εκτελούμε δυαδική αναζήτηση, που διαρκεί k επαναληπτικά βήματα. Στο i-οστό βήμα, εκτελούμε σταθερό αριθμό στοιχειωδών πράξεων: βρίσκουμε το μεσαίο στοιχείο ενός (υπο-πίνακα, O(1 συγκρίσεις του στοιχείου προς αναζήτηση. Επίσης, στο i-οστό βήμα δουλεύουμε σε υποπίνακα μήκους L(i 1/2: L(i = L(i 1 2 = L(i 2 2 2 = = L(0 2 i = n 2 i Ο αλγόριθμος τερματίζει όταν το μήκος του (υπο-πίνακα που εξετάζουμε σε κάποιο βήμα είναι 1: άρα, όταν L(k = 1 = n/2 k. Τότε: 2 k = n = log(2 k = log n = k = log n Υλοποίηση Ταξινομημένου Πίνακα OrderedArray { [ ] a ; nelems ; OrderedArray ( max { a = [ max ] ; nelems = 0 ; s i z e ( { nelems ; Τελέλης Δομές Δεδομένων 29 / 48 Τελέλης Δομές Δεδομένων 30 / 48 Υλοποίηση Δυαδικής Αναζήτησης myfind ( s e a r c h K e y { lowerbound = 0 ; upperbound = nbelems 1; c u r I n ; ( { c u r I n = ( lowerbound + upperbound / 2 ; ( a [ c u r I n ]== s e a r c h K e y c u r I n ; ( lowerbound > upperbound nelems ; ( a [ c u r I n ] < s e a r c h K e y lowerbound = c u r I n + 1 ; upperbound = c u r I n 1 ; f i n d ( s e a r c h K e y { j = myfind ( s e a r c h K e y ; ( j == nelems ( ; ( ; Τελέλης Δομές Δεδομένων 31 / 48 Υλοποίηση Εισαγωγής και Διαγραφής i n s e r t ( v a l u e { ( nelems >= a. l e n g t h ( ; j ; ( j = 0 ; j < nelems ; j ++ ( a [ j ] > v a l u e ; ( k = nelems ; k > j ; k a [ k ] = a [ k 1]; a [ j ] = v a l u e ; nelems + + ; ( ; d e l e t e ( v a l u e { j = myfind ( v a l u e ; ( j == nelems ; ( k = j ; k < nelems ; k ++ a [ k ] = a [ k + 1 ] ; nelems ; ; Τελέλης Δομές Δεδομένων 32 / 48
Μία Μέθοδος Εκτύπωσης Σχόλια O(n d i s p l a y ( { ( j = 0 ; j < nelems ; j ++ System. out. p r i n t ( a [ j ] + ; System. out. p r i n t l n ( ; Διότι ολισθαίνει O(n στοιχεία προς τα δεξιά, προκειμένου να τοποθετήσει το νέο στοιχείο στη σωστή θέση. Χρησιμοποιεί γραμμική αναζήτηση προς εύρεση της σωστής θέσης. Δεν επιβαρύνει την ασυμπτωτική της πολυπλοκότητα O(n: αλλά μπορεί να αποφευχθεί, με χρήση δυαδικής αναζήτησης. Απαιτείται κατάλληλη υλοποίηση της myfind, που να επιστρέφει τη θέση του αμέσως προηγούμενου στοιχείου. Τελέλης Δομές Δεδομένων 33 / 48 Τελέλης Δομές Δεδομένων 34 / 48 Σχόλια Χαρακτηριστικά Ταξινομημένων Πινάκων Κάθε νέο στοιχείο ίδιας τιμής θα εγγραφεί στη θέση του παλαιού. Διότι, γίνεται πρώτα (γραμμική αναζήτηση: για τη θέση του 1ου στοιχείου που είναι μεγαλύτερο του εισαγόμενου. Στη γραμμή: (a[ j ] > value ; Αυτό είναι συνεπές και με την υλοποίηση της δυαδικής αναζήτησης: που επιστρέφει μία θέση μόνο, εφόσον το στοιχείο υπάρχει. Εκθετικά ταχύτερη αναζήτηση από ότι σε μη ταξινομημένο πίνακα. Τίμημα: ακριβή εισαγωγή O(n χρόνου, για διατήρηση ταξινόμησης. Aν a είναι η τιμή του εισαγόμενου κλειδιού, απαιτείται ολίσθηση κατά 1 θέση των στοιχείων με μεγαλύτερα κλειδιά, για να δημιουργηθεί χώρος για το στοιχείο με τιμή a. Διαγραφή αργή, O(n χρόνου σε ταξινομημένους ή μη πίνακες. Οι ταξινομημένοι πίνακες είναι χρήσιμοι όταν οι αναζητήσεις είναι σημαντικά συχνότερες από εισαγωγές και διαγραφές. Τελέλης Δομές Δεδομένων 35 / 48 Τελέλης Δομές Δεδομένων 36 / 48
Σύνοψη Πολυπλοκότητας Γιατί δε Χρησιμοποιούμε τους Πίνακες για όλα? Γραμμική Aναζήτηση O(n Δυαδική Aναζήτηση O(log n Εισαγωγή σε ταξινομημένο πίνακα O(1 Εισαγωγή σε ταξινομημένο πίνακα O(n Διαγραφή σε ταξινομημένο πίνακα O(n Θέματα απόδοσης. Μη ταξινομημένοι πίνακες. Γρήγορη εισαγωγή O(1, όμως αργή αναζήτηση/διαγραφή O(n Ταξινομημένοι πίνακες. Γρήγορη αναζήτηση O(log n, όμως αργή εισαγωγή/διαγραφή O(n Σταθερό μέγεθος πινάκων κατά τη δημιουργία. Πρέπει να εκτιμήσουμε από πριν το μέγιστο πλήθος των στοιχείων: Διαγραφή σε ταξινομημένο πίνακα O(n Υπερεκτίμηση μεγέθους = κατανάλωση μνήμης άσκοπα. Υποτίμηση μεγέθους = ο πίνακας δεν επαρκεί. Τελέλης Δομές Δεδομένων 37 / 48 Τελέλης Δομές Δεδομένων 38 / 48 (1 Aναπαράσταση Υποσυνόλων του {0,..., n 1 (1: Aναπαράσταση Υποσυνόλων του {0,..., n 1 Ζητείται δομή αναπαράστασης υποσυνόλων του {0, 1,..., n 1. Θέλουμε να υποστηρίξουμε τις εξής βασικές πράξεις: στοιχείου a {0,..., n 1 στο τρέχον υποσύνολο. στοιχείου a {0,..., n 1 από το τρέχον υποσύνολο. αν το στοιχείο a {0,..., n 1 ανήκει στο υποσύνολο. Πόσο αποδοτικά μπορούμε να τις υλοποιήσουμε με χρήση πίνακα? Χρησιμοποιούμε πίνακα n δυαδικών στοιχείων (με τιμές true/false του a { 0,..., n 1 : A[a] = χρόνος O(1 του a { 0,..., n 1 : A[a] = χρόνος O(1 του a { 0,..., n 1 : (A[a ] ; χρόνος O(1 Τελέλης Δομές Δεδομένων 39 / 48 Τελέλης Δομές Δεδομένων 40 / 48
(2: Πιο αποδοτικοί πίνακες (2: Πιο αποδοτικοί πίνακες Θέλουμε να υλοποιήσουμε την σε πίνακα: Δίνεται απλώς μια θέση i του πίνακα (και όχι ένα στοιχείο/κλειδί. Διαγράφουμε το στοιχείο στη θέση i θέτοντας απλώς A[i ] =. Μπορούμε να έχουμε ταυτόχρονα και σε χρόνο O(1 δίχως χρήση επιπλέον δομής/μνήμης? (στον οποίο αποθηκεύουμε δεδομένα και, θα πρέπει να κάνουμε πριν από κάθε, για «κενές» θέσεις, με τιμή null. Επομένως, η θα έχει πλέον χρόνο χειρότερης περίπτωσης O(n. Είναι εφικτό εν γένει (π.χ., με χρήση δεύτερου πίνακα? Τελέλης Δομές Δεδομένων 41 / 48 Τελέλης Δομές Δεδομένων 42 / 48 Πρόβλημα 2: Πιο αποδοτικοί πίνακες Πρόβλημα 3: Κατασκευή Ομοιόμορφα Τυχαίας Μετάθεσης Aπάντηση στη δεύτερη ερώτηση: Ναι! Χρησιμοποιούμε βοηθητικό πίνακα ακεραίων, B, και έναν μετρητή last, που αρχικοποιείται στο 0. Υλοποιούμε την στη θέση i ως εξής: A [ i ] = ; B [ l a s t ] = i ; l a s t + + ; Υλοποιούμε την στοιχείου a ως εξής: A [ B [ l a s t 1]] = a ; l a s t ; Και οι δύο πράξεις σε χρόνο χειρότερης περίπτωσης O(1. Δίνεται πίνακας A με n στοιχεία. Ζητείται αλγόριθμος που: Δέχεται σαν είσοδο τον πίνακα A, «ανακατεύει» τη σειρά των στοιχείων στον A, ώστε: η τελική σειρά είναι οποιαδήποτε από τις n! μεταθέσεις των στοιχείων, με πιθανότητα 1 n!. μπορούμε να επιλέξουμε αριθμό στο {0,..., k 1 με πιθανότητα 1/k (τυχαία και ομοιόμορφα. Τελέλης Δομές Δεδομένων 43 / 48 Τελέλης Δομές Δεδομένων 44 / 48
Κατασκευή Ομοιόμορφα Τυχαίας Διάταξης Υλοποίηση σε Java Ένας αλγόριθμος με βέλτιστη πολυπλοκότητα (Donald Knuth Είσοδος: πίνακας A i = 0,..., n 1 επίλεξε μια θέση j {i,..., n 1 αντάλλαξε τα περιεχόμενα των A[i] και A[j]. A Πολυπλοκότητα: O(n. Δίνει τυχαία μετάθεση των περιεχομένων του A, με πιθανότητα 1 n!. j a v a. u t i l. Random ; s h u f f l e ( [ ] A { Random rndgen = Random ( System. c u r r e n t T i m e M i l l i s ( ; ( i = 0 ; i < A. l e n g t h ; i + + { pos = i + rndgen. n e x t I n t ( A. l e n g t h i ; tmp = A [ i ] ; A [ i ] = A [ pos ] ; A [ pos ] = tmp ; Τελέλης Δομές Δεδομένων 45 / 48 Τελέλης Δομές Δεδομένων 46 / 48 Aνάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης Aνάλυση Κατασκευής Ομοιόμορφα Τυχαίας Μετάθεσης Η πιθανότητα του A[1] να έχει στην έξοδο την τιμή που παρατηρούμε, είναι Pr( A[1] = 1 n. Η πιθανότητα του A[2] να έχει στην έξοδο την τιμή που παρατηρούμε, A[1] είναι Pr( A[2] A[1] = 1 n 1. Η πιθανότητα του A[3] να έχει στην έξοδο την τιμή που παρατηρούμε, A[1], A[2], είναι Pr( A[3] A[1] A[2] = 1 n 2................ Η πιθανότητα του A[i] να έχει στην έξοδο την τιμή που παρατηρούμε, A[1], A[2],, A[i 1] είναι: ( Pr A[i] A[1] A[2] A[i 1] = 1 n i + 1 Η πιθανότητα να δούμε στην έξοδο τη διάταξη A που υποθέσαμε είναι: ( Pr( A = Pr A[1] A[2] A[n] ( = Pr A[n] A[1] A[2] A[n 1] ( = Pr A[n] A[1] A[2] A[n 1] ( Pr A[1] A[2] A[n 2] = n ( Pr A[i] A[1] A[2] A[i 1] i=1 = 1 1 2 1 3 1 n = 1 n! ( Pr A[1] A[2] A[n 1] ( Pr A[n 1] A[1] A[2] A[n 2] Τελέλης Δομές Δεδομένων 47 / 48 Τελέλης Δομές Δεδομένων 48 / 48