Δυαδική Αναζήτηση και μετά σειριακή;

Ξεκίνησε από nikolasmer, 13 Δεκ 2025, 05:01:48 ΜΜ

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

nikolasmer

Έβγαλα ένα θεματάκι για ένα διαγώνισμα, κλασικότατο το 1ο ερώτημα , Δυαδική με κένά. Και έπειτα εύρεση όλων των θέσεων εμφάνισης του στοιχείου χωρίς τη χρήση δομής επιλογής. Κάτι είχα στο μυαλό μου σαν απάντηση για το 2ο ερώτημα, να κάνει σεριακή αριστερά και έπειτα δεξιά του στοιχείου αλλά μπορεί να είναι και ακριανό οπότε πάλι θέλει έλεγχο με επιλογή  (το βαλα μια μονάδα έτσι για την τιμή). Να το βγάλω ή υπάρχει τρόπος;

Β2. 1. Ο πίνακας Α[Ν] περιέχει ακέραια στοιχεία ταξινομημένα σε αύξουσα σειρά και μπορεί να περιέχει και ίδιες τιμές (διπλότυπα). Να συμπληρώσετε τα κενά στο παρακάτω τμήμα προγράμματος ώστε αυτό να βρίσκει και να εμφανίζει τη θέση εμφάνισης του στοιχείου key που αναζητείται ή το μήνυμα «ΔΕΝ ΒΡΕΘΗΚΕ» σε αντίστοιχη περίπτωση, εφαρμόζοντας τον αλγόριθμο της Δυαδικής Αναζήτησης.
flag ß  ...(1)...
θ ß 0
 left
ß 1
 right
ß N
 
ΟΣΟ ...(2)...  ΚΑΙ (left <= right) ΕΠΑΝΑΛΑΒΕ
    mid
ß ...(3)...
    ΑΝ A[mid] = key ΤΟΤΕ
      flag
<- ΑΛΗΘΗΣ
      θ ß mid
   
ΑΛΛΙΩΣ_ΑΝ A[mid] > key ΤΟΤΕ
      right
ß ...(4)...
    ΑΛΛΙΩΣ
  left ß ...(5)...
  ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΝ ...(6)... ΤΟΤΕ
    ΓΡΑΨΕ θ
 
ΑΛΛΙΩΣ
    ΓΡΑΨΕ "ΔΕΝ ΒΡΕΘΗΚΕ"
ΤΕΛΟΣ_ΑΝ
Μονάδες 6
2. Αφήνοντας το παραπάνω τμήμα προγράμματος ως έχει, συμπληρώστε με τον κατάλληλο κώδικα ώστε να υπολογίζει και να εμφανίζει όλες τις θέσεις που υπάρχει το στοιχείο key στον πίνακα Α[Ν], χωρίς τη χρήση δομής επιλογής. 
Μονάδες 1
Μερεντίτης Νικόλαος
Πληροφορικός

pgrontas

#1
Με δομή επιλογής δεν βλέπω κάτι, αλλά αν κάποιος χρησιμοποιήσει ΌΣΟ δεν είναι το ίδιο πράγμα; με την έννοια ότι το ΌΣΟ είναι ένα επαναλαμβανόμενο ΑΝ).
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

nikolasmer

Σκεφτόμουν οτι μπορεί να βγεί εκτός πίνακα. Έχεις κάτι στο μυαλό σου Παναγιώτη;
Χωρίς όμως να μπλέξουμε με πλήρεις απτιμήσεις λογικών τελεστών και τα ρέστα.
Μερεντίτης Νικόλαος
Πληροφορικός

ssimaiof

Μπορούμε απλώς να μιμηθούμε την ΑΝ με την ΟΣΟ. Δεν ξέρω αν είναι αυτό που θέλεις εμένα όμως δεν μου πολυαρέσει σαν λογική θέματος.
    i <- θ
    ΟΣΟ i > 1 ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i - 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    i <- θ + 1
    ΟΣΟ i < Ν ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i + 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
Σταύρος Σημαιοφορίδης

nikolasmer

#4
Παράθεση από: ssimaiof στις 14 Δεκ 2025, 08:23:25 ΜΜΜπορούμε απλώς να μιμηθούμε την ΑΝ με την ΟΣΟ. Δεν ξέρω αν είναι αυτό που θέλεις εμένα όμως δεν μου πολυαρέσει σαν λογική θέματος.
    i <- θ
    ΟΣΟ i > 1 ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i - 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    i <- θ + 1
    ΟΣΟ i < Ν ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      i <- i + 1
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
    Flag <- ΨΕΥΔΗΣ
    ΟΣΟ Flag = ΨΕΥΔΗΣ ΚΑΙ Α[i] = key ΕΠΑΝΑΛΑΒΕ
      ΓΡΑΨΕ i
      Flag <- ΑΛΗΘΗΣ
    ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ

Πολύ καλό. Πάρα πολύ καλό Στάυρο. :D  Με τη φλαγκ αναγκάζεις μια εκτέλεση και κλειδώνεις και αριστερά και δεξιά. Δεν θα το σκεφτόμουν ποτέ. Ευχαριστώ.

Βλακεία λοιπόν.
Αλλάζω την εκφώνηση.
Νεα εκφώνηση στο Β2.

Β2. Ο πίνακας A[Ν] περιέχει ακέραια στοιχεία ταξινομημένα σε αύξουσα σειρά και μπορεί να περιέχει και ίδιες τιμές (διπλότυπα). Να συμπληρώσετε τα κενά στο παρακάτω τμήμα προγράμματος ώστε:
·        να εφαρμόζει τον αλγόριθμο της Δυαδικής Αναζήτησης και να εντοπίζει τη θέση της πρώτης (αριστερότερης) εμφάνισης του στοιχείου key,
·        και εφόσον το στοιχείο βρεθεί, να εφαρμόζει δεύτερη Δυαδική Αναζήτηση στο κατάλληλο τμήμα του πίνακα ώστε να εντοπίζει τη θέση της τελευταίας (δεξιότερης) εμφάνισης του key.
Στη συνέχεια να εμφανίζει:
·        τη θέση της πρώτης εμφάνισης,
·        τη θέση της τελευταίας εμφάνισης,
·        και το πλήθος εμφανίσεων του key.
Αν το στοιχείο δεν υπάρχει στον πίνακα, να εμφανίζει «ΔΕΝ ΒΡΕΘΗΚΕ».

flag ß ...(1)...
 θ_αριστερά
ß 0
left ß 1
right ß N
! 1η Δυαδική Αναζήτηση: βρίσκει την πρώτη (αριστερότερη) εμφάνιση
ΟΣΟ left <= right ΕΠΑΝΑΛΑΒΕ
mid ß ...(2)...
 
ΑΝ A[mid] = key ΤΟΤΕ
flag ß ΑΛΗΘΗΣ
θ_αριστερά ß mid
right ß ...(3)...
 
ΑΛΛΙΩΣ_ΑΝ A[mid] < key ΤΟΤΕ
left ß ...(4)...
ΑΛΛΙΩΣ
right ß ...(5)...
ΤΕΛΟΣ_ΑΝ
ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
ΑΝ ...(6)... ΤΟΤΕ
! 2η Δυαδική Αναζήτηση: βρίσκει την τελευταία (δεξιότερη) εμφάνιση
left ß ...(7)...
right ß N
ΟΣΟ left <= right ΕΠΑΝΑΛΑΒΕ
mid ß ...( 8 )...
ΑΝ A[mid] = key ΤΟΤΕ
...(9)...
left ß mid + 1
ΑΛΛΙΩΣ_ΑΝ ...(10)... ΤΟΤΕ
      right
ß mid - 1
    ΑΛΛΙΩΣ
      ...(11)...
    ΤΕΛΟΣ_ΑΝ
  ΤΕΛΟΣ_ΕΠΑΝΑΛΗΨΗΣ
  πλήθος
ß ...(12)... 
  ΓΡΑΨΕ θ_αριστερά
 
ΓΡΑΨΕ θ_δεξιά
 
ΓΡΑΨΕ πλήθος
ΑΛΛΙΩΣ
ΓΡΑΨΕ "ΔΕΝ ΒΡΕΘΗΚΕ"
ΤΕΛΟΣ_ΑΝ


ΕΔΩ όλο το διαγώνισμα.
Μερεντίτης Νικόλαος
Πληροφορικός

pgrontas

Παράθεση από: nikolasmer στις 14 Δεκ 2025, 07:19:27 ΜΜΣκεφτόμουν οτι μπορεί να βγεί εκτός πίνακα. Έχεις κάτι στο μυαλό σου Παναγιώτη;
Χωρίς όμως να μπλέξουμε με πλήρεις απτιμήσεις λογικών τελεστών και τα ρέστα.

Σκεφτόμουν πάνω κάτω αυτό που προτάθηκε, με τη διαφορά ότι θα έβαζα την συνθήκη Α[ι] = key σε εμφωλευμένη όσο αντί για το ΑΝ.
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson