Δυναμικές δομές δεδομένων- ίδιος τύπος δεδομένων?

Ξεκίνησε από left, 03 Μαΐου 2025, 10:03:45 ΜΜ

« προηγούμενο - επόμενο »

left

Οι δυναμικές δομές δeδομένων έχουν ίδιο τύπο δεδομένων;
μπορεί οι κόμβοι π.χ ενός δέντρου να έχουν διαφορετικό τύπο δεδομένων;
Για τις στατικές δομές τα πράγματα είναι ξεκάθαρα . στις δυναμικές; 

pgrontas

Για ποιο λόγο να μην έχουν ίδιο τύπο δεδομένων;

Αν θυμηθούμε λίγο πώς τις υλοποιούμε με κώδικα (κάτι που δεν βλέπουν οι μαθητές) όταν ορίζεις μια δομή δεδομένων αναφέρεις τι τύπο έχουν οι κόμβοι της (με κάποιο struct ή object), ο οποίος είναι κοινός.

Αλλά χρησιμοποιώντας αντικειμενοστρεφή κόλπα, τυπικά μπορεί να γίνει ανάλογα βέβαια και με τη γλώσσα. Π.χ. στη Java θα μπορούσε μια λίστα να οριστεί από αντικείμενα τύπου object τα οποία κατά την προσπέλαση να κάνεις cast σε άλλο τύπο - βέβαια θα πρέπει να θυμάσαι ποια από αυτά έχουν ποιον υποτύπο για να μην αποτύχει το cast.
Ή στην C θα μπορούσες σίγουρα να κάνεις κάποια κόλπα με δείκτες. Αν θυμάμαι καλά βέβαια.

Όμως το πιο σημαντικό είναι ποια η χρησιμότητα μιας τέτοιας 'παρεκτροπής' με δεδομένο ότι ακόμα και αν τυπικά γίνεται προκαλούν ένα βάρος στον προγραμματιστή που θα πρέπει να θυμάται ποιοι κόμβοι έχουν ποιον τύπο.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

gpapargi

Συμφωνώ κι εγώ με τον Παναγιώτη. Όταν κάνεις create κάποιο κόμβο δεσμεύεται συγκεκριμένος χώρος μνήμης. Αν ήταν διαφορετικού τύπου, πόσος χώρος θα δεσμευόταν;
Στη C από ότι θυμάμαι, μπορείς να έχεις δείκτη μέσα στον κόμβο και να δείχνει σε χώρο εκτός κόμβου που δεσμεύεται δυναμικά στο heap κομμάτι της μνήμης. Οπότε κάνεις προσπέλαση σε δεδομένα που καταλαμβάνουν μεγαλύτερο χώρο, αλλά ο χώρος δεν είναι στον κόμβο, ο δείκτης είναι στον κόμβο. 
Γιώργος Παπαργύρης

left

καλησπέρα.
αν θελω να αναπαραστήσω μια έκφραση πχ την y<- 13+ 8 mod 2 div 4. εχω κόμβο που εχει το (+) , εχω κόμβο που εχει το 13 , εχω κόμβο που έχει το mod κτλ ....... αρα μπορεί να έχω και διαφορετικό τύπο δεδομένων σε ένα κόμβο!!!! ΣΩΣΤΑ?

pgrontas

Παράθεση από: left στις 04 Μαΐου 2025, 07:25:47 ΜΜκαλησπέρα.
αν θελω να αναπαραστήσω μια έκφραση πχ την y<- 13+ 8 mod 2 div 4. εχω κόμβο που εχει το (+) , εχω κόμβο που εχει το 13 , εχω κόμβο που έχει το mod κτλ ....... αρα μπορεί να έχω και διαφορετικό τύπο δεδομένων σε ένα κόμβο!!!! ΣΩΣΤΑ?
Ναι δεν την θυμόμουν αυτή την χρήσιμη περίπτωση παρ'όλο που είναι στο διδακτικό πακέτο.  :( :( :(

Αυτό θα το έκανες είτε με κάποια κλάση Node και θα έπαιρνες υποκλάσεις Value, Operator κτλ. ή αν θυμάμαι καλά το αντίστοιχο μάθημα στο πανεπιστήμιο με enums κλπ.

Τώρα όμως μπαίνουμε σε μια σημασιολογική-φιλοσοφική κουβέντα. Π.χ. αν ορίσω το δέντρο με αντικείμενα τύπου Node όπου σε όλα υπάρχει πεδίο type και ανάλογα με την τιμή του κάνω cast σε Value, Operator κλπ. το δέντρο περιέχει κόμβους ίδιου τύπου ή διαφορετικου;
Η μία απάντηση είναι πώς είναι ίδιου τύπου αφού τόσο το Value όσο και το Operator είναι Node (ως υποκλάση)
Και η άλλη απάντηση είναι πως δεν είναι αφού ο ένας κόμβος έχει τύπο Value και ο άλλος Operator.
Ασφαλώς αυτά δεν μπορούν να τα σκεφτούν οι μαθητές αφού δεν έχουν δει κώδικα, όμως έχουν δει το αντίστοιχο σχήμα στο βιβλίο.
Οπότε με βάση αυτό ενδεχομένως να πρέπει να απαντήσουν ότι μπορούμε να έχουμε κόμβους  διαφορετικού τύπου σε ένα δέντρο.

Δεν ξέρω αν είναι τραβηγμένο ή όχι. Ενδιαφέρον ερώτημα πάντως.




Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

gpapargi

Παράθεση από: left στις 04 Μαΐου 2025, 07:25:47 ΜΜκαλησπέρα.
αν θελω να αναπαραστήσω μια έκφραση πχ την y<- 13+ 8 mod 2 div 4. εχω κόμβο που εχει το (+) , εχω κόμβο που εχει το 13 , εχω κόμβο που έχει το mod κτλ ....... αρα μπορεί να έχω και διαφορετικό τύπο δεδομένων σε ένα κόμβο!!!! ΣΩΣΤΑ?
Βασικά εξαρτάται από το τι επιτρέπει το περιβάλλον. Πχ φαντάζομαι λαμβάνεις την παράσταση σε string και τη σαρώνεις. Μπορείς να βάλεις στους κόμβους πίνακες χαρακτήρων. Θυμάμαι ότι στο μάθημα δομών δεδομένων μας είχαν βάλει άσκηση να διαβλαζουμε παράσταση σε πίνακα χαρακτήρων, να τη σαρώνουμε και να τη βάζουμε σε στοίβα από ενδοθεματική μορφή (ο τελεστής ανάμεσα στους αριθμούς) σε προθεματική μορφή (πρώτα ο τελεστής και μετά οι αριθμοί). Με μια σάρωση της στοίβας υπολογιζόταν οι παράσταση. Πίνακες χαρακτήρων χειριζόμασταν. Η στοίβα έχει αντίστοιχη λειτουργία με τη σάρωση κατά βάθος του δέντρου. Τέλος πάντων... θα πρέπει να δοθεί ποιο είναι το περιβάλλον για να ξέρουμε τι επιτρέπεται. Δείκτες θα πρέπει να υποστηρίζονται. Object υποστηρίζεται; Αλλιώς είναι κάπως αφηρημένη η ερώτηση.   Γίνεται πάντως και με πίνακες χαρακτήρων και δείκτες. Μπορείς να μετατρέπεις πχ το '31' από κείμενο σε ακέραιο 31.
Γιώργος Παπαργύρης

Foto

Η ΓΛΩΣΣΑ δεν έχει συναρτήσεις αλφαριξμητικών. Δεν μπορείς να δώσεις το 65 και να πάρεις το A αγγλικό. Βέβαια μπορούμε με δική μας συνάρτηση χαρακτήρων να δίνουμε το 65 και να παίρνουμε το Α.  Το πρόβλημα μετά είναι ότι η ΓΛΩΣΣΑ δεν υποστηρίζει συνένωση αλφσριθμητικων με το + ή κάτι άλλο. Οπότε η μόνη συνένωση θσ μπορούσε να γίνει στην εμφάνιση με τη ΓΡΑΨΕ. Δυστυχώς καθ η ΓΡΑΨΕ έχει το πρόβλημα ότι αλλάζει γραμμή, πάντα μεταξύ δυο ΓΡΑΨΕ και δεν είναι σίγουρο ότι το ΓΡΑΨΕ "Α", "Β" δεν θα έχει διάστημα μεταξύ Α και Β.
Στον Διερμηηευτή η συνένωση με το + στα αλφαριθμητικά γίνεται με ρύθμιση. Επίσης με ρύθμιση γίνεται το διάστημα στο τέλος του αλφαριθμητικου να θεωρείται ότι αναστέλλει γην αλλαγή γραμμής. Αυτό για ξσ μνν μπει το ελληνικό ερωτηματικό όπως στην Basic που έκανε θαυμάσια τη δουλειά της αναστολής αλλαγής γραμμής ή και στήλης.

left


gpapargi

Παράθεση από: Foto στις 05 Μαΐου 2025, 08:42:56 ΠΜΗ ΓΛΩΣΣΑ δεν έχει συναρτήσεις αλφαριξμητικών
Ε ναι, αυτό εννοούσα όταν έλεγα ότι πρέπει να ξέρουμε τι επιτρέπει το περιβάλλον. ΕΓώ είχα στο νου μου κάτι σαν τη C. Ο Παναγιώτης κάτι με object oriented. Και στη γλώσσα θεωρητικά θα μπορούσε να γίνει αν αποθηκεύσουμε κάθε χαρακτήρα σε μια θέση πίνακα και υλοποιήσουμε συναρτήσεις αλφαριθμητικών. Πάει πολύ μακριά η βαλίτσα.
Γιώργος Παπαργύρης

gpapargi

Παράθεση από: left στις 05 Μαΐου 2025, 11:37:52 ΠΜΤΕΛΙΚΑ ΑΝ ΜΠΕΙ Σ-Λ ΤΙ ΒΑΖΟΥΜΕ;

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

pgrontas

Παράθεση από: left στις 05 Μαΐου 2025, 11:37:52 ΠΜΤΕΛΙΚΑ ΑΝ ΜΠΕΙ Σ-Λ ΤΙ ΒΑΖΟΥΜΕ;

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


Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

left

#11
Αν πάμε βέβαια "by the book" στις δομες δεδομένων δευτερεύουσας μνήμης (αρχεία - εγγραφές αρχείου βάσης δεδομένων ) που είναι δυναμικές δομές δεδομένων επιτρέπονται οι διαφορετικοί τύποι δεδομένων....

ΕΥΧΑΡΙΣΤΩ για τις απαντήσεις σας

gpapargi

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