Class Hub
Divide & Conquer·Διάλεξη 5·~46 min

L05 · D&C III — Closest Pair of Points

Τι θα δούμε

Στο L03 γνωρίσαμε το σχήμα «διαίρει και κυρίευε»· στο L04 το είδαμε να λύνει τρία προβλήματα. Εκεί, και στα τρία, το σπάσιμο ήταν εύκολο — κόβεις τον πίνακα στη μέση και τελείωσες.

Εδώ θα δουλέψουμε ένα μόνο πρόβλημα, γεωμετρικό, και θα δούμε ότι αυτή τη φορά ακόμα και το σπάσιμο χρειάζεται σκέψη. Θα συναντήσουμε δύο ιδέες που αξίζει να κρατήσεις:

  1. Όταν το αφελές σπάσιμο δεν εγγυάται ισόρροπα κομμάτια, χρειάζεται adaptive διαχωρισμός — διαχωρισμός που εξαρτάται από τα δεδομένα.
  2. Το τέχνασμα της ζώνης (strip): μετά την αναδρομή, ένας γεωμετρικός περιορισμός κάνει το βήμα συνδυασμού να τρέχει σε γραμμικό χρόνο, παρότι μοιάζει τετραγωνικό.

Το πρόβλημα

Γιατί μας νοιάζει

Είναι ένα θεμελιώδες γεωμετρικό πρόβλημα — εμφανίζεται κρυμμένο σε πολλά πραγματικά συστήματα:

  • Γραφικά υπολογιστών — εντοπισμός συγκρούσεων (collisions) ανάμεσα σε αντικείμενα μιας σκηνής.
  • Όραση υπολογιστών — ομαδοποίηση (clustering) κοντινών pixel.
  • Γεωγραφικά συστήματα (GIS) — εύρεση του πλησιέστερου ορόσημου σε μια θέση.
  • Υπολογιστική χημεία — αλληλεπιδράσεις ανάμεσα στα κοντινότερα άτομα ενός μορίου.
  • Έλεγχος εναέριας κυκλοφορίας — ποια δύο αεροσκάφη κινδυνεύουν περισσότερο να συγκρουστούν.

Πόσο γρήγορα γίνεται;

Ωμή βία:

Ο ορισμός δίνει αμέσως έναν αλγόριθμο: σύγκρινε όλα τα ζευγάρια σημείων, κράτα το ελάχιστο. Είναι συγκρίσεις. Σωστό — αλλά αργό.

Μία διάσταση: ένα εύκολο

Πριν επιτεθούμε στο επίπεδο, ας ζεσταθούμε με την εύκολη εκδοχή: όλα τα σημεία πάνω σε μία ευθεία, μία μόνο συντεταγμένη. Η λύση είναι σχεδόν τετριμμένη:

  1. Ταξινόμησε τα σημεία — .
  2. Σε ένα γραμμικό πέρασμα, βρες το ελάχιστο της διαφοράς γειτονικών σημείων — .

Γιατί αρκούν τα γειτονικά; Φαντάσου ότι το κοντινότερο ζευγάρι ήταν δύο σημεία (, ) που δεν είναι γειτονικά στην ταξινόμηση — άρα ανάμεσά τους κάθεται κάποιο τρίτο σημείο . Τότε όμως το είναι πιο κοντά σε καθένα τους από όσο είναι το ένα στο άλλο, αφού η ευθεία δεν αφήνει «δίαυλο» να γλιτώσουν. Αντίφαση. Άρα το κοντινότερο ζευγάρι πρέπει να είναι γειτονικό — και η σάρωση γειτονικών αρκεί.

Γιατί δεν δουλεύει το ίδιο τρικ σε 2D; Δοκίμασέ το στο διπλό πάνελ παρακάτω. Στο 1D tab η σάρωση γειτονικών βρίσκει σωστά το κοντινότερο ζευγάρι. Στο 2D tab, ταξινομούμε κατά και σαρώνουμε — αλλά το κοντινότερο ζευγάρι αποδεικνύεται όχι γειτονικό στην x-ταξινόμηση, και ο γραμμικός αλγόριθμος το χάνει:

Πλησιέστερο ζεύγος — εύκολο σε 1D, σπάει σε 2D
p13p27p313p415p522p628p734p841
Στη μία διάσταση η δουλειά είναι εύκολη: ταξινόμησε τα σημεία και σάρωσε γειτονικά ζευγάρια — και τίποτα άλλο. Πάτα «Επόμενο» για να ξεκινήσει η σάρωση.
Σύγκριση 0 / 7

Η μία διάσταση δεν μας σώζει στο επίπεδο — το «τρίτο σημείο ανάμεσα» μπορεί να βρίσκεται πολύ μακριά στον και να μη βοηθάει. Χρειαζόμαστε γνήσια δισδιάστατη ιδέα.

Πρώτη απόπειρα διαίρεσης — και γιατί αποτυγχάνει

Η πρώτη σκέψη: αφού το επίπεδο είναι δισδιάστατο, ας το σπάσουμε σε 4 τεταρτημόρια και ας λύσουμε αναδρομικά σε καθένα.

Μοιάζει «δίκαιο», αλλά κανείς δεν εγγυάται ότι το κάθε τεταρτημόριο θα έχει περίπου σημεία. Δοκίμασε τα τέσσερα σενάρια στο πάνελ παρακάτω: όσο η κατανομή στρέφεται πάνω-δεξιά, οι αναδρομικές κλήσεις γίνονται όλο και πιο ασύμμετρες. Στο τελευταίο σενάριο, όλα τα σημεία πέφτουν στο ίδιο τεταρτημόριο — η αναδρομή δέχεται ξανά σημεία και δεν μικραίνει ποτέ.

Πώς να σπάσεις το επίπεδο — δύο τρόποι, μία διαφορά

Ίδια n = 24 σημεία και στα δύο πάνελ· αλλάζει μόνο το πώς τα χωρίζουμε.

Στατικά τεταρτημόριαmax = 6
6666
Αναδρομικές κλήσεις: 6, 6, 6, 6
Κάθετη γραμμή στη x-διάμεσοn/2 + n/2
1212L
Αναδρομικές κλήσεις: 12 + 12
Ιδανική περίπτωση: το κάθε τεταρτημόριο έχει περίπου n/4. Εδώ η αναδρομή θα τερμάτιζε — αλλά δεν μας το εγγυάται κανείς.

Στο δεξί πάνελ βλέπεις ήδη τη λύση που θα δουλέψουμε: η κάθετη γραμμή στην κατά διάμεσο ισορροπεί πάντα τα δύο μισά , ό,τι κι αν είναι τα σημεία.

Σωστή διαίρεση: κάθετη γραμμή στη διάμεσο

Η λύση: αντί για σταθερά όρια, σχεδιάζουμε μια κάθετη γραμμή ακριβώς στην κατά διάμεσο των σημείων. Η διάμεσος είναι, εξ ορισμού, η τιμή που αφήνει τα μισά σημεία αριστερά και τα μισά δεξιά — οπότε έχουμε εγγυημένα σημεία αριστερά και δεξιά, ό,τι κι αν είναι τα δεδομένα.

Με τη γραμμή στη θέση της, το σχήμα D&C ξετυλίγεται σε τρία βήματα. Πάτα Επόμενο για να το ζήσεις βήμα-βήμα — και το Νέο στιγμιότυπο για να δεις ότι δουλεύει σε οποιαδήποτε διάταξη:

Η D&C λύση ξεδιπλώνεται — γραμμή στη διάμεσο, αναδρομή, ζώνη 2δ
Σημεία
ABCDEFGHIJKL
n = 12 σημεία στο επίπεδο. Πάτα «Επόμενο» — η D&C λύση θα ξεδιπλωθεί σε τρία βήματα: διαίρει, κυρίευσε, συνδύασε.
Βήμα 0 / 3

Σε λέξεις:

  • Διαίρει. Βρες την κατά διάμεσο (γίνεται σε — θα δούμε πώς στο L10). Η γραμμή χωρίζει τα σημεία σε αριστερό σύνολο και δεξί .
  • Κυρίευσε. Κάλεσε αναδρομικά τον εαυτό σου: και . Θέσε .
  • Συνδύασε. Εδώ κρύβεται η δυσκολία.

Το είναι η μικρότερη απόσταση μέσα σε κάθε πλευρά. Αλλά το κοντινότερο ζευγάρι ολόκληρου του προβλήματος μπορεί να είναι μικτό: ένα σημείο αριστερά, ένα δεξιά. Αυτά τα μικτά ζευγάρια η αναδρομή δεν τα έχει δει ποτέ — πρέπει να τα ελέγξουμε εμείς, στο combine.

Το τέχνασμα της ζώνης (strip)

Αφελώς, τα μικτά ζευγάρια είναι — αν τα ελέγξουμε όλα, χάσαμε το παιχνίδι. Χρειαζόμαστε μια παρατήρηση που να πετάει τα περισσότερα.

Σύρε το σημείο παρακάτω για να δεις την παρατήρηση γεωμετρικά. Ο δίσκος εμβέλειας ακτίνας γύρω από το δείχνει «πού μπορεί να κρύβεται ένας σύντροφος σε απόσταση ». Όσο το είναι μέσα στη ζώνη, ο δίσκος ξεπερνά τη και ίσως πιάσει αριστερά σημεία. Μόλις το απομακρυνθεί περισσότερο από από τη , ο δίσκος δεν φτάνει ποτέ την — και κανένα αριστερό σημείο δεν μπορεί να είναι σε απόσταση , ό,τι κι αν έχει:

Γιατί η ζώνη είναι ακριβώς 2δ — η εμβέλεια του p
στη ζώνη — εξετάζεται
Lδαπόσταση από L = 0.45·δq₁q₂q₃q₄q₅p
Σύρε το p:0.45·δ
Αριστερά σημεία μέσα στη εμβέλεια δ του p: 1 / 5 αριστερά ζώνη 2δ
Το p απέχει 0.45·δ από τη L — βρίσκεται μέσα στη ζώνη. Ο δίσκος ξεπερνά τη L και 1 αριστερά σημεία πέφτουν μέσα του — αυτά είναι υποψήφια για κοντινό μικτό ζευγάρι.

Άρα κόβουμε κάθε σημείο που απέχει περισσότερο από από τη . Αυτό που μένει είναι μια λεπτή ζώνη πλάτους γύρω από τη γραμμή. Μόνο μέσα εκεί μπορεί να κρύβεται κοντινότερο μικτό ζευγάρι.

Ωραία — αλλά στη χείριστη περίπτωση όλα τα σημεία μπορεί να πέσουν μέσα στη ζώνη. Δεν μπορούμε λοιπόν να βασιστούμε σε «λίγα σημεία στη ζώνη». Χρειαζόμαστε κάτι πιο δυνατό.

Γιατί αρκεί σταθερό πλήθος γειτόνων

Ωραία — αλλά στη χείριστη περίπτωση όλα τα σημεία μπορεί να πέσουν μέσα στη ζώνη. Δεν μπορούμε λοιπόν να βασιστούμε σε «λίγα σημεία στη ζώνη». Χρειαζόμαστε κάτι πιο δυνατό.

Η ιδέα: ταξινομούμε τα σημεία της ζώνης κατά , και αποδεικνύουμε ότι κάθε σημείο χρειάζεται να συγκριθεί μόνο με τους επόμενους 11 στην ταξινόμηση — όχι με όλα.

Η απόδειξη είναι ένα όμορφο επιχείρημα αραιότητας: τα σημεία δεν στριμώχνονται μέσα στη ζώνη — αλλιώς η αναδρομή θα είχε ήδη βρει απόσταση μικρότερη από , αντίφαση. Χωρίζουμε τη ζώνη σε κουτιά — δηλαδή 4 στήλες (2 αριστερά της , 2 δεξιά) και όσες σειρές χρειαζόμαστε. Δύο γεωμετρικά γεγονότα κάνουν τη δουλειά:

Το επιχείρημα των κουτιών — δύο βήματα, ένα συμπέρασμα
δ/2δ/2
Ένα κουτί δ/2 × δ/2. Πάτα «Βάλε 2 σημεία» — η διαγώνιος θα μας πει γιατί δεν χωράνε.
Συνδυάζοντας τα δύο βήματα: σε 3 διαδοχικές σειρές × 4 στήλες κουτιών χωράνε 12 κουτιά × 1 σημείο = το πολύ 12 σημεία. Άρα αν δύο σημεία απέχουν ≥ 12 θέσεις στην ταξινόμηση κατά y, βρίσκονται σίγουρα σε διαφορετικές «τριάδες σειρών» — άρα απέχουν ≥ δ.

Συνδυάζοντας τα δύο: σε 3 διαδοχικές σειρές × 4 στήλες = 12 κουτιά × ≤ 1 σημείο = το πολύ 12 σημεία. Άρα αν δύο σημεία απέχουν θέσεις στην ταξινόμηση κατά , είναι υποχρεωτικά σε διαφορετικές «τριάδες σειρών» — οπότε η κατακόρυφη απόστασή τους και μόνο φτάνει το .

Δες τώρα τη σάρωση ζωντανά. Πάτα Επόμενο για να σαρώσεις τα σημεία της ζώνης κατά — και πρόσεξε ότι το «παράθυρο ελέγχου» κάθε σημείου παραμένει πάντα μικρό, όσα σημεία κι αν έχει η ζώνη:

Σάρωση της ζώνης — γιατί κάθε σημείο ελέγχει σταθερό πλήθος γειτόνων
Η ζώνη

Τα σημεία ταξινομημένα κατά y· σαρώνουμε από πάνω προς τα κάτω.

ζώνη πλάτους 2δγραμμή Lδδ/2AWBXCYDZ
αριστερά της L δεξιά της L μικτός υποψήφιος κοντινότερο ζευγάρι
Έλεγχοι γι' αυτό το σημείοΕγγύηση: ≤ 11, ανεξάρτητα από το n
Η ζώνη πλάτους 2δ γύρω από τη γραμμή L, χωρισμένη σε κουτιά δ/2 × δ/2. Κάθε κουτί χωράει το πολύ 1 σημείο — δύο σημεία στο ίδιο κουτί θα απείχαν < δ, κάτι που η αναδρομή θα είχε ήδη βρει. Πάτα «Επόμενο» για να σαρώσεις τα σημεία κατά y.
Βήμα 0 / 8

Ο αλγόριθμος

ΑλγόριθμοςClosest-Pair — πλησιέστερο ζεύγος σημείων
O(n log n)
Σπάσε με κάθετη γραμμή στη διάμεσο· λύσε αναδρομικά τις δύο πλευρές· χτένισε τη ζώνη 2δ ελέγχοντας μόνο σταθερό πλήθος γειτόνων ανά σημείο.
Είσοδος:
n σημεία στο επίπεδο
Έξοδος:
η ελάχιστη απόσταση δ (και, αν θέλουμε, το ζευγάρι που την πετυχαίνει)

Με λόγια. Βάση: για σημεία, βρες το κοντινότερο ζευγάρι με ωμή βία — σταθερή δουλειά. Αλλιώς: φέρε την κάθετη γραμμή στην κατά διάμεσο και χώρισε τα σημεία σε , . Λύσε αναδρομικά και τις δύο πλευρές, και πάρε . Μετά κράτησε μόνο τα σημεία της ζώνης πλάτους , ταξινόμησέ τα κατά , και για καθένα έλεγξε την απόστασή του από τους επόμενους 11 — ενημερώνοντας το αν βρεις κάτι μικρότερο.

Πολυπλοκότητα

Πρώτη εκδοχή:

Ας μετρήσουμε τη δουλειά μιας αναδρομικής κλήσης σε σημεία:

  • Εύρεση διαμέσου: .
  • Δύο αναδρομικές κλήσεις: .
  • Φιλτράρισμα της ζώνης και ταξινόμηση κατά : .
  • Σάρωση της ζώνης με 11 γείτονες ανά σημείο: .

Άρα:

Πρόσεξε: το κόστος συνδυασμού είναι , που δεν είναι της μορφής — οπότε η απλή μορφή του Master Theorem από το L03 δεν εφαρμόζεται απευθείας. Με δέντρο αναδρομής (ή τη γενική μορφή) προκύπτει:

Καλύτερο από το — αλλά όχι ακόμα ο στόχος μας.

Βελτίωση σε

Από πού ήρθε το ενοχλητικό επιπλέον ; Από τη φράση «ταξινόμηση κατά » — που την κάναμε μέσα σε κάθε αναδρομική κλήση. Αλλά τα σημεία δεν αλλάζουν· γιατί να τα ξανα-ταξινομούμε διαρκώς;

Στο διπλό πάνελ παρακάτω βλέπεις τι κερδίζουμε επίπεδο προς επίπεδο. Με τη «ταξινόμηση μέσα στην κλήση», κάθε επίπεδο κάνει δουλειά — ένα τρίγωνο που βαραίνει στα πάνω επίπεδα. Με την προταξινόμηση, κάθε επίπεδο κάνει σταθερά — ένα επίπεδο ορθογώνιο. Άλλαξε το και πρόσεξε ότι ο λόγος των δύο συνολικών μεγαλώνει σαν :

Από O(n log² n) σε O(n log n) — προταξινόμηση μία φορά

Δουλειά ανά επίπεδο της αναδρομής, για n = 16 σημεία και βάθος 4.

n =
Σύγκρ. ταξινόμηση μέσα σε κάθε κλήσηO(n log² n)
T(n) = 2T(n/2) + O(n log n)
επ. 0
64
επ. 1
48
επ. 2
32
επ. 3
16
επ. 4
0
Σύνολο160
Προταξινόμηση μία φορά στην αρχήO(n log n)
T(n) = 2T(n/2) + O(n) + αρχικό O(n log n)
setup
64
επ. 0
16
επ. 1
16
επ. 2
16
επ. 3
16
επ. 4
16
Σύνολο144
Λόγος συνολικού κόστους: 160 / 144 = 1.11× — και ο λόγος μεγαλώνει σαν log n. Για n = 10⁶ ο πρώτος αλγόριθμος είναι ήδη ~10× πιο αργός από τον δεύτερο.

Με αυτή την προταξινόμηση, κάθε κλήση κάνει μόνο γραμμική δουλειά πέρα από τις αναδρομές, και η αναδρομή γίνεται:

Master Theorem με : αφού , περίπτωση 2. Προσθέτοντας το της μίας αρχικής ταξινόμησης, η συνολική πολυπλοκότητα παραμένει:

Κάρτα μνήμηςClosest Pair of Points
Λέξεις-κλειδιά
κάθετη γραμμή στη x-διάμεσοδ = min(δ₁, δ₂)ζώνη πλάτους 2δταξινόμηση κατά yσταθεροί γείτονες (≤ 11)
Τα βήματα στο μυαλό σου
1Βάση: n ≤ 3 σημεία → ωμή βία.
2Διαίρει: κάθετη γραμμή L στην κατά x διάμεσο → δύο μισά των n/2.
3Κυρίευσε: αναδρομικά δ₁, δ₂· θέσε δ = min(δ₁, δ₂).
4Συνδύασε: κράτα τη ζώνη 2δ, ταξινόμησε κατά y, και για κάθε σημείο έλεγξε μόνο τους επόμενους ≤ 11.
Πολυπλοκότητα
O(n log n)
Κλασική παγίδα
Δύο παγίδες. (1) Στατικά τεταρτημόρια δεν εγγυώνται ισόρροπο σπάσιμο — χρειάζεται διάμεσος. (2) Αν ξανα-ταξινομείς κατά y μέσα σε κάθε αναδρομή, μένεις στο O(n log² n)· η προταξινόμηση μία φορά στην αρχή είναι που δίνει O(n log n).

Άσκηση: η κορυφή του βουνού

Το PDF κλείνει με μια κλασική άσκηση D&C — δοκίμασέ τη μόνος σου πριν δεις τη λύση.

Πρόβλημα. Δίνεται πίνακας μεγέθους με την εξής ιδιότητα: υπάρχει θέση τέτοια ώστε Δηλαδή ο πίνακας ανεβαίνει μέχρι μια «κορυφή» και μετά κατεβαίνει (είναι μονότροπος). Δώσε αλγόριθμο που εντοπίζει τη θέση της κορυφής σε χρόνο .

Δοκίμασέ τον πρώτα μόνος. Στο διάγραμμα παρακάτω πάτα «Επόμενο» και πρόσεξε ότι κάθε σύγκριση πετάει ολόκληρο το μισό του πίνακα. Σε βήματα ο αλγόριθμος βρίσκει την κορυφή, όπου κι αν είναι:

Εύρεση κορυφής σε μονότροπο πίνακα — δυαδική αναζήτηση στην κλίση
Ανηφόρα →
3061112163214255286307328309271022111512813314lohimm+1
Βήμα 1: m = 7, A[7] = 30, A[8] = 32. 30 < 32 → ανηφόρα. Η κορυφή είναι δεξιά: πέτα όλο το αριστερό μισό, lo ← 8.
Συγκρίσεις0 / 4⌈log₂ 15⌉ = 4

Κλείδωσε τη γνώση

Πρώτα η σκελετική δομή του Closest-Pair — βάλε τα βήματα στη σειρά:

Βάλε τα βήματα στη σειρά
Τα βήματα του αλγορίθμου closest-pair, από την πρώτη ενέργεια στην τελευταία.
Σύρε τις γραμμές για αναδιάταξη — ή χρησιμοποίησε τα βελάκια.
1.Ταξινόμησε τα σημεία της ζώνης κατά τη συντεταγμένη y.
2.Βάση: αν n ≤ 3, βρες το κοντινότερο ζευγάρι με ωμή βία.
3.Κράτα μόνο τα σημεία της ζώνης πλάτους 2δ γύρω από τη L.
4.Για κάθε σημείο της ζώνης, έλεγξε τους επόμενους ≤ 11 κατά y και ενημέρωσε το δ.
5.Κυρίευσε: βρες αναδρομικά δ₁ στο P_L και δ₂ στο P_R· θέσε δ = min(δ₁, δ₂).
6.Διαίρει: φέρε κάθετη γραμμή L στην κατά x διάμεσο — μισά P_L, P_R.

Τώρα το τέχνασμα της ζώνης σε λέξεις — συμπλήρωσε τα κενά:

Συμπλήρωσε τα κενά
Η λογική του combine, από τη διάμεσο ως τη σάρωση.
Για να σπάσουμε το πρόβλημα ισόρροπα, φέρνουμε κάθετη γραμμή στην κατά x — έτσι κάθε πλευρά έχει εγγυημένα n/2 σημεία. Αν υπάρχει μικτό ζευγάρι κοντινότερο από δ, και τα δύο σημεία βρίσκονται μέσα σε μια στενή πλάτους 2δ γύρω από τη γραμμή. Χωρίζοντάς τη σε κουτιά δ/2 × δ/2, κάθε κουτί έχει το πολύ σημείο — οπότε κάθε σημείο ελέγχει μόνο σταθερό πλήθος γειτόνων στην ταξινόμηση κατά .

Μοτίβο σκέψης

Τι μάθαμε

Τι κρατάμε από αυτή τη διάλεξη

  1. Closest Pair — κλασικό γεωμετρικό πρόβλημα. Ωμή βία · με D&C .
  2. Σωστή διαίρεση: κάθετη γραμμή στην κατά διάμεσο, όχι στατικά τεταρτημόρια — μόνο έτσι εγγυάται το ισόρροπο σπάσιμο .
  3. Το τέχνασμα της ζώνης: μετά την αναδρομή, το κοντινότερο μικτό ζευγάρι (αν υπάρχει) κρύβεται σε μια ζώνη πλάτους γύρω από τη γραμμή.
  4. Γιατί σταθεροί γείτονες: τα σημεία της ζώνης δεν στριμώχνονται (το επιχείρημα των κουτιών ) — άρα κάθε σημείο ελέγχει σταθερό πλήθος γειτόνων στην κατά ταξινόμηση. Combine σε .
  5. αντί για : προταξινόμηση μία φορά στην αρχή, ώστε καμία αναδρομή να μην ξανα-ταξινομεί.
  6. Master Theorem: · αλλά .
Επόμενο
L06 · Γραφήματα I — αναπαράσταση, BFS
Φόρτωση σχολίων…
L05 · D&C III — Closest Pair of Points · Algorithms Class Hub