Καμπύλη Z-τάξης

μικρογραφία|277x277px|Τέσσερις επαναλήψεις της καμπύλης Z-τάξης.
Στη μαθηματική ανάλυση και την επιστήμη των υπολογιστών, οι συναρτήσεις **Z-τάξης** όπως η καμπύλη Λεμπέσγκ, η καμπύλη Μόρτον που γεμίζει το χώρο ,  η τάξη Μόρτον ή κώδικα Μόρτον μειώνουν πολυδιάστατα δεδομένα σε μία μόνο διάσταση, διατηρώντας την τοπικότητα των σημείων δεδομένων. Ονομάστηκε στη Γαλλία από τον Ανρί Λεμπέσγκ, ο οποίος τη μελέτησε το 1904, και στις Ηνωμένες Πολιτείες από τον Γκάι Μακ Ντόναλντ Μόρτον, ο οποίος την εφάρμοσε για πρώτη φορά στην αλληλουχία αρχείων το 1966. Η Z-τάξης ενός σημείου σε πολλές διαστάσεις υπολογίζεται απλά με την παρεμβολή των δυαδικών αναπαραστάσεων των τιμών των συντεταγμένων του. Αφού τα δεδομένα ταξινομηθούν με αυτή τη σειρά, μπορεί να χρησιμοποιηθεί οποιαδήποτε μονοδιάστατη δομή δεδομένων, όπως απλοί μονοδιάστατοι πίνακες, δυαδικά δέντρα αναζήτησης, δέντρα Β, λίστες άλματος ή (με τα λιγότερο σημαντικά bit αποκομμένα) πίνακες κατακερματισμού. Η προκύπτουσα σειρά μπορεί να περιγραφεί ισοδύναμα ως η σειρά που θα λαμβανόταν από μια βαθιά διάσχιση ενός τετραδένδρου ή οκταδένδρου.

## Τιμές συντεταγμένων
μικρογραφία|248x248εσ|Υπολογισμός των (x, y)-συντεταγμένων της καμπύλης Z-τάξης από τα διαπλεκόμενα bits της τιμής z 2479.
Το παρακάτω σχήμα δείχνει τις τιμές Z για την περίπτωση των δύο διαστάσεων με ακέραιες συντεταγμένες 0&nbsp;≤&nbsp;*x*&nbsp;≤&nbsp;7, 0&nbsp;≤&nbsp;*y*&nbsp;≤&nbsp;7 (εμφανίζονται τόσο σε δεκαδικό όσο και σε δυαδικό σύστημα). Η παρεμβολή των δυαδικών τιμών συντεταγμένων (ξεκινώντας προς τα δεξιά με το *x*-bit (με μπλε χρώμα) και εναλλάσσοντας προς τα αριστερά με το *y*-bit (με κόκκινο χρώμα)) δίνει τις δυαδικές τιμές *z* (με κλίση 45° όπως φαίνεται). Η σύνδεση των τιμών *z* με την αριθμητική τους σειρά παράγει την αναδρομική καμπύλη σχήματος Z. Οι δισδιάστατες τιμές Z είναι επίσης γνωστές ως τιμές τετραπλού κλειδιού.

Οι τιμές Z των συντεταγμένων *x* περιγράφονται ως δυαδικοί αριθμοί από την ακολουθία Μόσερ-ντε Μπρούιν (Moser-de Bruijn), με μη μηδενικά bit μόνο στις ζυγές θέσεις τους:
 x[] = {0b000000, 0b000001, 0b000100, 0b000101, 0b010000, 0b010001, 0b010100, 0b010101}

Το άθροισμα και η διαφορά δύο τιμών *x* υπολογίζονται με τη χρήση πράξεων κατά μπιτ:
 x[i+j] = ((x[i] | 0b10101010) + x[j]) & 0b01010101
 x[i−j] = ((x[i] & 0b01010101) − x[j]) & 0b01010101  if i ≥ j

Αυτή η ιδιότητα μπορεί να χρησιμοποιηθεί για τη μετατόπιση μιας τιμής Ζ, παραδείγματος χάριν σε δύο διαστάσεις, οι συντεταγμένες προς τα πάνω (μείωση y), κάτω (αύξηση y), αριστερά (μείωση x) και δεξιά (αύξηση x) από την τρέχουσα τιμή *z* :
 top    = (((z & 0b10101010) − 1) & 0b10101010) | (z & 0b01010101)
 bottom = (((z | 0b01010101) + 1) & 0b10101010) | (z & 0b01010101)
 left   = (((z & 0b01010101) − 1) & 0b01010101) | (z & 0b10101010)
 right  = (((z | 0b10101010) + 1) & 0b01010101) | (z & 0b10101010)
Και γενικότερα προσθέτουμε δύο δισδιάστατες τιμές Ζ *w* και *z*:
 sum    = ((z | 0b10101010) + (w & 0b01010101) & 0b01010101) | ((z | 0b01010101) + (w & 0b10101010) & 0b10101010)

## Αποτελεσματική κατασκευή τετράδεντρων και οκτάδεντρων
Η Z-τάξη μπορεί να χρησιμοποιηθεί για την αποτελεσματική κατασκευή ενός τετραδένδρου (2D) ή οκταδένδρου (3D) για ένα σύνολο σημείων. Η βασική ιδέα είναι η ταξινόμηση του συνόλου εισόδου σύμφωνα με τη Z-τάξη. Αφού ταξινομηθούν, τα σημεία μπορούν να αποθηκευτούν σε ένα δυαδικό δέντρο αναζήτησης και να χρησιμοποιηθούν απευθείας, γνωστό ως γραμμικό τετράδεντρο, ή μπορούν να χρησιμοποιηθούν για την κατασκευή ενός τετράδεντρου βασισμένου σε δείκτες.

Τα σημεία εισόδου συνήθως κλιμακώνονται σε κάθε διάσταση ώστε να είναι θετικοί ακέραιοι αριθμοί, είτε ως αναπαράσταση σταθερού σημείου στο μοναδιαίο εύρος [0, 1] είτε σε αντιστοιχία με το μέγεθος λέξης της μηχανής. Και οι δύο αναπαραστάσεις είναι ισοδύναμες και επιτρέπουν την εύρεση του μη μηδενικού bit πρώτης τάξης σε σταθερό χρόνο. Κάθε τετράγωνο στο τετραγωνικό δέντρο έχει μήκος πλευράς που είναι δύναμη του δύο και γωνιακές συντεταγμένες που είναι πολλαπλάσια του μήκους πλευράς. Δεδομένων δύο οποιωνδήποτε σημείων, το παράγωγο τετράγωνο για τα δύο σημεία είναι το μικρότερο τετράγωνο που εκτείνεται μεταξύ των δύο σημείων. Η παρεμβολή των bits των συνιστωσών x και y κάθε σημείου ονομάζεται ανάμειξη των x και y και μπορεί να επεκταθεί σε υψηλότερες διαστάσεις.

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

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


```python
def cmp_zorder(lhs, rhs) -> bool:
    """Compare z-ordering."""
    # Assume lhs and rhs array-like objects of indices.
    assert len(lhs) == len(rhs)
    # Will contain the most significant dimension.
    msd = 0
    # Loop over the other dimensions.
    for dim in range(1, len(lhs)):
        # Check if the current dimension is more significant
        # by comparing the most significant bits.
        if less_msb(lhs[msd] ^ rhs[msd], lhs[dim] ^ rhs[dim]):
            msd = dim
    return lhs[msd] < rhs[msd]
```


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


```python
def less_msb(x: int, y: int) -> bool:
    return x < y and x < (x ^ y)
```


Είναι επίσης δυνατή η σύγκριση αριθμών κινητής υποδιαστολής με την ίδια τεχνική. Η συνάρτηση `less_msb` τροποποιείται ώστε να συγκρίνει πρώτα τους εκθέτες. Μόνο όταν αυτοί είναι ίσοι χρησιμοποιείται η τυπική συνάρτηση `less_msb` στη mantissa. 

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

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

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

## Χρήση με μονοδιάστατες δομές δεδομένων για αναζητήσεις εύρους
Μέσω της παρεμβολής bit, οι εγγραφές της βάσης δεδομένων μετατρέπονται σε μια (ενδεχομένως πολύ μεγάλη) ακολουθία bit. Οι ακολουθίες bit ερμηνεύονται ως δυαδικοί αριθμοί και τα δεδομένα ταξινομούνται ή ευρετηριάζονται με βάση τις δυαδικές τιμές, χρησιμοποιώντας οποιαδήποτε από τις μονοδιάστατες δομές δεδομένων που αναφέρθηκαν στην εισαγωγή. Εντούτοις, κατά την αναζήτηση ενός πολυδιάστατου εύρους αναζήτησης σε αυτά τα δεδομένα, η δυαδική αναζήτηση δεν είναι πραγματικά αποτελεσματική. Παρόλο που η  Z-τάξη διατηρεί καλά την τοπικότητα, απαιτείται ένας αλγόριθμος για τον υπολογισμό, από ένα σημείο που συναντάται στη δομή δεδομένων, της επόμενης πιθανής τιμής Ζ που βρίσκεται εντός του πολυδιάστατου εύρους αναζήτησης:

Σε αυτό το παράδειγμα, το εύρος που ερωτάται (*x*&nbsp;=&nbsp;2,&nbsp;...,&nbsp;3, *y*&nbsp;=&nbsp;2,&nbsp;...,&nbsp;6) υποδεικνύεται από το διακεκομμένο ορθογώνιο. Η υψηλότερη τιμή Z (MAX) είναι 45. Σε αυτό το παράδειγμα, η τιμή *F*&nbsp;=&nbsp;19 συναντάται κατά την αναζήτηση μιας δομής δεδομένων με αυξανόμενη κατεύθυνση τιμών Ζ, οπότε θα πρέπει να αναζητήσουμε στο διάστημα μεταξύ *F* και MAX (διαγραμμισμένη περιοχή). Για να επιταχύνουμε την αναζήτηση, θα μπορούσαμε να υπολογίσουμε την επόμενη τιμή Z που βρίσκεται στο εύρος αναζήτησης, που ονομάζεται BIGMIN (36 στο παράδειγμα) και να αναζητήσουμε μόνο στο διάστημα μεταξύ BIGMIN και MAX (έντονες τιμές), παρακάμπτοντας έτσι το μεγαλύτερο μέρος της διαγραμμισμένης περιοχής. Η αναζήτηση προς φθίνουσα κατεύθυνση είναι ανάλογη με το LITMAX που είναι η υψηλότερη τιμή Z στην περιοχή αναζήτησης χαμηλότερη από *F*. Το πρόβλημα BIGMIN διατυπώθηκε για πρώτη φορά και η λύση του παρουσιάστηκε από τους Tropφ και Χερτζόγκ.

Παρέχεται εκτενής επεξήγηση του αλγορίθμου υπολογισμού LITMAX/BIGMIN, μαζί με πηγαίο κώδικα Πασκάλ (3D, εύκολα προσαρμόσιμος στο nD) και συμβουλές για τον τρόπο χειρισμού δεδομένων κινητής υποδιαστολής και ενδεχομένως αρνητικών δεδομένων 2021 by Tropf: Εδώ, δεν γίνεται ρητή παρεμβολή bit- η δομή δεδομένων έχει απλώς δείκτες στις αρχικές (αταξινόμητες) εγγραφές της βάσης δεδομένων. Με μια γενική συνάρτηση σύγκρισης εγγραφών (μεγαλύτερο-λιγότερο-ίσο, με την έννοια της τιμής z), αποφεύγονται οι επιπλοκές με το μήκος ακολουθιών bit που υπερβαίνει το μήκος λέξης του υπολογιστή και ο κώδικας μπορεί εύκολα να προσαρμοστεί σε οποιονδήποτε αριθμό διαστάσεων και οποιοδήποτε μήκος λέξης-κλειδιού εγγραφής.

Καθώς η προσέγγιση δεν εξαρτάται από τη μονοδιάστατη δομή δεδομένων που επιλέγεται, εξακολουθεί να υπάρχει ελεύθερη επιλογή της διάρθρωσης των δεδομένων, οπότε γνωστές μέθοδοι όπως τα ισορροπημένα δέντρα μπορούν να χρησιμοποιηθούν για την αντιμετώπιση δυναμικών δεδομένων και η διατήρηση της ισορροπίας του δέντρου κατά την εισαγωγή ή τη διαγραφή απαιτεί χρόνο O(log n). Η μέθοδος χρησιμοποιείται επίσης στα UB-δέντρα (balanced),  με το όνομα "GetNextZ-address" για το BIGMIN.

Η επιλογή Free διευκολύνει την ενσωμάτωση της μεθόδου σε υπάρχουσες βάσεις δεδομένων. Αυτό έρχεται σε αντίθεση, παραδείγματος χάριν, με τα R-δέντρα, όπου απαιτούνται ειδικές εκτιμήσεις.

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

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

## Εφαρμογές

### Γραμμική άλγεβρα
Ο αλγόριθμος του Στράσεν για τον πολλαπλασιασμό πινάκων βασίζεται στη διαίρεση πινάκων σε τέσσερα τμήματα, και στη συνέχεια στην αναδρομική διαίρεση κάθε ενός από αυτά τα τμήματα σε τέσσερα μικρότερα τεμάχια, έως ότου τα τμήματα αποτελούνται από μοναδικά στοιχεία (ή πιο πρακτικά: έως ότου οι πίνακες είναι τόσο μικροί ώστε ο τετριμμένος αλγόριθμος ακολουθίας Moser-de Bruijn να είναι ταχύτερος). Η διάταξη των στοιχείων του πίνακα με τη σειρά Z βελτιώνει τότε την τοπικότητα και έχει το πρόσθετο πλεονέκτημα (σε σύγκριση με τη μείζονα σειρά γραμμών ή στηλών) ότι η υπορουτίνα πολλαπλασιασμού δύο μπλοκ δεν χρειάζεται να γνωρίζει το συνολικό μέγεθος του πίνακα, παρά μόνο το μέγεθος των μπλοκ και τη θέση τους στη μνήμη. Η αποτελεσματική χρήση του πολλαπλασιασμού Στράσεν με Τάξη-Ζ έχει αποδειχθεί, βλ. το άρθρο των Βάλσαλαμ και Σκίλουμ το 2002.

Οι Buluç και άλλοι παρουσιάζουν μια δομή δεδομένων αραιών πινάκων που ταξινομεί τα μη μηδενικά στοιχεία του σε τάξη-Ζ για να επιτρέπει τον παράλληλο πολλαπλασιασμό πινάκων-διανυσμάτων.

Οι πίνακες της γραμμικής άλγεβρας μπορούν επίσης να διανύονται με τη χρήση μιας καμπύλης πλήρωσης χώρου. Η διάσχιση με την καμπύλη Ζ επιτρέπει την αποτελεσματική πρόσβαση στην ιεραρχία της μνήμης

### Χαρτογράφηση υφής
Ορισμένες GPU αποθηκεύουν τους χάρτες υφής σε Z-τάξης για να αυξήσουν τη χωρική εντοπιότητα της αναφοράς κατά τη ραστεροποίηση του χάρτη υφής. Αυτό επιτρέπει στις γραμμές της κρυφής μνήμης να αναπαριστούν ορθογώνια πλακίδια, αυξάνοντας την πιθανότητα οι κοντινές προσπελάσεις να βρίσκονται στην κρυφή μνήμη. Σε μεγαλύτερη κλίμακα, μειώνει επίσης την πιθανότητα ακριβών "διαλειμμάτων σελίδας" (δηλαδή το κόστος αλλαγής γραμμών) στην SDRAM/DDRAM. Αυτό είναι σημαντικό διότι η τρισδιάστατη απόδοση περιλαμβάνει αυθαίρετους μετασχηματισμούς (περιστροφές, κλιμάκωση, προοπτική και παραμόρφωση από κινούμενες επιφάνειες).

Αυτές οι μορφές αναφέρονται συχνά ως "swizzled" ή "twiddled" υφές. Μπορούν επίσης να χρησιμοποιηθούν και άλλες μορφές ψηφιδωτού.

### πρόβλημα n-σώματος
Ο αλγόριθμος Μπαρνς - Χουτ απαιτεί την κατασκευή ενός οκταδένδρου. Η αποθήκευση των δεδομένων ως δέντρο βασισμένο σε δείκτες απαιτεί πολλές διαδοχικές αναφορές δεικτών για την επανάληψη στο οκτάρι με σειρά βάθους (κάτι που είναι δαπανηρό σε μια μηχανή κατανεμημένης μνήμης). Από την άλλη πλευρά, αν αποθηκεύσουμε τα δεδομένα σε έναν πίνακα κατακερματισμού, χρησιμοποιώντας τον κατακερματισμό του οκταδένδρου, η καμπύλη Ζ-τάξης επαναλαμβάνει φυσικά το οκταδένδρο κατά σειρά βάθους.

## Εξωτερικοί σύνδεσμοι
*STANN: A library for approximate nearest neighbor search, using Z-order curve
*Methods for programming bit interleaving, Sean Eron Anderson, Stanford University

## Δείτε επίσης
*Αλγόριθμος διαμαντιού τετραγώνου
*Καμπύλη που γεμίζει το χώρο
*Νιφάδα του Κοχ 
*Καμπύλη Χίλμπερτ
*Καμπύλη του δράκου
*Σπόγγος του Μένγκερ

*Σύνολο Μάντελμπροτ
*Σύνολο Julia
*Σύνολο Κάντορ
*Οικοδομήσιμο Σύμπαν

## Παραπομπές

 
 
Κατηγορία:Φράκταλ 
Κατηγορία:Γραμμική άλγεβρα
Κατηγορία:Αλγόριθμοι
Κατηγορία:Καμπύλες