IEEE Xtreme 14.0

Καλησπέρα. Θα ήθελα βοήθεια στην ακόλουθη άσκηση προγραμματισμού:

1 «Μου αρέσει»

Σε τι ακριβώς θέλεις βοήθεια; Τι σε δυσκολεύει;

Δεν ξέρω το επίπεδο, αλλά την απόσταση Hamming μπορείς να την πάρεις έμμεσα τσεκάροντας ένα ένα χαρακτήρα και να δεις αν είναι διαφορετικοί [*]. Εναλλακτικά ο κωδικός θέλει 96 bits και αν εξασφαλίσεις τα άλλα να είναι μηδενικά, τότε ενα union με char[4] και uint128_t αν έχει υποστήριξη ο compiler.

[*] Ο συγγραφέας της άσκησης μπερδεύει την Hamming distance (πόσα bits είναι διαφορετικά) με την Editting distance (πόσες αλλαγές θέλει η μια συμβολοσειρά για να γίνει η άλλη) αλλά οποιαδήποτε μετρική και από τις δυο να πάρεις θα είσαι σωστός. Αν 2 συμβολοσειρές διαφέρουν σε 2 bit η απόσταση Hamming θα είναι 2 αλλά το editting distance αν συμβεί να είναι στον ίδιο χαρακτήρα μόνο ένα.

1 «Μου αρέσει»

Η μορφή των κωδικών WELC-OMET-OTHE είναι 12 χαρακτήρες, άρα θέλουν 96 bits. Σε ένα δεύτερο κοίταγμα έχεις επιπλέον 4 χαρακτήρες (τρία - και το τερματικό \0) άρα σύνολο 16 χαρακτήρες και σύνολο 128bit. Αυτό δεν είναι καθόλου τυχαίο :woozy_face:

Η παραπάνω παρατήρηση έχει νόημα μόνο αν μιλάμε σε κάποιο σχετικά προχωρημένο επίπεδο. Αν για παράδειγμα μιλάμε για γλώσσα C και έχεις γνώση τι θα πει union data type. Τότε το πρώτο πράγμα που κάνεις είναι να μετρήσεις τα bits της εσωτερικής αναπαράστασης :face_with_spiral_eyes: :face_with_spiral_eyes:

Αν κάνεις XOR δυο αριθμούς θα πάρεις 1 στα σημεία που διαφέρουν και 0 αλλού. Άρα θέλεις ένα τρόπο να μετρήσεις το πλήθος των 1 σε μια δυαδική αναπαράσταση. Ο αριθμός αυτός λέγετε και βάρος Hamming ή popcount btw :face_with_spiral_eyes:. Υπάρχει δε εντολή του επεξεργαστή (popcnt) που τον υπολογίζει. Επίσης C++ έχει την std::popcout. Επίσης υπάρχει και αυτό.

Αλλά αυτά μάλλον σου είναι ακατανόητα αλλά τα είπα γιατί είναι ενδιαφέρον το πρόβλημα και μπορεί να θέλει να το λύσει και κανένας άλλος. Οπότε επανερχόμαστε στο αρχικό ερώτημα: Σε ποιο σημείο κόλλησες και ζητάς βοήθεια;

Οκ. Μια χαρά. Κάτσε να τσεκάρω όσα είπες

Γιατί έτσι το δίνει η εκφώνηση :grinning:

Εν τω μεταξύ έκανα edit και πρόσθεσα μια πιθανή αποδοτική υλοποίηση. Αλλά εξαρτάτε από το επίπεδο.

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

Άρα στην ουσία μετατρέπω κάθε string σε δυαδική αναπαράσταση, κάνω XOR, και με την popcount μετράω τους άσσους του αποτελέσματος. Αν η popcount επιστρέψει 1, τότε αυξάνω έναν μετρητή. Αυτό έτσι? Τα hashing tables τι ρόλο βαράνε?

Η εντολή αυτή μετράει πόσα 1 έχει μια σειρά απο 0 και 1. Τίποτα παραπάνω τίποτα παρακάτω. Είναι ένας από τους πολλούς τρόπους να υπολογίσεις την απόσταση του Hamming, δηλαδή πόσο διαφορετικά είναι δυο πράγματα.

Επίσης δεν έχεις αναφέρει ούτε το επίπεδο ούτε την γλώσσα υλοποίησης.

Τώρα έρχεσαι και πετάς την λέξη Hash Table. Έμμεσα (γιατί τίποτα στην εκφώνηση δεν σε οδηγεί απευθείας) φτάσαμε στο πλήθος των 1 μιας δυαδικής αναπαράστασης. Είναι μια συνάρτηση που σε ένα πρώτο βαθμό ικανοποιεί τα βασικά κριτήρια για να γίνει μια συνάρτηση hashing. Πόσο καλή είναι δεν ξέρω, θέλει μια κάποια ανάλυση (και για κάποιο καλό λόγο έχουμε τα gray codes – αν έχεις ιδέα τι είναι αυτά – ακριβώς γιατί η μετρική του hamming είναι πανάθλια). Αλλά δεν υπάρχει καλή η κακή συνάρτηση hashing υπάρχει καλή η κακή συνάρτηση hashing για κάποια στατιστικά χαρακτηριστικά των δεδομένων που περιμένεις).

Ναι θα μπορούσε να χρησιμοποιηθεί εκεί το βάρος αλλά όχι η απόσταση του Hamming.

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

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

1 «Μου αρέσει»

Δεν μας είπε κάποια γλώσσα συγκεκριμένα. Μία από τις 3: Python, Java, C. Η υλοποίηση σε python πρέπει να παίρνει μαξ 10s, ενώ η υλοποίηση σε java,c 5s.