Αλγόριθμος Undo

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
S.a.kiss.007
Mbyte level
Mbyte level
Posts: 659
Joined: Wed Nov 28, 2007 2:24 am
Academic status: 4th year
Gender:
Location: Κρήτη (πνευματικά...)
Contact:

Αλγόριθμος Undo

Post by S.a.kiss.007 » Sun Jul 12, 2009 5:27 pm

Καλησπέραααα :-D
Γνωρίζει κανείς τι αλγόριθμος τρέχει από πίσω όταν πατάω σε ένα πρόγραμμα "Undo"?
Κρατάει 2 (ή παραπάνω) "status" του project και γυρίζει πίσω?
Κρατάει την τελευταία (ή παραπάνω) εντολή που δώθηκε από τον χρήστη και ενεργεί αντίστροφα?
Κάτι άλλο? :smt017
User avatar
gasparosoft
Gbyte level
Gbyte level
Posts: 1920
Joined: Fri Oct 19, 2007 8:03 pm

Re: Αλγόριθμος Undo

Post by gasparosoft » Sun Jul 12, 2009 5:51 pm

Για τα παρακάτω δεν είμαι 100% σίγουρος.
Βασικά ό,τι κάνεις μπαίνουν σε μια stack. Όταν κάνεις undo τότε γίνεται pop από την stack η τελευταία ενέργεια που εκτελέστηκε. Τώρα πόσες ενέργειες και ποιες είναι δικό σου ζήτημα. Ανάλογα πάντα με το μέγεθος της stack και τις ενέργειες.
User avatar
necrofear_13
Wow! Terabyte level
Wow! Terabyte level
Posts: 2141
Joined: Sun Nov 18, 2007 5:32 am
Academic status: Alumnus/a
Gender:
Location: ΗΡΑΚΛΕΙΟ ΑΤΤΙΚΗΣ

Re: Αλγόριθμος Undo

Post by necrofear_13 » Sun Jul 12, 2009 6:40 pm

Οπως τα λεει ο γιαννης.Το ποσες ενεργειες εξαρταται απο την υλοποιηση και το μεγεθος της stack.
No matter what kind of sadness envelops the darkness of our despair, if you put one foot in front of the other, at some point you will reach a place where you can see the light.

In heaven or earth, no matter to where we progress, no matter where we walk, that becomes our road.
As long as we keep walking the battle will continue.
And that is exactly why this place will always be a paradise
User avatar
S.a.kiss.007
Mbyte level
Mbyte level
Posts: 659
Joined: Wed Nov 28, 2007 2:24 am
Academic status: 4th year
Gender:
Location: Κρήτη (πνευματικά...)
Contact:

Re: Αλγόριθμος Undo

Post by S.a.kiss.007 » Sun Jul 12, 2009 6:45 pm

Ναι οκ όπως τα λέει... Νομίζω όλοι έχουμε ακούσει πως το undo υλοιποιείται με στοίβα, αλλά τπτ άλλο...
π.χ. όπως ξαναείπα, κρατούνται οι ενέργειες οι διαφορετικές "καταστάσεις" του προγράμματος?
Επίσης πως κρατάς ενέργειες σε μια στοίβα? :smt017 Εννοώ σε τι μορφή?
User avatar
cyberpython
Mbyte level
Mbyte level
Posts: 654
Joined: Wed Nov 21, 2007 8:18 pm
Academic status: Alumnus/a
Gender:
Location: Αθηνα
Contact:

Re: Αλγόριθμος Undo

Post by cyberpython » Sun Jul 12, 2009 7:52 pm

Εξαρτάται από την εφαρμογή π.χ. αν γράφεις σε Java έναν text editor τότε κάθε φορά που συμβαίνει ένα γεγονός (π.χ. πάτημα πλήκτρου στο πληκτρολόγιο, paste από το clipbaord κλπ.) αν αυτό το γεγονός είναι undoableEdit τότε προστίθεται στη στοίβα (βασικά στο συγκεκριμένο παράδειγμα δεν είναι ορατό γιατί απλά ειδοποιείται ένας UndoManager). Αντίστοιχα σε μία στοίβα μπαίνουν και τα γεγονότα που κάναμε undo ώστε να μπορεί να γίνει επανάληψή τους.
User avatar
SeniorCarbone
Kilobyte level
Kilobyte level
Posts: 396
Joined: Fri Feb 24, 2006 1:57 pm
Gender:
Contact:

Re: Αλγόριθμος Undo

Post by SeniorCarbone » Sun Jul 12, 2009 9:13 pm

Η στοίβα καταστάσεων είναι μια λύση. Μια άλλη λύση λιγότερο απαιτητική στην μνήμη - περισσότερο στην επεξεργασία θα ήταν να γράφεις σε στοίβα τα operations που γίνονται σε κάθε βήμα και για να πας σε κάποια προηγούμενη κατάσταση αρκεί να εκτελείς το αντίστροφο operation ανά βήμα που βγάζεις από την στοίβα. Αυτό προϋποθέτει τα operations που χρησιμοποιείς να είναι αντιστρέψιμα φυσικά. Απλά σαν εναλλακτική το αναφέρω εάν ταιριάζει με την υλοποίηση που θες. Δεν αξίζει πάντα κάτι τέτοιο, πχ για διανυσματικές ή υπολογιστικές εφαρμογές το χρησιμοποιούν κ αν.
Είχα χρησιμοποιήσει το undo με αντίστροφα operations σε μια εφαρμογή που είχα φτοιάξει για image processing οπότε αν πχ εφάρμοζες ένα φίλτρο f σε ολόκληρο το image κ ήθελες να κάνεις undo να μην χρειαζόταν να κράταγες πληροφορίες για όλα τα pixels κτλπ αλλά μόνο το f ώστε μετά εύκολα να εφάρμοζες το f' .
*--Common sense is not so common--*
User avatar
mikem4600
Gbyte level
Gbyte level
Posts: 1363
Joined: Fri Mar 12, 2004 2:00 pm
Academic status: Alumnus/a
Gender:
Location: A Galaxy Far, Far Away
Contact:

Re: Αλγόριθμος Undo

Post by mikem4600 » Sun Jul 12, 2009 9:52 pm

SeniorCarbone wrote:Μια άλλη λύση λιγότερο απαιτητική στην μνήμη - περισσότερο στην επεξεργασία θα ήταν να γράφεις σε στοίβα τα operations που γίνονται σε κάθε βήμα και για να πας σε κάποια προηγούμενη κατάσταση αρκεί να εκτελείς το αντίστροφο operation ανά βήμα που βγάζεις από την στοίβα.
Έτσι όπως το περιγράφεις δουλεύει στο undo σε σχεδόν όλα τα προγράμματα. Χρησιμοποιούν μάλιστα το command pattern για να αποθηκεύουν τις εντολές του χρήστη.
Autocracy hates questions. Anarchy hates answers.
shodanjr_gr
Mbyte level
Mbyte level
Posts: 810
Joined: Mon Mar 21, 2005 2:45 am
Academic status: Alumnus/a
Location: Stony Brook, NY

Re: Αλγόριθμος Undo

Post by shodanjr_gr » Mon Jul 13, 2009 9:51 am

gasparosoft wrote:Για τα παρακάτω δεν είμαι 100% σίγουρος.
Βασικά ό,τι κάνεις μπαίνουν σε μια stack. Όταν κάνεις undo τότε γίνεται pop από την stack η τελευταία ενέργεια που εκτελέστηκε. Τώρα πόσες ενέργειες και ποιες είναι δικό σου ζήτημα. Ανάλογα πάντα με το μέγεθος της stack και τις ενέργειες.

Όπως το λένε τα παιδιά είναι. Κρατάς ένα μία στοίβα με τα operations και δύο states. Το state που αντιστοιχεί στην βάση της στοίβας και το "τρέχον" state. Όταν κάνεις pop (undo) μία command, κάνεις iterate τα περιεχόμενα της στοίβας και ξανακατασκευάζεις το state από την κατάσταση της βάσης (ή μπορείς να εφαρμόζεις το "αντίστροφο" operation πάνω στο state της κορυφής).

Αν τα operations που κάνεις είναι βαριά (πχ. εφαρμογή ενός ακριβού φίλτρου σε μία εικόνα, ένα μεγάλο refractoring κώδικα κλπ) ίσως έχει και νόημα όταν κάνεις push ένα operation στη στοίβα να κρατάς και ένα αντίγραφο του state πριν την εντολή ώστε να μπορείς να κάνεις γρήγορα revert.
"Liberal" isn't a dirty word Blackadder!
Post Reply

Return to “Προγραμματισμός”