Το Στέκι των Πληροφορικών

Γενικό Λύκειο => Μονοδιάστατοι πίνακες => Γ΄ Λυκείου => Εισαγωγή στοιχείων, εμφάνιση και υπολογισμοί => Μήνυμα ξεκίνησε από: nikolasmer στις 22 Φεβ 2014, 11:17:11 ΠΜ

Τίτλος: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: nikolasmer στις 22 Φεβ 2014, 11:17:11 ΠΜ
Μπορεί να δημιουργηθεί τμήμα κώδικα που να δέχεται έναν πίνακα Ν θέσεων, με εισαγόμενες τιμές 0 και 1 σε ανακατωμένες θέσεις και με ένα πέρασμα των στοιχείων του πίνακα να τοποθετούνται τα 0 στις περιττές θέσεις και οι άσσοι στις άρτιες θέσεις του πίνακα;
Αν τελειώσουν οι άσσοι ή τα μηδενικά, από εκεί και έπειτα να εισάγονται μόνο οι τιμές που περισσεύουν;
Υπάρχει αυτή η δυνατότητα;
Για παράδειγμα έστω τα στοιχεία
01100001000100101010
σε πίνακα 15 θέσεων.
Με μια προσπέλαση η τελική κατάσταση των στοιχείων να είναι
01010101010101000000
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: petrosp13 στις 22 Φεβ 2014, 12:15:08 ΜΜ
Με μια πρόχειρη ματιά

Για i από 1 μέχρι Ν-1
    Αν (Α[ι]=imod2) τότε
         βρέθηκε <-- ψευδής
         κ <-- i + 1
         Όσο (κ <= Ν) και (βρέθηκε=ψευδής) επανάλαβε
               Αν (Α[k] <> A(i)) και (Α[k] = kmod2) τότε
                     temp <-- A[k]
                     A[k] <-- A(i)
                     A(i) <-- temp
                     βρέθηκε <-- αληθής
                Αλλιώς
                     κ <-- κ+1
                Τέλος_Αν
        Τέλος_Επανάληψης
Τέλος_Επανάληψης

Δεν το έλεγξα, στα γρήγορα γιατί είμαι από κινητό
               
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: apoldem στις 22 Φεβ 2014, 12:34:38 ΜΜ
1) Μετράς πόσα είναι τα 0 (έστω κ) και πόσα τα 1 (έστω λ)
2) Αν κ<λ τότε γεμίζεις τις πρώτες κ περιττές θέσεις με 0, αλλιώς τις πρώτες λ άρτιες θέσεις με 1 (εδώ πιθανόν να μπορεί να γραφεί ένας όμορφος κώδικας που να μην επαναλαμβάνει τα ίδια πράγματα για 0 και 1, ίσως με χρήση διαδικασίας)
3) Ότι απέμεινε το γεμίζεις με το άλλο ψηφίο που δεν χρησιμοποιήθηκε στο προηγούμενο βήμα.

Γενικά, κάπως δύσκολο το βρίσκω για θέμα.
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: evry στις 22 Φεβ 2014, 03:41:56 ΜΜ
Προφανώς όταν λέει με ένα πέρασμα εννοεί αλγόριθμο να έχει τουλάχιστον πολυπλοκότητα Ο(Ν), άρα αλγόριθμοι με Ο(Ν^2) δεν μπορούν να γίνουν αποδεκτοί.
Το θέμα είναι αν εννοεί και μόνο ένα πέρασμα από κάθε στοιχείο, δηλαδή δεν του αρκεί το Ο(Ν) αλλά θέλει και ένα μόνο πέρασμα από κάθε στοιχείο.
(Προσοχή!!! Μπορεί να γίνει με μια επανάληψη αλλά να μην είναι ουσιαστικά ένα πέρασμα)

Παρακάτω δίνω έναν αλγόριθμο ο οποίος  είναι ότι πιο γρήγορο έχω σκεφτεί μέχρι στιγμής, μετράει πόσα είναι τα 0,1 και τα βάζει στον πίνακα,
αλλά δεν χρησιμοποιώ καμία σύγκριση εντός επανάληψης και από εκεί και πέρα έχει μόνο προσθέσεις.
Το μόνο πρόβλημα είναι ότι δεν τα κάνω όλα σε ένα πέρασμα αλλά σε 2 (δεν λέω σε τρία γιατί τα 2 παρακάτω περάσματα γίνονται σε ξεχωριστά στοιχεία του πίνακα άρα δεν μπορούν να θεωρούν ως 2 περάσματα)

Κώδικας (pascal) [Επιλογή]

μ[0] <-- μ[1] <-- 0
Για ι από 1 μέχρι Ν
       μ[Α[ι]] <-- μ[Α[ι]] + 1
Τέλος_Επανάληψης

Αν μ[0]<μ[1] Τότε
   τιμή <-- 0
αλλιώς
   τιμή <-- 1

κ <-- 1 + τιμή
Για ι από 1 μέχρι μ[τιμή]
     Α[κ] <-- τιμή
     κ <-- κ + 2   
Τέλος_Επανάληψης

θέση <-- κ
τιμή <-- 1 - τιμή
Για κ από θέση μέχρι Ν με βήμα 2
     Α[κ] <-- τιμή
Τέλος_Επανάληψης

κ <-- 1+τιμή
Για ι από 1 μέχρι Ν με βήμα 2
     Α[κ] <-- τιμή
     κ <-- κ + 2   
Τέλος_Επανάληψης
         

Δίνω επίσης έναν αλγόριθμο που ναι μεν κάνει ένα πέρασμα αλλά δεν γεμίζει τον πίνακα από την αρχή. Αυτό που κάνει είναι να βάζει τα 0 και 1 στις σωστές θέσεις, αλλά αυτό δεν σημαίνει ότι θα είναι όλα στην αρχή του πίνακα. Και αυτό όμως είναι πολύ καλή άσκηση.
Εξασφαλίζει όμως ότι στο τέλος δεν θα υπάρχει κανένα 0 σε ζυγή θέση και κανένα 1 σε μονή.

Κώδικας (pascal) [Επιλογή]

odd <-- 1
even <-- 2
Οσο  odd<N και even<N Επανάλαβε
   Αν ( Α[odd]==1 και Α[even]==0 ) Τότε
        A[odd] <-- 0
        A[even] <-- 1
        odd <-- odd + 2
        even <-- even + 2
   Αλλιώς
         Αν A[odd]==0 Τότε odd <-- odd + 2
         Αν A[even]==1 Τότε even <-- even + 2
   Τέλος_αν
Τέλος_Επανάληψης


Το θέμα τώρα είναι πως θα μαζέψεις τα σωστά 0,1 στην αρχή του πίνακα.
Αυτό είναι πολύ καλή άσκηση που αξίζει να ασχοληθεί κανείς. Η ιδέα εδώ είναι η ίδια που ισχύει και για την παρακάτω άσκηση:
   Δεδομένου ενός πίνακα Α[Ν] που περιέχει μόνο 0 και 1 να διαχωρίσετε τα 0 από τα 1 έτσι ώστε όλα τα 0 να είναι πριν από όλα τα 1, με ένα μόνο πέρασμα
Την άσκηση αυτή μπορεί να την δείτε και με θετικούς και αρνητικούς αριθμούς. Το σκεπτικό είναι το ίδιο.
Μόνο που στην δική μας περίπτωση είναι πιο πολύπλοκο.
Το αφήνω μήπως θέλει να ασχοληθεί κανείς, γιατι έχει πολύ ενδιαφέρον
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: sstergou στις 23 Φεβ 2014, 05:43:16 ΜΜ
Παράθεση από: evry στις 22 Φεβ 2014, 03:41:56 ΜΜ
Δεδομένου ενός πίνακα Α[Ν] που περιέχει μόνο 0 και 1 να διαχωρίσετε τα 0 από τα 1 έτσι ώστε όλα τα 0 να είναι πριν από όλα τα 1, με ένα μόνο πέρασμα
Κώδικας (pseudoglossa) [Επιλογή]

i ← 1
j ← N
Όσο i < j επανάλαβε
Όσο Α[i] = 0 και i < j επανάλαβε
i ← i + 1
Τέλος_επανάληψης
Όσο Α[j] = 1 και i < j επανάλαβε
j ← j - 1
Τέλος_επανάληψης
Αντιμετάθεσε α[i], α[j]
τέλος_επανάληψης

Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: ssimaiof στις 23 Φεβ 2014, 10:44:53 ΜΜ
Δείτε μια ακόμη ιδέα. Δεν το έλεγξα διεξοδικά, αλλά πρέπει να δουλεύει !

Κώδικας [Επιλογή]

Αλγόριθμος ΜηδένΈνα
Δεδομένα // Ν, Α //
δ0 ← 0
δ1 ← 0
Για i από 1 μέχρι Ν
  Αν Α[i] = 0 τότε
    δ0 ← δ0 + 1
    Αν 2*δ0 - 1 < i τότε
      Αντιμετάθεσε Α[i], Α[2*δ0 - 1]
    Τέλος_αν
  αλλιώς
    δ1 ← δ1 + 1
    Αν 2*δ1 < i τότε
      Αντιμετάθεσε Α[i], Α[2*δ1]
    Τέλος_αν
  Τέλος_αν
Τέλος_επανάληψης
Για i από 1 μέχρι Ν
  Εμφάνισε Α[i], "  "
Τέλος_επανάληψης
Τέλος ΜηδένΈνα
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: sstergou στις 24 Φεβ 2014, 09:18:55 ΠΜ
Φοβερή λύση, συγχαρητήρια!
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: evry στις 24 Φεβ 2014, 11:47:53 ΠΜ
Πράγματι φοβερή λύση.
Η χρήση του Αντιμετάθεσε σου εξασφαλίζει ότι δεν χάνεται πληροφορία.
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: apoldem στις 25 Φεβ 2014, 08:06:58 ΠΜ
@ssimaiof, respect! ο κώδικας σου είναι απ' αυτούς που λες, μα πως το σκέφτηκε;

@nikolasmer, μόνος σου τις σκέφτεσαι αυτές τις ασκήσεις ή τις ξεσηκώνεις από  κάποιο βιβλίο;
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: nikolasmer στις 25 Φεβ 2014, 10:18:58 ΠΜ
Έχουμε κουβεντιάσει την άσκηση που μπήκε περισυνό θέμα Β με τις τιμές Αληθής και Ψευδής που έπρεπε να τις αναδιατάξεις χωρίς ταξινόμηση. Οπότε βλέπωντας και τις απαντήσεις των μαθητών σε ενα καλοκαιρινό thread, που έδωσαν στις πανελλήνιες, ήθελα να βάλω στα παιδιά κάτι πιο δύσκολο, για να ασχοληθούν, όχι με λογικές τιμές αλλά με 0 και 1. Δεν ήθελα να τους πάει κατευθείαν το μυαλό εκεί. Έτσι σκέφτηκα αν μπορεί να γίνει αυτή η ασκησούλα. Επίσης παρατήρησα, μετά απο πολύ ώρα σκέψης, ότι το μυαλουδάκι μου δεν μπορούσε να κατεβάσει τίποτα απολύτως οπότε την ανέβασα για να δώ αν μπορεί να λυθεί, με ενα προφανώς πέρασμα των στοιχείων.
Ήθελα να μπορεί να επεκταθεί και για λογικές τιμές η λύση της άσκησης φυσικά, πράγμα που νομίζω οτι η λύση του evry δεν το πετυχαίνει γιατί χρησιμοποιεί τα στοιχεία του πίνακα ως δείκτες.

Πραγματικά όλες οι παραπάνω λύσεις είναι φοβερές.

ΠαράθεσηΕπιτέλους ανακάλυψα οτι όλα τα πράγματα είχαν ονόματα. Μετά άρχισα να διερωτώμαι γιατί είχαν τα ονόματα που είχαν. Όταν τελικά εγκατέλειψα την προσπάθεια αυτή, τότε άρχισα να αναγνωρίζω τον κόσμο και να προσπαθώ να επικοινωνήσω με τους άλλους με τις λέξεις που άκουγα και είχα μάθει απλώς να ξεχωρίζω
Ιωάννης Κάβουρας

(Να είναι καλά εκεί που βρίσκεται. Τον ευχαριστώ)

Αφού με παίρνει μια ώρα να καταλάβω τον κάθε έναν από τους παραπάνω κώδικες, μάλλον  ακόμα βρίσκομαι στο στάδιο που ανακαλύπτω πως όλα τα πράγματα έχουν ονόματα. :-[
Τίτλος: Απ: Μονοδιάστατος με 0 σε άρτιες θέσεις και 1 σε περιττές
Αποστολή από: apoldem στις 25 Φεβ 2014, 02:01:16 ΜΜ
Ακριβώς αυτό είναι το ωραίο με την λύση του evry. Ότι χρησιμοποιεί την τιμή του πίνακα ως δείκτη και έτσι κάνει οικονομία σε δύο θέσεις μνήμης!(και από την μύγα ξύγκι). Τροποποιείται όμως πολύ εύκολα, και για την περίπτωση που δεν έχεις 0 και 1.