Αποστολέας Θέμα: ανζήτηση σε ταξινομημένο πίνακα  (Αναγνώστηκε 5870 φορές)

tanius76

  • Βετεράνος
  • ****
  • Μηνύματα: 52
  • Γράψτε το προσωπικό σας σλόγκαν!
ανζήτηση σε ταξινομημένο πίνακα
« στις: 19 Δεκ 2004, 10:37:04 μμ »
θα ήθελα να μου πείτε τι γνώμη σας
για τον παρακάτω αλγόριθμο

Αλγόριθμος Search
Δεδομένα // table, n, key //
i <- 1
position <-  0
Όσο i<=n και key>table επανέλαβε
     αν table = key τότε
           position<- i
     αλλιώς
           i<- i+1
     τέλος_αν
Τέλος_επανάληψης
Αποτελέσματα //position//
Τέλος Search

πιστεύω ότι είναι λάθος  γιατί δεν τερματίζεται ο αλγόριθμος

και η σωστή εκδοχή είναι αυτή

Όσο i<=n και key>table επανέλαβε
     αν table = key τότε
           position<- i
                τέλος αν      
           i<- i+1
Τέλος_επανάληψης
     
τί λέτε ?
περιμένω την γνώμη σας


gpapargi

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 2449
  • I 'm not young enough to know everything
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #1 στις: 20 Δεκ 2004, 10:38:18 πμ »
Τώρα βέβαια δεν ξέρω αν φταίει το ότι δεν έχω πιει καφέ ακόμα αλλά αυτό που βλέπω είναι ακόμα χειρότερο:

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

Αυτό που βλέπω εγώ είναι ότι για να αλλάξει τιμή η position θα πρέπει να ισχύει
Key>table (για να μπει στην Όσο) και key=table (για να μπει στην Αν).
Αυτές οι δύο συνθήκες είναι αμοιβαία αποκλειόμενες οπότε η position  δε θα αλλάξει ποτέ τιμή. Αυτό ισχύει και στους 2 αλγορίθμους που γράφεις.

Laertis

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 1465
  • Δεν αντέχω την (συμ)-πίεσηηη .......
    • ΑΣΚΗΣΕΙΣ-ΘΕΜΑΤΑ ΑΕΠΠ
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #2 στις: 20 Δεκ 2004, 12:14:32 μμ »
Πρέπει να διορθωθεί στο 2ο αλγόριθμο η συνθήκη στο Όσο, εφόσον ψάχνεις την ισότητα κατα την αναζήτηση και να γίνει :

 ............
Όσο key>=table και i <=n επανάλαβε
 ............

Αυτό πάλι είναι σωστό αν ο πίνακας είναι ταξινομημένος κατά αύξουσα σειρά. Σε φθίνουσα διάταξη πρέπει να τροποποιηθεί. ;)
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

Βρακόπουλος Αθανάσιος

  • Επισκέπτης
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #3 στις: 20 Δεκ 2004, 01:30:43 μμ »
Ούτε και η εκδοχή που αναφέρετε είναι σωστή.
Διότι όταν δεν υπάρχει η τιμή του Key στον πίνακα table και η αναζητούμενη τιμή του Key είναι μεγαλύτερη της τελευταίας θέσης του πίνακα table, τότε για να τερματίσει ο αλγόριθμος θα εξετασθεί η Ν+1 θέση του πίνακα, η οποία δεν υφίσταται

Θα πρότεινα τον παρακάτω αλγόριθμο με την προϋπόθεση ότι ο πίνακας  table θα είναι σε αύξουσα διάταξη:
Αλγόριθμος Search
Δεδομένα // table, n, key //

Ι<- 1
Όσο i<n και key>table επανέλαβε
 I<- I+1
Τέλος_επανάληψης

Αν table = key τότε
 pos<- I
Αλλιώς
 pos<- 0
τέλος_αν  
Αποτελέσματα //pos//
! η τιμή 0 της pos σημαίνει δεν υπάρχει το Key στον πίνακα table
! άλλη τιμή της pos σημαίνει ότι υπάρχει το Key στον πίνακα table
Τέλος Search

Laertis

  • Γενικός διαχειριστής
  • *****
  • Μηνύματα: 1465
  • Δεν αντέχω την (συμ)-πίεσηηη .......
    • ΑΣΚΗΣΕΙΣ-ΘΕΜΑΤΑ ΑΕΠΠ
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #4 στις: 20 Δεκ 2004, 04:59:49 μμ »
Χμμ, επανερχόμαστε στις προηγούμενες μακρές συζητήσεις ...
Έχεις δίκιο συνάδελφε όσον αφορά τη θεωρηρική προσέγγιση της άσκησης. Κανονικά πρέπει να μπει λογική συνθήκη όπως γίνεται και στην σειριακή αναζήτηση σε μη ταξινομημένο πίνακα (πχ.
                         Όσο done=ψευδής και i<=n επανάλαβε
                                 Αν table=key τότε
                                      pos <-- i  ( ή ότι άλλο θέλετε να κάνει)
                                 Τέλος_αν
                                  i <-- i + 1
                                 Αν table>key  τότε
                                      done <--αληθής
                                 Τέλος_αν
                                Τέλος_επανάληψης

Στην πράξη όμως δουλεύει  (πχ στην Pascal) και αυτό που  πρότεινα, ακόμα και στο σενάριο που περιγράφεις συνάδελφε Θανάση. Παλιότερα έγινε μια κουβέντα για την προτεραιότητα λογικών πράξεων και την ασάφεια του βιβλίου ... Νομίζω δεν είναι η μόνη.
Στην περίπτωση που αναφέρεις, δηλ. όταν το key είναι μεγαλύτερο και απο το τελευταίο στοιχείο του πίνακα και χρειάζεται να ελεγχθεί σύνθετη συνθήκη , το i<=n θα είναι πάντα ψευδές (για i=n+1) οπότε το αποτέλεσμα της συνθήκης θα είναι ψευδές (έστω και αν το στοιχείο n+1 του πίνακα δεν υπάρχει). Θέλω να πω δηλαδή ότι αρκετές γλώσσες αντιμετωπίζουν πιο ευέλικτα το θέμα κάποιων συνθηκών. Το κακό είναι ότι υπάρχει ασάφεια στο πως το αντιμετωπίζει η γλώσσα και οι εντολές του βιβλίου.
Φιλικά   :-/
Νικολακάκης Γιώργος
Μηχανικός Η/Υ Συστημάτων
Καθηγητής Πληροφορικής
http://users.sch.gr/gnikola

tanius76

  • Βετεράνος
  • ****
  • Μηνύματα: 52
  • Γράψτε το προσωπικό σας σλόγκαν!
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #5 στις: 21 Δεκ 2004, 01:30:31 πμ »
Ευχαριστώ παιδιά για τις απαντήσεις σας!
Μάλλον ο Laertis παρουσιάζει την ποιό ιδανική λύση..
ομως πολύ προχωρημένο θέμα βρε παιδιά για τους μαθητές.

Εσείς το διδάσκετε αυτό?
(Δηλαδή την αναζήτηση σε ταξινομημένο πίνακα???)
Και αν ναί πώς? Με ποιόν Αλγόριθμο?
« Τελευταία τροποποίηση: 21 Δεκ 2004, 01:40:25 πμ από tanius76 »

tanius76

  • Βετεράνος
  • ****
  • Μηνύματα: 52
  • Γράψτε το προσωπικό σας σλόγκαν!
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #6 στις: 21 Δεκ 2004, 01:34:53 πμ »
πρός τον gpapargi
εστω πίνακας Α με 6 στοιχεία :3-4-5-6-8-10
και key=6
Οταν ι=4 τότε key>A(4) {6>6} ---> Ψευδής και έτσι τερματίζεται η επαναληπτική διαδικασία, χωρίς να βρεί το στοιχείο που ζητάμε

tanius76

  • Βετεράνος
  • ****
  • Μηνύματα: 52
  • Γράψτε το προσωπικό σας σλόγκαν!
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #7 στις: 21 Δεκ 2004, 01:38:17 πμ »
τώρα όσον αφορά τον παραπάνω πίνακα ισχύει ο αλγόριθμος

i <- 1
position <-  0  

Όσο i<=n και key>=table επανέλαβε
αν table = key τότε
 position<- i
      τέλος αν  
 i<- i+1
Τέλος_επανάληψης

Ομως στην περίπτωση που αναφέρει ο Βρακόπουλος έχουμε όντως πρόβλημα!!

« Τελευταία τροποποίηση: 21 Δεκ 2004, 01:43:57 πμ από tanius76 »

Παναγιώτης Τσιωτάκης

  • Ομάδα Νέου Λυκείου
  • *
  • Μηνύματα: 3177
  • I love you 3000
    • Panagiotis Tsiotakis
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #8 στις: 21 Δεκ 2004, 11:10:11 πμ »
Αλγόριθμος Sequential_Search_Sorted
  Δεδομένα // n, table, key //
  done <- ψευδής
  position <- 0
  i <- 1
  ! για αύξουσα ταξινόμηση
  Όσο (done = ψευδής) και (i <= n) επανάλαβε
                   Αν (table > key) τότε ! σταμάτα την επανάληψη, δεν θα βρεθεί
                     done <- αληθής
              Αλλιώς_Αν (table = key) τότε ! σταμάτα την επανάληψη, βρέθηκε
                      done <- αληθής
                                position <- i    
              Αλλιώς ! συνέχισε την επανάληψη
                      i <- i + 1
            Τέλος_αν
  Τέλος_επανάληψης
  Αν (position <> 0) τότε
          Εκτύπωσε "Το στοιχείο ", key, " ευρέθη στη θέση ", position
  Αλλιώς
          Εκτύπωσε "Το στοιχείο ", key, " δεν ευρέθη στον δοθέντα πίνακα"      
  Τέλος_Αν
  Αποτελέσματα // position //
Τέλος Sequential_Search_Sorted

redhata

  • Θαμώνας
  • ***
  • Μηνύματα: 24
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #9 στις: 21 Δεκ 2004, 04:55:27 μμ »
O αλγόριθμος του Βρακόπουλου πάντως είναι ο πιο γρήγορος και αξίζει αναφοράς έστω και σαν εναλλακτική λύση.
rEdHaTa

Βασίλης Φ.

  • Επισκέπτης
Re: ανζήτηση σε ταξινομημένο πίνακα
« Απάντηση #10 στις: 29 Ιαν 2005, 07:15:39 μμ »
Πιο απλά, μπορούμε να έχουμε μόνο μια συνθήκη:

Αλγόριθμος Sequential_Search_Sorted
  Δεδομένα // n, table, key //
  done <- ψευδής

  i <- 1
  ! για αύξουσα ταξινόμηση
  Όσο (done = ψευδής) και (i <= n) ΚΑΙ table<=key επανάλαβε
   AN (table = key) τότε ! σταμάτα την επανάληψη
       done <- αληθής
       position <- i    
    Αλλιώς ! συνέχισε την επανάληψη
       i <- i + 1  
  Τέλος_αν
  Τέλος_επανάληψης

  Αν (done=Αληθής) τότε  
     Εκτύπωσε "Το στοιχείο ", key, " ευρέθη στη θέση ", position
  Αλλιώς
     Εκτύπωσε "Το στοιχείο ", key, " δεν ευρέθη στον δοθέντα πίνακα"  
  Τέλος_Αν
  Αποτελέσματα // position //
Τέλος Sequential_Search_Sorted

Θεωρώ επίσης όπως θα καταλάβατε ότι ο έλεγχος για το αν βρέθηκε ή όχι το στοιχείο γίνεται με έλεγχο του flag done και όχι του position. Προσωπικά θεωρώ άσκοπο να πούμε position<--0 αφού καταρχήν δεν έχει νόημη η θέση 0 σε έναν πίνακα, και αφού την δουλειά σου μπορείς να την κάνεις με το flag πιο όμορφα! Συμφωνείτε;