Ένας αλγόριθμος για να λύσει ένα απλό (;) το πρόβλημα σειρά

ψήφοι
7

Για αυτή την ταχύτητα το πρόβλημα είναι πολύ κρίσιμη. Έχω σχεδιάσει ένα ωραίο εικόνα για να εξηγήσει το πρόβλημα καλύτερα. Ο αλγόριθμος θα πρέπει να υπολογίσει αν τα άκρα του ορθογωνίου συνεχίσει μέσα στα όρια του καμβά, θα την άκρη τέμνει ένα άλλο ορθογώνιο;

Ξέρουμε:

  1. Το μέγεθος του καμβά
  2. Το μέγεθος της κάθε ορθογωνίου
  3. Η θέση του κάθε ορθογωνίου

Όσο πιο γρήγορα η λύση είναι η καλύτερη! Είμαι πολύ κολλήσει σε αυτό και πραγματικά δεν ξέρω από πού να αρχίσω.

alt κείμενο http://www.freeimagehosting.net/uploads/8a457f2925.gif

Στην υγειά σας

Δημοσιεύθηκε 08/07/2010 στις 13:23
πηγή χρήστη
Σε άλλες γλώσσες...                            


6 απαντήσεις

ψήφοι
2

Οι γραμμές που δεν είναι παράλληλες μεταξύ τους πρόκειται να τέμνονται σε κάποιο σημείο. Υπολογίστε τις πλαγιές της κάθε γραμμής και στη συνέχεια να καθορίσει ποιες γραμμές δεν θα διασταυρώνονται με.

Ξεκινήστε με αυτό, και στη συνέχεια, ας δούμε πώς να το βελτιστοποιήσει. Δεν είμαι σίγουρος πώς εκπροσωπείται δεδομένα σας και δεν μπορώ να δω την εικόνα σας.

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

EDIT: Περιμένετε .. πώς μπορούν δύο ορθογώνια των οποίων οι άκρες να πάει στο άπειρο δεν τέμνονται; Ορθογώνια είναι βασικά δύο σειρές που είναι κάθετες μεταξύ τους. Δεν θα πρέπει να σημαίνει ότι διασταυρώνεται πάντα με μια άλλη, αν οι εν λόγω γραμμές επεκταθεί στο άπειρο;

Απαντήθηκε 08/07/2010 στις 13:35
πηγή χρήστη

ψήφοι
6

Απλά δημιουργήστε το σύνολο των διαστημάτων για κάθε ένα από τα Χ και Υ άξονα. Στη συνέχεια, για κάθε νέο ορθογώνιο, δείτε αν υπάρχουν τέμνονται διαστήματα στο Χ ή τον άξονα Υ. Δείτε εδώ για ένα τρόπο εφαρμογής των συνόλων διάστημα.

Στην πρώτη σας παράδειγμα, το διάστημα που στον οριζόντιο άξονα θα είναι { [0-8], [0-8], [9-10] }, και στον κάθετο:{ [0-3], [4-6], [0-4] }

Αυτό είναι μόνο ένα σκίτσο, που αντλείται πολλές λεπτομέρειες εδώ (π.χ. συνήθως κάποιος θα ζητήσει ένα διάστημα set / δέντρο «το οποίο διαστήματα συμπίπτουν αυτό το ένα», αντί για «διασταυρώνονται αυτό το ένα», αλλά τίποτα δεν είναι εφικτό).

Επεξεργασία

Παρακαλώ δείτε αυτό το σχετικό διάλεξη ΜΙΤ (είναι λίγο μεγάλο, αλλά απολύτως αξίζει). Ακόμα κι αν βρείτε απλούστερες λύσεις (από την εφαρμογή μιας επαυξημένης κόκκινο-μαύρο δέντρο), είναι καλό να γνωρίζουμε τις ιδέες πίσω από αυτά τα πράγματα.

Απαντήθηκε 08/07/2010 στις 13:36
πηγή χρήστη

ψήφοι
1

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

η ιδέα είναι ότι αν όλα είναι εντάξει, τότε μία ταξινομημένη συλλογή των ακμών ορθογωνίου κατά μήκος ενός άξονα πρέπει να είναι μια αλληλουχία μη-επικαλυπτόμενα διαστήματα.

  1. τον αριθμό όλων ορθογώνια σας, την ανάθεση σε αυτές ατομικές ταυτότητες
  2. δημιουργήσετε ένα κενό δυαδικό συλλογή δέντρο (BTC). Η συλλογή αυτή θα πρέπει να έχει μια μέθοδο για να εισάγετε έναν ακέραιο κόμβο με πληροφορίες BTC :: ένθετο (κλειδί, τιμή)
  3. για όλα τα ορθογώνια, κάντε:

foreach rect in rects do
    btc.insert(rect.top, rect.id)
    btc.insert(rect.bottom, rect.id)
  1. τώρα επαναλάβει μέσω του BTC (αυτό θα σας δώσει μια ταξινομημένη σειρά)

btc_item = btc.first()
do
    id = btc_item.id
    btc_item = btc.next()
    if(id != btc_item.id)
    then report_invalid_placement(id, btc_item.id)
    btc_item = btc.next()
while btc_item is valid

5,7,8 - επαναλάβετε τα βήματα 2,3,4 για rect.left και rect.right συντεταγμένες

Απαντήθηκε 08/07/2010 στις 13:49
πηγή χρήστη

ψήφοι
1

Μου αρέσει αυτό το θέμα. Εδώ είναι προσπάθεια μου να πάρει πάνω του:

Αν είναι δυνατόν: Δημιουργήστε ένα πολύγωνο από κάθε ορθογώνιο. Αντιμετωπίστε κάθε άκρη ως γραμμή μέγιστου μήκους που πρέπει να ψαλιδίζεται. Χρησιμοποιήστε έναν αλγόριθμο κούρεμα για να ελέγξετε τον καιρό ή όχι μια γραμμή διασταυρώνεται με μια άλλη. Για παράδειγμα αυτό: Γραμμή αποκοπής

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

Απαντήθηκε 08/07/2010 στις 14:01
πηγή χρήστη

ψήφοι
1

Εδώ είναι μια ιδέα. Αντί της δημιουργίας κάθε ορθογώνιο με (x, y, width, height), υπόσταση τους με (x1, y1, x2, y2), ή τουλάχιστον την έχουν ερμηνεύσει αυτές τις τιμές που δίνονται το πλάτος και το ύψος.

Με αυτόν τον τρόπο, μπορείτε να ελέγξετε ποια ορθογώνια έχουν παρόμοια xή yαξία και βεβαιωθείτε ότι το αντίστοιχο ορθογώνιο έχει την ίδια δευτερεύουσα αξία.


Παράδειγμα:

Τα ορθογώνια που έχουν δώσει έχουν τις ακόλουθες τιμές:

  • Square 1: [0, 0, 8, 3]
  • Square 3: [0, 4, 8, 6]
  • Square 4: [9, 0, 10, 4]

Κατ 'αρχάς, συγκρίνουμε Square 1με Square 3(χωρίς σύγκρουση):

  • Συγκρίνετε τις τιμές x
    • [0, 8] στο [0, 8] Αυτά είναι ακριβώς το ίδιο, οπότε δεν υπάρχει crossover.
  • Συγκρίνετε τις τιμές y
    • [0, 4] έως [3, 6] Κανένα από αυτά τα νούμερα είναι παρόμοια, έτσι δεν είναι ένας παράγοντας

Στη συνέχεια, συγκρίνουμε Square 3με Square 4(σύγκρουση):

  • Συγκρίνετε τις τιμές x
    • [0, 8] έως [9, 10] Κανένα από αυτά τα νούμερα είναι παρόμοια, έτσι δεν είναι ένας παράγοντας
  • Συγκρίνετε τις τιμές y
    • [4, 6] έως [0, 4] Οι ορθογώνια έχουν τον αριθμό 4 στο κοινό, αλλά το 0! = 6, ως εκ τούτου, υπάρχει μια σύγκρουση

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

  • Συγκρίνετε τις τιμές x
    • [0, 8] έως [9, 10] Κανένα από αυτά τα νούμερα είναι παρόμοια, έτσι δεν είναι ένας παράγοντας
  • Συγκρίνετε τις τιμές y
    • [0, 3] στο [0, 4] Οι ορθογώνια έχουν τον αριθμό 0 κοινά, αλλά 3! = 4, ως εκ τούτου, υπάρχει μια σύγκρουση

Επιτρέψτε μου να μάθω αν χρειάζεστε οποιαδήποτε επιπλέον λεπτομέρειες :)

Απαντήθηκε 08/07/2010 στις 14:08
πηγή χρήστη

ψήφοι
0

Heh, λαμβάνοντας τα επικαλυπτόμενα διαστήματα απαντήσει στα άκρα, μπορείτε απλά να καθορίσει όλα τα διακριτά διαστήματα κατά μήκος του άξονα x και y. Για κάθε γραμμή κοπής, κάνει ένα άνω φράγμα αναζήτηση κατά μήκος του άξονα θα κοπεί με βάση την αρχική τιμή του διαστήματος του. Εάν δεν μπορείτε να βρείτε ένα διάστημα ή το χρονικό διάστημα δεν τέμνει τη γραμμή, τότε είναι μια έγκυρη γραμμή.

Το ελαφρώς δύσκολο μέρος είναι να συνειδητοποιήσουμε ότι ισχύει γραμμές κοπής δεν θα τέμνει τα όρια ενός ορθογωνίου κατά μήκος ενός άξονα, ώστε να μπορείτε να συνδυάσετε επικαλυπτόμενα διαστήματα σε ένα ενιαίο χρονικό διάστημα. Μπορείτε να καταλήξετε με ένα απλό ταξινομημένο πίνακα (το οποίο μπορείτε να συμπληρώσετε O (n) χρόνο) και O (log n) ψάξετε για κάθε γραμμή κοπής.

Απαντήθηκε 09/07/2010 στις 07:53
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more