Δομές Δεδομένων και Αρχεία

Slides:



Advertisements
Παρόμοιες παρουσιάσεις
Αλγόριθμοι Ταξινόμησης
Advertisements

Διαίρει-και-Βασίλευε
Ποιότητα Λογισμικού Ενότητα 2: Παραμετρικοί έλεγχοι στο JUnit. Διδάσκων: Γεώργιος Κακαρόντζας, Καθηγητής Εφαρμογών. Τμήμα Μηχανικών Πληροφορικής, Τεχνολογικής.
Διδακτική Πληροφορικής
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 4: Συμβολοσειρές και Δομές Ελέγχου. Διδάσκων: Νικόλαος Θ Λιόλιος,
Δομές Δεδομένων και Αρχεία Ενότητα 7: Η δομή Στοίβα Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Δομές Δεδομένων και Αρχεία Ενότητα 10: Κυκλικά και Διπλά Συνδεδεμένη Λίστα Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I.
Δομές Δεδομένων και Αρχεία
Διδακτική Πληροφορικής Ενότητα 2: Η εξέλιξη των εργαλείων της Εκπαίδευσης. Διδάσκων: Γεώργιος Σούλτης, Επίκουρος Καθηγητής. Τμήμα Μηχανικών Πληροφορικής,
Δομές Δεδομένων και Αρχεία Ενότητα 4: Ευρετηριασμένα Αρχεία Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 6: Πίνακες και Παράμετροι στην main. Διδάσκων: Νικόλαος Θ Λιόλιος,
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 2: Μεταβλητές και Τύποι Δεδομένων. Διδάσκων: Νικόλαος Θ Λιόλιος,
Προγραμματισμός ΗΥ Ενότητα 6: Δισδιάστατοι πίνακες.
Δομές Δεδομένων και Αρχεία Ενότητα 8: Η δομή Ουρά Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Δομές Δεδομένων και Αρχεία Ενότητα 3: Αρχεία Δομών ΙΙ Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Αντικειμενοστραφής Προγραμματισμός Ι Ενότητα 10: Αφηρημένες τάξεις. Διδάσκων: Νικόλαος Θ Λιόλιος, Καθηγητής.
Ανθρωπολογία του Θεάτρου Ενότητα 4 η : Βασικές αρχές της Τέχνης του Ηθοποιού Γιώργος Σαμπατακάκης, M.Phil. (Καίμπρητζ) – Ph.D. (Λονδίνο) Τμήμα Θεατρικών.
1 Αντικειμενοστραφής Προγραμματισμός Ενότητα 12 : Επαναληπτικές Ασκήσεις (3/3) Ιωάννης Τσούλος Ελληνική Δημοκρατία Τεχνολογικό Εκπαιδευτικό Ίδρυμα Ηπείρου.
Τεχνολογία Ξύλου 1 Ενότητα 13: Ποιότητα και Πιστοποίηση Ξυλείας Διδάσκων: Δρ. Μιχάλης Σκαρβέλης, Αναπληρωτής Καθηγητής. Τμήμα Σχεδιασμού και Τεχνολογίας.
Τεχνολογικό Εκπαιδευτικό Ίδρυμα Θεσσαλίας Προγραμματισμός ΗΥ Ενότητα 4: Επαναληπτικές δομές. Διδάσκων: Ηλίας Κ Σάββας, Αναπληρωτής Καθηγητής. Τμήμα Μηχανικών.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Εκπαιδευτικά Προγράμματα με Χρήση Η/Υ ΙΙ Θέμα «παιγνίδια» (website address) Διδάσκουσα: Καθηγήτρια Τζένη.
Στοιχεία Μηχανών ΙΙ Ενότητα 3: Μετωπικοί τροχοί με κεκλιμένη οδόντωση – Κωνικοί οδοντωτοί τροχοί Δρ Α. Δ. Τσολάκης Τμήμα Μηχανολόγων Μηχανικών Τ.Ε. ΕΛΛΗΝΙΚΗ.
Προγραμματισμός κινητών συσκευών
Ενότητα 7 : Χρήση Πινάκων στο Ηλεκτρονικό εμπόριο (I) Ιωάννης Τσούλος
Αντικειμενοστραφής Προγραμματισμός Ι
Π Ι Ν Α Κ Ε Σ (arrays) ΤΑΞΙΝΟΜΗΣΗ
Προγραμματισμός κινητών συσκευών
Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου
Ενότητα 5 : Δομές Δεδομένων και αφηρημένοι
Χρονικός Προγραμματισμός Έργων (Εργαστήριο)
Προγραμματισμός ΗΥ Ενότητα 11: Header Files. Διδάσκων: Ηλίας Κ Σάββας,
Τεχνολογία και Προγραμματισμός Υπολογιστών
Χρονικός Προγραμματισμός Έργων (Εργαστήριο)
ΕνΟτητα # 6: Ms Word IΙΙ CLAUDIA BOETTCHER ΤμΗμα ΙστορΙαΣ
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(9)
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Ενότητα 9: Δείκτες και Δυναμική Διαχείριση Μνήμης.
Ανοιχτά Ακαδημαϊκά Μαθήματα στο ΤΕΙ Ηπείρου
ΦΡΟΝΤΙΣΤΗΡΙΟ: ΘΕΡΜΙΚΕΣ ΤΑΣΕΙΣ
ΕνΟτητα # 9: Ms Word VI CLAUDIA BOETTCHER ΤμΗμα ΙστορΙαΣ
Διαχείριση Κινδύνου Ενότητα 7: Παρακολούθηση Κινδύνων.
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Στατιστική Επιχειρήσεων
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(3)
Συστήματα Αυτομάτου Ελέγχου II
Χρονικός Προγραμματισμός Έργων (Εργαστήριο)
Ενότητα 2 : Το σύστημα βάσεων δεδομένων MySQL (II) Ιωάννης Τσούλος
ΜΗΧΑΝΙΚΗ ΤΩΝ ΥΛΙΚΩΝ ΦΡΟΝΤΙΣΤΗΡΙΟ: ΔΙΚΤΥΩΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Προγραμματισμός κινητών συσκευών
Ηλεκτρικές Μηχανές ΙΙ Ενότητα 5: Κανονικοποιημένες Καμπύλες
Αντικειμενοστραφής Προγραμματισμός ΙΙ
Αντικειμενοστραφής Προγραμματισμός ΙΙ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(7)
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(4)
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΕνΟτητα # 8: Ms Word V CLAUDIA BOETTCHER ΤμΗμα ΙστορΙαΣ
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(5)
ΠΑΡΟΥΣΙΑΣΕΙΣ ΜΑΘΗΜΑΤΟΣ ΠΙΘΑΝΟΤΗΤΕΣ(10)
ΑΝΑΓΝΩΡΙΣΗ ΠΡΟΤΥΠΩΝ ΝΕΥΡΩΝΙΚΑ ΔΙΚΤΥΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Προγραμματισμός ΗΥ Ενότητα 12: Αρχεία Δομών. Διδάσκων: Ηλίας Κ Σάββας,
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ
Μεταγράφημα παρουσίασης:

Δομές Δεδομένων και Αρχεία Ενότητα 6: Διαχείριση Πινάκων ΙΙ Ηλίας Κ. Σάββας, Αναπληρωτής Καθηγητής, Τμήμα Μηχανικών Πληροφορικής Τ.Ε., T.E.I. Θεσσαλίας

Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.

Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.

Σκοποί ενότητας Ο Αναγνώστης να μπορεί να: Σκοποί ενότητας Ο Αναγνώστης να μπορεί να: Διαχειρίζεται ειδικές κατηγορίες πινάκων όπως τριγωνικούς, συμμετρικούς, αραιούς κ.α. Διαχείριση Πινάκων ΙΙ

Περιεχόμενα ενότητας Πίνακες: Merge Sort, Τριγωνικοί, αραιοί, συμμετρικοί. Διαχείριση Πινάκων ΙΙ

Merge Sort Πολυπλοκότητα της τάξης Νlog(N)+Ν. Αναδρομική: Αντί να ταξινομήσουμε ολόκληρο τον πίνακα, τον διασπάμε σε δύο υποπίνακες Ν/2 μεγέθους και τους ταξινομούμε, Και αναδρομικά επαναλαμβάνουμε… Στην συνέχεια τους ενοποιούμε διατηρώντας την ταξινόμηση. Διαχείριση Πινάκων ΙΙ 6

Αλγόριθμος 1: Διαδικασία MergeSort(πίνακας Α, ακέραιος αρχή, ακέραιος τέλος) 2: Αρχή, 3: Εάν (αρχή < τέλος) Τότε, 4: μέση = (αρχή+τέλος) / 2, 5: MergeSort(A, αρχή, μέση) 6: MergeSort(A, μέση+1, τέλος) 7: Συνένωση(A, αρχή, μέση, τέλος) 8: Τέλος Εάν 9: Τέλος Διαδικασίας «MergeSort» Διαχείριση Πινάκων ΙΙ 7

Merge και Συνένωση (1 από 2) Διαχείριση Πινάκων ΙΙ 8

Merge και Συνένωση (2 από 2) Διαχείριση Πινάκων ΙΙ 9

Συνένωση; Είναι γνωστός ήδη ο μηχανισμός συνένωσης ταξινομημένων πινάκων (από το προηγούμενο μάθημα). Ναι αλλά συνένωση 2 διαφορετικών πινάκων προς ένα τρίτο…. Συνένωση 2 τμημάτων του ίδιου πίνακα στον ίδιο του τον εαυτό; Απλό: Χρήση βοηθητικού πίνακα!!! Διαχείριση Πινάκων ΙΙ 10

Άσκηση Να γίνει ένα πρόγραμμα το οποίο να εισάγει έναν μεγάλο πίνακα και στην συνέχεια να τον ταξινομεί με τις μεθόδους merge, bubble, και selection και να χρονομετρεί και συγκρίνει τους χρόνους που απαιτήθηκαν για τις ταξινομήσεις. Διαχείριση Πινάκων ΙΙ 11

Headers - Συναρτήσεις #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 4000 /* Μέγεθος πίνακα */ #define T 1000 /* Εύρος τυχαίων τιμών */ void synenosi(int *, int, int, int); void merge_sort(int *, int, int); void bubble_sort(int *, int); void selection_sort(int *, int ); Διαχείριση Πινάκων ΙΙ 12

Main: Δηλώσεις και Εισαγωγή Πίνακα int main() { time_t t1, t2, t3, t4; int P1[N], P2[N], P3[N]; int i, tyxaia_timi; int flag1 = 0, flag2 = 0; srand(time(NULL)); for (i=0; i<N; i++) { tyxaia_timi = rand() % T; P1[i] = tyxaia_timi; P2[i] = tyxaia_timi; P3[i] = tyxaia_timi; } Διαχείριση Πινάκων ΙΙ 13

Main: Ταξινομήσεις και χρονομέτρηση t1 = time(NULL); merge_sort(P1, 0, N-1); t2 = time(NULL); bubble_sort(P2, N); t3 = time(NULL); selection_sort(P3 ,N ); t4 = time(NULL); Διαχείριση Πινάκων ΙΙ 14

Main: Εκτύπωση και Σύγκριση for (i=0; i<N; i++) { if (i%10 == 0) printf("\n"); printf("%5d", P1[i]); } for (i=0; i<N; i++) if (P1[i] != P2[i]) flag1 = 1; if (P2[i] != P3[i]) flag2 = 1; Διαχείριση Πινάκων ΙΙ 15

Main: Έλεγχοι if (flag1 == 0) printf("\n\n\n Merge - Bubble: Και οι δύο ταξινομήσεις δημιούργησαν ταυτόσημους πίνακες \n"); else printf("\n\n\n Merge - Bubble: Oι δύο ταξινομήσεις ΔΕΝ δημιούργησαν ταυτόσημους πίνακες \n"); if (flag2 == 0) printf("\n\n\n Bubble - Selection: Και οι δύο ταξινομήσεις δημιούργησαν ταυτόσημους πίνακες \n"); printf("\n\n\n Bubble - Selection: Oι δύο ταξινομήσεις ΔΕΝ δημιούργησαν ταυτόσημους πίνακες \n"); Διαχείριση Πινάκων ΙΙ

Main: Χρονομετρήσεις printf("\n\n Για την merge sort χρειάστηκαν %5d secs", t2-t1); printf("\n Για την bubble sort χρειάστηκαν %5d secs", t3-t2); printf("\n Για την selection sort χρειάστηκαν %5d secs\n\n\n", t4-t3); return 0; } Διαχείριση Πινάκων ΙΙ

Συναρτήσεις: merge sort void merge_sort(int *A, int arxi, int telos) { int mesi; if ( arxi < telos ) { mesi = (arxi+telos) / 2; merge_sort(A, arxi, mesi); merge_sort(A, mesi+1, telos); synenosi(A, arxi, mesi, telos); } Διαχείριση Πινάκων ΙΙ 18

Συναρτήσεις: Συνένωση (1 από 2) void synenosi(int *A, int arxi, int mesi, int telos) { int B[telos-arxi+1]; /* Βοηθητικός πίνακας*/ int i=arxi, k=0; int j=mesi+1; while (i <= mesi && j <= telos) if (A[i] <= A[j]) B[k++] = A[i++]; else B[k++] = A[j++]; Διαχείριση Πινάκων ΙΙ

Συναρτήσεις: Συνένωση (2 από 2) while (i <= mesi) B[k++] = A[i++]; while (j <= telos) B[k++] = A[j++]; /* Μεταφορά του βοηθητικού πίνακα στο αντίστοιχο τμήμα το βασικού πίνακα */ for (i=arxi; i <= telos; i++) A[i] = B[i-arxi]; } Διαχείριση Πινάκων ΙΙ

Συναρτήσεις: bubble - selection Είναι ήδη γνωστές, Έχουν περιγραφεί στο προηγούμενο μάθημα! Εκτέλεση προγράμματος για N=1000, 2000, 3000, 4000, …, 20000 στοιχεία. Διαχείριση Πινάκων ΙΙ

Εκτέλεση προγράμματος σε περιβάλλον Windows με Ch (σε δευτερόλεπτα) Ν Bubble Sort Selection Sort Merge Sort 1000 1 2000 3 2 3000 6 4 4000 12 5000 18 10 6000 27 17 7000 40 23 8000 53 31 9000 68 39 10000 81 49 11000 102 58 12000 121 70 13000 138 84 14000 167 95 15000 188 110 16000 216 124 1 17000 247 143 18000 273 158 19000 301 177 20000 337 195 Διαχείριση Πινάκων ΙΙ

Συγκριτικό Γράφημα Διαχείριση Πινάκων ΙΙ

Bubble vs Selection Διαχείριση Πινάκων ΙΙ

Απορία; Αφού και οι δύο (bubble και selection) ανήκουν στην ίδια τάξη πολυπλοκότητας Ν2 τότε γιατί η selection είναι πολύ πιο γρήγορη από την bubble? Γιατί ενώ σε κάθε πέρασμα η selection κάνει αποκλειστικά μία αντιμετάθεση τιμών η bubble κάνει πολύ περισσότερες! (δείτε τους αντίστοιχους αλγόριθμους / προγράμματα του προηγούμενου μαθήματος). Διαχείριση Πινάκων ΙΙ

Bubble sort εναντίον selection Επιλογή της ελάχιστης τιμή του πίνακα, Αντιμετάθεση με την τιμή του πίνακα που έχει δείκτη όσο και το εκάστοτε «πέρασμα». Διαχείριση Πινάκων ΙΙ

Ειδικοί Πίνακες Τριγωνικοί, Αραιοί, Συμμετρικοί. Διαχείριση Πινάκων ΙΙ

Τριγωνικοί Πίνακες Ένας τετραγωνικός πίνακας ΑΝxN ονομάζεται τριγωνικός εάν όλα τα στοιχεία πάνω από την κύρια διαγώνιο είναι μηδενικά (κάτω τριγωνικός πίνακας) ή όλα τα στοιχεία κάτω από την κύρια διαγώνια είναι μηδενικά (πάνω τριγωνικός πίνακας). Διαχείριση Πινάκων ΙΙ

Παράδειγμα: Κάτω Τριγωνικός 33 44 99 12 78 56 222 34 22 67 65 54 Κύρια Διαγώνιος Διαχείριση Πινάκων ΙΙ

Γιατί πρέπει να τους μελετήσουμε; Γιατί έχει πάρα πολλά μηδενικά  Σπατάλη μνήμης… Λύση: Μεταφορά του σε ένα μονοδιάστατο χωρίς τα μηδενικά. Ναι, αλλά: Τι θα γίνει αν ζητηθεί ένα στοιχείο από την θέση του; Ποιο πρέπει να είναι το μέγεθος του πίνακα υποδοχής; Διαχείριση Πινάκων ΙΙ

Πλήθος μη Μηδενικών Στοιχείων Επομένως και του πίνακα υποδοχής: 1+2+3+…+Ν = Ν*(Ν+1) / 2 (<Ν2) Και αν ζητηθεί το στοιχείο i,j ενώ ο βασικός πίνακας θα έχει διαγραφεί; Διαχείριση Πινάκων ΙΙ

Ανάκτηση Στοιχείου από την Θέση του Έστω ότι ζητείται το στοιχείο i,j: Αφού ο πίνακας μεταφέρεται ανά γραμμή πρέπει να προσπελασθούν: 1+2+3+…+(i-1) στοιχεία των (i-1) προηγούμενων γραμμών, και j στοιχεία της i γραμμής, δηλαδή: (i-1)*i/2+j είναι ο δείκτης του πίνακα υποδοχής. Διαχείριση Πινάκων ΙΙ

Κάτω Τριγωνικός (πρόγραμμα) (1 από 4) #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 10 /* μέγεθος πίνακα */ #define M N*(N+1)/2 /* μέγεθος πίνακα υποδοχής */ #define T 1000 /* 0 --> T-1 εύρος τυχαίων τιμών */ int main() { int A[N][N], P[M]; int i, j, x, y, k=0; Διαχείριση Πινάκων ΙΙ

Κάτω Τριγωνικός (πρόγραμμα) (2 από 4) srand(time(NULL)); /* Εισαγωγή κάτω τριγωνικού πίνακα */ for (i=0; i<N; i++) for (j=0; j<N; j++) if (i>=j) A[i][j] = rand() % T; else A[i][j] = 0; /* Εκτύπωση πίνακα */ for (i=0; i<N; i++) { printf("\n"); printf("%10d", A[i][j]); } Διαχείριση Πινάκων ΙΙ

Κάτω Τριγωνικός (πρόγραμμα) (3 από 4) /* Μεταφορά του πίνακα σε μονοδιάστατο */ for (i=0; i<N; i++) for (j=0; j<=i; j++) P[k++] = A[i][j]; Διαχείριση Πινάκων ΙΙ

Κάτω Τριγωνικός (πρόγραμμα) (4 από 4) /* Αναζήτηση στοιχείου απο τους δείκτες του */ printf("Εισαγωγή δεικτών θέσης στοιχείου :"); scanf("%d%d", &x, &y); if (x < y) printf("\nTo στοιχείο είναι το: %5d", 0); else { k = x * (x+1) / 2 + y ; printf("\nTo στοιχείο είναι το: %5d", P[k]); } printf("\n\n"); return 0; Διαχείριση Πινάκων ΙΙ

Αραιοί Πίνακες Αραιός ονομάζεται ένας πίνακας ο οποίος περιέχει πάνω από 80% μηδενικά. Πάλι πρόβλημα περιττής χρήσης μνήμης. Μεταφορά του σε ένα πίνακα Νx3 όπου: Στην πρώτη στήλη αποθηκεύονται οι μη μηδενικές τιμές, Στην δεύτερη και τρίτη στήλη αποθηκεύονται οι δείκτες γραμμής και στήλης των μη μηδενικών στοιχείων. Διαχείριση Πινάκων ΙΙ

Παράδειγμα 89 33 37 89 2 33 1 37 3 Διαχείριση Πινάκων ΙΙ

Αραιοί Πίνακες: Πρόγραμμα (1 από 6) #include <stdio.h> #include <stdlib.h> int main() { int **A, **P, N, M; /* A = αραιός πίνακας, P = πίνακας υποδοχής ΝxM = διάσταση του A */ int i, j, k=0, counter=0; /* counter = πλήθος μη μηδενικών στοιχείων */ int g, s, vrethike=0; Διαχείριση Πινάκων ΙΙ

Αραιοί Πίνακες: Πρόγραμμα (2 από 6) printf("\nΕισαγωγή μεγέθους γραμμών στηλών αραιού πίνακα: "); scanf("%d%d", &N, &M); /* Δημιουργία και εισαγωγή αραιού πίνακα */ A = (int *) malloc(N * sizeof(int *)); for (i=0; i<N; i++) A[i] = (int *) malloc(M * sizeof(int)); if (! A) { printf("\n Πολύ μεγάλος πίνακας...\n\n"); return -1; } Διαχείριση Πινάκων ΙΙ

Αραιοί Πίνακες: Πρόγραμμα (3 από 6) for (i=0; i<N; i++) for (j=0; j<M; j++) { printf("\n Εισαγωγή %3d %3d στοιχείου :", i, j); scanf("%d", &A[i][j]); if (A[i][j] != 0) counter++; } /* Δημιουργία πίνακα μεταφοράς */ P = (int *) malloc( counter * sizeof(int *)); for (i=0; i<counter; i++) P[i] = malloc(3 * sizeof(int)); Διαχείριση Πινάκων ΙΙ

Αραιοί Πίνακες: Πρόγραμμα (4 από 6) /* Μεταφορά του αραιού πίνακα */ for (i=0; i<N; i++) for (j=0; j<M; j++) if (A[i][j] != 0) { P[k][0] = A[i][j]; P[k][1] = i; P[k++][2] = j; } /* Διαγραφή αραιού πίνακα */ free(A); Διαχείριση Πινάκων ΙΙ

Αραιοί Πίνακες: Πρόγραμμα (5 από 6) /* Αναζήτηση στοιχείου απο τους δείκτες του */ printf("\n\n Eισαγωγή των δεικτών του στοιχείου: "); scanf("%d%d", &g, &s); i=0; while (vrethike == 0 && g >= P[i][1]) { if (g == P[i][1]) if (s == P[i][2]) { vrethike = 1; printf("\n\n Το στοιχείο είναι το %d\n\n", P[i][0]); } i++; Διαχείριση Πινάκων ΙΙ

Αραιοί Πίνακες: Πρόγραμμα (6 από 6) if (vrethike == 0) printf("\n\n Το στοιχείο είναι το %d\n\n", 0); /* Εμφάνιση αραιού */ for (i=0; i<counter; i++) printf("%5d %5d %5d\n", P[i][0], P[i][1], P[i][2]); free(P); return 0; } Διαχείριση Πινάκων ΙΙ

Συμμετρικοί Πίνακες Συμμετρικός ονομάζεται ο τετραγωνικός πίνακας για τον οποίο ισχύει:Αi,j=Aj,i . Δηλαδή υπάρχει μία κατοπτρική συμμετρία με άξονα συμμετρίας την κύρια διαγώνιο. Διαχείριση Πινάκων ΙΙ

Παράδειγμα Διαχείριση: Ακριβώς όπως και οι κάτω τριγωνικοί πίνακες. Άσκηση στο εργαστήριο. 77 18 32 10 29 98 56 67 23 45 Διαχείριση Πινάκων ΙΙ

Τέλος Ενότητας