L05 · D&C III — Closest Pair of Points
Τι θα δούμε
Στο L03 γνωρίσαμε το σχήμα «διαίρει και κυρίευε»· στο L04 το είδαμε να λύνει τρία προβλήματα. Εκεί, και στα τρία, το σπάσιμο ήταν εύκολο — κόβεις τον πίνακα στη μέση και τελείωσες.
Εδώ θα δουλέψουμε ένα μόνο πρόβλημα, γεωμετρικό, και θα δούμε ότι αυτή τη φορά ακόμα και το σπάσιμο χρειάζεται σκέψη. Θα συναντήσουμε δύο ιδέες που αξίζει να κρατήσεις:
- Όταν το αφελές σπάσιμο δεν εγγυάται ισόρροπα κομμάτια, χρειάζεται adaptive διαχωρισμός — διαχωρισμός που εξαρτάται από τα δεδομένα.
- Το τέχνασμα της ζώνης (strip): μετά την αναδρομή, ένας γεωμετρικός περιορισμός κάνει το βήμα συνδυασμού να τρέχει σε γραμμικό χρόνο, παρότι μοιάζει τετραγωνικό.
Το πρόβλημα
Γιατί μας νοιάζει
Είναι ένα θεμελιώδες γεωμετρικό πρόβλημα — εμφανίζεται κρυμμένο σε πολλά πραγματικά συστήματα:
- Γραφικά υπολογιστών — εντοπισμός συγκρούσεων (collisions) ανάμεσα σε αντικείμενα μιας σκηνής.
- Όραση υπολογιστών — ομαδοποίηση (clustering) κοντινών pixel.
- Γεωγραφικά συστήματα (GIS) — εύρεση του πλησιέστερου ορόσημου σε μια θέση.
- Υπολογιστική χημεία — αλληλεπιδράσεις ανάμεσα στα κοντινότερα άτομα ενός μορίου.
- Έλεγχος εναέριας κυκλοφορίας — ποια δύο αεροσκάφη κινδυνεύουν περισσότερο να συγκρουστούν.
Πόσο γρήγορα γίνεται;
Ωμή βία:
Ο ορισμός δίνει αμέσως έναν αλγόριθμο: σύγκρινε όλα τα ζευγάρια σημείων, κράτα το ελάχιστο. Είναι συγκρίσεις. Σωστό — αλλά αργό.
Μία διάσταση: ένα εύκολο
Πριν επιτεθούμε στο επίπεδο, ας ζεσταθούμε με την εύκολη εκδοχή: όλα τα σημεία πάνω σε μία ευθεία, μία μόνο συντεταγμένη. Η λύση είναι σχεδόν τετριμμένη:
- Ταξινόμησε τα σημεία — .
- Σε ένα γραμμικό πέρασμα, βρες το ελάχιστο της διαφοράς γειτονικών σημείων — .
Γιατί αρκούν τα γειτονικά; Φαντάσου ότι το κοντινότερο ζευγάρι ήταν δύο σημεία (, ) που δεν είναι γειτονικά στην ταξινόμηση — άρα ανάμεσά τους κάθεται κάποιο τρίτο σημείο . Τότε όμως το είναι πιο κοντά σε καθένα τους από όσο είναι το ένα στο άλλο, αφού η ευθεία δεν αφήνει «δίαυλο» να γλιτώσουν. Αντίφαση. Άρα το κοντινότερο ζευγάρι πρέπει να είναι γειτονικό — και η σάρωση γειτονικών αρκεί.
Γιατί δεν δουλεύει το ίδιο τρικ σε 2D; Δοκίμασέ το στο διπλό πάνελ παρακάτω. Στο 1D tab η σάρωση γειτονικών βρίσκει σωστά το κοντινότερο ζευγάρι. Στο 2D tab, ταξινομούμε κατά και σαρώνουμε — αλλά το κοντινότερο ζευγάρι αποδεικνύεται όχι γειτονικό στην x-ταξινόμηση, και ο γραμμικός αλγόριθμος το χάνει:
Η μία διάσταση δεν μας σώζει στο επίπεδο — το «τρίτο σημείο ανάμεσα» μπορεί να βρίσκεται πολύ μακριά στον και να μη βοηθάει. Χρειαζόμαστε γνήσια δισδιάστατη ιδέα.
Πρώτη απόπειρα διαίρεσης — και γιατί αποτυγχάνει
Η πρώτη σκέψη: αφού το επίπεδο είναι δισδιάστατο, ας το σπάσουμε σε 4 τεταρτημόρια και ας λύσουμε αναδρομικά σε καθένα.
Μοιάζει «δίκαιο», αλλά κανείς δεν εγγυάται ότι το κάθε τεταρτημόριο θα έχει περίπου σημεία. Δοκίμασε τα τέσσερα σενάρια στο πάνελ παρακάτω: όσο η κατανομή στρέφεται πάνω-δεξιά, οι αναδρομικές κλήσεις γίνονται όλο και πιο ασύμμετρες. Στο τελευταίο σενάριο, όλα τα σημεία πέφτουν στο ίδιο τεταρτημόριο — η αναδρομή δέχεται ξανά σημεία και δεν μικραίνει ποτέ.
Ίδια n = 24 σημεία και στα δύο πάνελ· αλλάζει μόνο το πώς τα χωρίζουμε.
Στο δεξί πάνελ βλέπεις ήδη τη λύση που θα δουλέψουμε: η κάθετη γραμμή στην κατά διάμεσο ισορροπεί πάντα τα δύο μισά , ό,τι κι αν είναι τα σημεία.
Σωστή διαίρεση: κάθετη γραμμή στη διάμεσο
Η λύση: αντί για σταθερά όρια, σχεδιάζουμε μια κάθετη γραμμή ακριβώς στην κατά διάμεσο των σημείων. Η διάμεσος είναι, εξ ορισμού, η τιμή που αφήνει τα μισά σημεία αριστερά και τα μισά δεξιά — οπότε έχουμε εγγυημένα σημεία αριστερά και δεξιά, ό,τι κι αν είναι τα δεδομένα.
Με τη γραμμή στη θέση της, το σχήμα D&C ξετυλίγεται σε τρία βήματα. Πάτα Επόμενο για να το ζήσεις βήμα-βήμα — και το Νέο στιγμιότυπο για να δεις ότι δουλεύει σε οποιαδήποτε διάταξη:
Σε λέξεις:
- Διαίρει. Βρες την κατά διάμεσο (γίνεται σε — θα δούμε πώς στο L10). Η γραμμή χωρίζει τα σημεία σε αριστερό σύνολο και δεξί .
- Κυρίευσε. Κάλεσε αναδρομικά τον εαυτό σου: και . Θέσε .
- Συνδύασε. Εδώ κρύβεται η δυσκολία.
Το είναι η μικρότερη απόσταση μέσα σε κάθε πλευρά. Αλλά το κοντινότερο ζευγάρι ολόκληρου του προβλήματος μπορεί να είναι μικτό: ένα σημείο αριστερά, ένα δεξιά. Αυτά τα μικτά ζευγάρια η αναδρομή δεν τα έχει δει ποτέ — πρέπει να τα ελέγξουμε εμείς, στο combine.
Το τέχνασμα της ζώνης (strip)
Αφελώς, τα μικτά ζευγάρια είναι — αν τα ελέγξουμε όλα, χάσαμε το παιχνίδι. Χρειαζόμαστε μια παρατήρηση που να πετάει τα περισσότερα.
Σύρε το σημείο παρακάτω για να δεις την παρατήρηση γεωμετρικά. Ο δίσκος εμβέλειας ακτίνας γύρω από το δείχνει «πού μπορεί να κρύβεται ένας σύντροφος σε απόσταση ». Όσο το είναι μέσα στη ζώνη, ο δίσκος ξεπερνά τη και ίσως πιάσει αριστερά σημεία. Μόλις το απομακρυνθεί περισσότερο από από τη , ο δίσκος δεν φτάνει ποτέ την — και κανένα αριστερό σημείο δεν μπορεί να είναι σε απόσταση , ό,τι κι αν έχει:
Άρα κόβουμε κάθε σημείο που απέχει περισσότερο από από τη . Αυτό που μένει είναι μια λεπτή ζώνη πλάτους γύρω από τη γραμμή. Μόνο μέσα εκεί μπορεί να κρύβεται κοντινότερο μικτό ζευγάρι.
Ωραία — αλλά στη χείριστη περίπτωση όλα τα σημεία μπορεί να πέσουν μέσα στη ζώνη. Δεν μπορούμε λοιπόν να βασιστούμε σε «λίγα σημεία στη ζώνη». Χρειαζόμαστε κάτι πιο δυνατό.
Γιατί αρκεί σταθερό πλήθος γειτόνων
Ωραία — αλλά στη χείριστη περίπτωση όλα τα σημεία μπορεί να πέσουν μέσα στη ζώνη. Δεν μπορούμε λοιπόν να βασιστούμε σε «λίγα σημεία στη ζώνη». Χρειαζόμαστε κάτι πιο δυνατό.
Η ιδέα: ταξινομούμε τα σημεία της ζώνης κατά , και αποδεικνύουμε ότι κάθε σημείο χρειάζεται να συγκριθεί μόνο με τους επόμενους 11 στην ταξινόμηση — όχι με όλα.
Η απόδειξη είναι ένα όμορφο επιχείρημα αραιότητας: τα σημεία δεν στριμώχνονται μέσα στη ζώνη — αλλιώς η αναδρομή θα είχε ήδη βρει απόσταση μικρότερη από , αντίφαση. Χωρίζουμε τη ζώνη σε κουτιά — δηλαδή 4 στήλες (2 αριστερά της , 2 δεξιά) και όσες σειρές χρειαζόμαστε. Δύο γεωμετρικά γεγονότα κάνουν τη δουλειά:
Συνδυάζοντας τα δύο: σε 3 διαδοχικές σειρές × 4 στήλες = 12 κουτιά × ≤ 1 σημείο = το πολύ 12 σημεία. Άρα αν δύο σημεία απέχουν θέσεις στην ταξινόμηση κατά , είναι υποχρεωτικά σε διαφορετικές «τριάδες σειρών» — οπότε η κατακόρυφη απόστασή τους και μόνο φτάνει το .
Δες τώρα τη σάρωση ζωντανά. Πάτα Επόμενο για να σαρώσεις τα σημεία της ζώνης κατά — και πρόσεξε ότι το «παράθυρο ελέγχου» κάθε σημείου παραμένει πάντα μικρό, όσα σημεία κι αν έχει η ζώνη:
Τα σημεία ταξινομημένα κατά y· σαρώνουμε από πάνω προς τα κάτω.
Ο αλγόριθμος
- Είσοδος:
- n σημεία στο επίπεδο
- Έξοδος:
- η ελάχιστη απόσταση δ (και, αν θέλουμε, το ζευγάρι που την πετυχαίνει)
Με λόγια. Βάση: για σημεία, βρες το κοντινότερο ζευγάρι με ωμή βία — σταθερή δουλειά. Αλλιώς: φέρε την κάθετη γραμμή στην κατά διάμεσο και χώρισε τα σημεία σε , . Λύσε αναδρομικά και τις δύο πλευρές, και πάρε . Μετά κράτησε μόνο τα σημεία της ζώνης πλάτους , ταξινόμησέ τα κατά , και για καθένα έλεγξε την απόστασή του από τους επόμενους 11 — ενημερώνοντας το αν βρεις κάτι μικρότερο.
Πολυπλοκότητα
Πρώτη εκδοχή:
Ας μετρήσουμε τη δουλειά μιας αναδρομικής κλήσης σε σημεία:
- Εύρεση διαμέσου: .
- Δύο αναδρομικές κλήσεις: .
- Φιλτράρισμα της ζώνης και ταξινόμηση κατά : .
- Σάρωση της ζώνης με 11 γείτονες ανά σημείο: .
Άρα:
Πρόσεξε: το κόστος συνδυασμού είναι , που δεν είναι της μορφής — οπότε η απλή μορφή του Master Theorem από το L03 δεν εφαρμόζεται απευθείας. Με δέντρο αναδρομής (ή τη γενική μορφή) προκύπτει:
Καλύτερο από το — αλλά όχι ακόμα ο στόχος μας.
Βελτίωση σε
Από πού ήρθε το ενοχλητικό επιπλέον ; Από τη φράση «ταξινόμηση κατά » — που την κάναμε μέσα σε κάθε αναδρομική κλήση. Αλλά τα σημεία δεν αλλάζουν· γιατί να τα ξανα-ταξινομούμε διαρκώς;
Στο διπλό πάνελ παρακάτω βλέπεις τι κερδίζουμε επίπεδο προς επίπεδο. Με τη «ταξινόμηση μέσα στην κλήση», κάθε επίπεδο κάνει δουλειά — ένα τρίγωνο που βαραίνει στα πάνω επίπεδα. Με την προταξινόμηση, κάθε επίπεδο κάνει σταθερά — ένα επίπεδο ορθογώνιο. Άλλαξε το και πρόσεξε ότι ο λόγος των δύο συνολικών μεγαλώνει σαν :
Δουλειά ανά επίπεδο της αναδρομής, για n = 16 σημεία και βάθος 4.
Με αυτή την προταξινόμηση, κάθε κλήση κάνει μόνο γραμμική δουλειά πέρα από τις αναδρομές, και η αναδρομή γίνεται:
Master Theorem με : αφού , περίπτωση 2 → . Προσθέτοντας το της μίας αρχικής ταξινόμησης, η συνολική πολυπλοκότητα παραμένει:
Άσκηση: η κορυφή του βουνού
Το PDF κλείνει με μια κλασική άσκηση D&C — δοκίμασέ τη μόνος σου πριν δεις τη λύση.
Πρόβλημα. Δίνεται πίνακας μεγέθους με την εξής ιδιότητα: υπάρχει θέση τέτοια ώστε Δηλαδή ο πίνακας ανεβαίνει μέχρι μια «κορυφή» και μετά κατεβαίνει (είναι μονότροπος). Δώσε αλγόριθμο που εντοπίζει τη θέση της κορυφής σε χρόνο .
Δοκίμασέ τον πρώτα μόνος. Στο διάγραμμα παρακάτω πάτα «Επόμενο» και πρόσεξε ότι κάθε σύγκριση πετάει ολόκληρο το μισό του πίνακα. Σε βήματα ο αλγόριθμος βρίσκει την κορυφή, όπου κι αν είναι:
Κλείδωσε τη γνώση
Πρώτα η σκελετική δομή του Closest-Pair — βάλε τα βήματα στη σειρά:
Τώρα το τέχνασμα της ζώνης σε λέξεις — συμπλήρωσε τα κενά:
Μοτίβο σκέψης
Τι μάθαμε
Τι κρατάμε από αυτή τη διάλεξη
- Closest Pair — κλασικό γεωμετρικό πρόβλημα. Ωμή βία · με D&C .
- Σωστή διαίρεση: κάθετη γραμμή στην κατά διάμεσο, όχι στατικά τεταρτημόρια — μόνο έτσι εγγυάται το ισόρροπο σπάσιμο .
- Το τέχνασμα της ζώνης: μετά την αναδρομή, το κοντινότερο μικτό ζευγάρι (αν υπάρχει) κρύβεται σε μια ζώνη πλάτους γύρω από τη γραμμή.
- Γιατί σταθεροί γείτονες: τα σημεία της ζώνης δεν στριμώχνονται (το επιχείρημα των κουτιών ) — άρα κάθε σημείο ελέγχει σταθερό πλήθος γειτόνων στην κατά ταξινόμηση. Combine σε .
- αντί για : προταξινόμηση μία φορά στην αρχή, ώστε καμία αναδρομή να μην ξανα-ταξινομεί.
- Master Theorem: · αλλά .