Κατ οίκον Εργασία 4 Σκελετοί Λύσεων

Σχετικά έγγραφα
Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Κατ οίκον Εργασία 5 Σκελετοί Λύσεων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΠΛ 231 Δοµές Δεδοµένων και Αλγόριθµοι 11-1

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Διάλεξη 21: Γράφοι II - Τοπολογική Ταξινόμηση

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Κατ οίκον Εργασία 3 Σκελετοί Λύσεων

Βραχύτερα Μονοπάτια σε Γράφους (CLR, κεφάλαιο 25)

Ελάχιστα Γεννητορικά ένδρα

Κατ οίκον Εργασία 4 Σκελετοί Λύσεων

Διδάσκων: Παναγιώτης Ανδρέου

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Δένδρα. Μαθηματικά (συνδυαστικά) αντικείμενα. Έχουν κεντρικό ρόλο στην επιστήμη των υπολογιστών :

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Φροντιστήριο 4 Σκελετοί Λύσεων

Γράφοι (συνέχεια) Ο αλγόριθµος Dijkstra για εύρεση βραχυτέρων µονοπατιών Ta µονοπάτια Euler

Φροντιστήριο 4 Σκελετοί Λύσεων

Εργασία 3 Σκελετοί Λύσεων

Αναδροµή. Σε αυτήν την (βοηθητική) ενότητα θα µελετηθούν τα εξής : Η έννοια της αναδροµής Υλοποίηση και αποδοτικότητα Αφαίρεση της αναδροµής

Αλγόριθμοι Γραφημάτων

Διδάσκων: Παναγιώτης Ανδρέου

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 4 Σωροί, Γράφοι

Διάλεξη 21: Γράφοι IV - Βραχύτερα Μονοπάτια σε Γράφους

ΕΠΛ 231 Δομές Δεδομένων και Αλγόριθμοι 4-1

Διάλεξη 17: O Αλγόριθμος Ταξινόμησης HeapSort

Αλγόριθμοι και Πολυπλοκότητα

Σχεδίαση & Ανάλυση Αλγορίθμων

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΠΛ 231 οµές εδοµένων και Αλγόριθµοι Άννα Φιλίππου,

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Υλοποίηση Λιστών. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα:

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΑΣΚΗΣΗ 3 Δέντρα

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Διδάσκων: Παναγιώτης Ανδρέου

Ενότητες 3 & 4: Δένδρα, Σύνολα & Λεξικά Ασκήσεις και Λύσεις

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

HY380 Αλγόριθμοι και πολυπλοκότητα Hard Problems

Αλγόριθμοι Γραφημάτων

Διάλεξη 11: Φροντιστήριο για Στοίβες. Διδάσκων: Παναγιώτης Ανδρέου. ΕΠΛ035 Δομές Δεδομένων και Αλγόριθμοι για Ηλ. Μηχ. Και Μηχ. Υπολ.

Διερεύνηση γραφήματος

Διάλεξη 15: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Ενότητα 7 Ουρές Προτεραιότητας

Διάλεξη 18: Γράφοι I - Εισαγωγή

Αλγόριθμοι Γραφημάτων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y»

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

Εργαστήριο 8: Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ

ΑΣΚΗΣΗ 1 Για τις ερωτήσεις 1-4 θεωρήσατε τον ακόλουθο γράφο. Ποιές από τις παρακάτω προτάσεις αληθεύουν και ποιές όχι;

Κατ οίκον Εργασία 2 Σκελετοί Λύσεων

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

Διάλεξη 12: Λίστες Υλοποίηση & Εφαρμογές. Διδάσκων: Παναγιώτης Ανδρέου

Δομές δεδομένων (2) Αλγόριθμοι

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

ΟΙΚΟΝΟΜΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΑΘΗΝΩΝ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. Δοµές Δεδοµένων

Εργαστήριο 5 Αναδρομική διεργασία εισαγωγής καινούριου κόμβου σε ΔΔΑ με αλφαβητική σειρά

Ενότητα 2: Στοίβες Ουρές - Λίστες Ασκήσεις και Λύσεις

Ειδικά θέματα Αλγορίθμων και Δομών Δεδομένων (ΠΛΕ073) Απαντήσεις 1 ου Σετ Ασκήσεων

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

3η Σειρά Γραπτών Ασκήσεων

Αλγόριθµοι και Πολυπλοκότητα

Ενότητα 9 Ξένα Σύνολα που υποστηρίζουν τη λειτουργία της Ένωσης (Union-Find)

Δομές Δεδομένων. Ενότητα 7: Άλλες παραλλαγές Συνδεδεμένων Λιστών-Παράσταση Αραιού Πολυωνύμου με Συνδεδεμένη Λίστα. Καθηγήτρια Μαρία Σατρατζέμη

Κατ οίκον Εργασία 1 Σκελετοί Λύσεων

ΕΙΣΑΓΩΓΗ ΣΤΗΝ ΑΝΑΛΥΣΗ ΑΛΓΟΡΙΘΜΩΝ

Ουρά Προτεραιότητας (priority queue)

Θεωρία Υπολογισμού και Πολυπλοκότητα Μαθηματικό Υπόβαθρο

Προγραμματισμός ΙΙ Εαρινό εξάμηνο Εργασία 3 Βιβλιοθήκη για λειτουργίες σε γράφους

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

Αλγόριθμοι Γραφημάτων

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

Δομές Δεδομένων (Data Structures)

Δοµές Δεδοµένων. 11η Διάλεξη Ταξινόµηση Quicksort και Ιδιότητες Δέντρων. Ε. Μαρκάκης

Ελάχιστο Γεννητικό Δένδρο. Παράδειγμα - Αλγόριθμος Prim. Γιατί δουλεύουν αυτοί οι αλγόριθμοι;

Κατ οίκον Εργασία 1 Σκελετοί Λύσεων

Θεωρία Γραφημάτων 5η Διάλεξη

Εργαστήριο 4: Υλοποίηση Αφηρημένου Τύπου Δεδομένων: Ταξινομημένη Λίστα

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

3η Σειρά Γραπτών Ασκήσεων

ΠΛΗ111. Ανοιξη Μάθηµα 10 ο. Γράφοι. Τµήµα Ηλεκτρονικών Μηχανικών και Μηχανικών Υπολογιστών Πολυτεχνείο Κρήτης

Βασικές Δομές Δεδομένων

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΕΠΛ 035: οµές εδοµένων και Αλγόριθµοι για Ηλεκτρολόγους Μηχανικούς και Μηχανικούς Υπολογιστών

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές δεδομένων. Ενότητα 7η: Ουρές Προτεραιότητας Παναγιώτα Φατούρου Τμήμα Επιστήμης Υπολογιστών

Heapsort Using Multiple Heaps

Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής και Τηλεπικοινωνιών. Παραλληλία. Κ. Χαλάτσης, Εισαγωγή στην Επιστήµη της Πληροφορικής και των Τηλεπικοινωνιών

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 22: Δυαδικά Δέντρα. Διδάσκων: Παναγιώτης Ανδρέου

Κεφάλαιο 11 Ένωση Ξένων Συνόλων

Διδάσκων: Παναγιώτης Ανδρέου

Ενότητα 7 Ουρές Προτεραιότητας

Στοίβες με Δυναμική Δέσμευση Μνήμης

Προγραμματισμός Αναδρομή

Διάλεξη 29: Γράφοι. Διδάσκων: Παναγιώτης Ανδρέου

Ταξινόμηση κάδου και ταξινόμηση Ρίζας Bucket-Sort και Radix-Sort

Transcript:

Κατ οίκον Εργασία Σκελετοί Λύσεων Άσκηση Αναδρομική διαδικασία Η αναδρομική διαδικασία RecIsheap παίρνει ως παραμέτρους τον πίνακα, το μέγεθός του καθώς και το στοιχείο το οποίο θα τύχει επεξεργασίας. Σε μια αναδρομική κλήση εξετάζουμε τα παιδιά ενός συγκεκριμένου κόμβου και καλούμε αναδρομικά για τον επόμενο κόμβο. Για την εξεύρεση της λύσης η συνάρτηση καλείται ως RecIsheap(array, size, ) για να ξεκινήσουμε την επεξεργασία από το πρώτο στοιχείο. int RecIsheap (int array, int size, int element){ if (element > float(size/)) return ; first_child = *element; second_child = *element+; //Μόνο οι size/ κόμβοι έχουν παιδιά // Ο κόμβος δεν έχει παιδιά // Το πρώτο παιδί του κόμβου // Το δεύτερο παιδί του κόμβου if (second_child <= size) // Έχει δύο παιδιά if (array[element] > array[first_child] array[element] > array[second_child]) return && RecIsheap(array, size, element++) if (array[element] > array[first_child]) return Μη αναδρομική διαδικασία Για κάθε κόμβο του σωρού εξετάζουμε τα παιδιά του. Αν κάποιο από αυτά είναι μικρότερο από αυτό, τότε παραβιάζεται η συνθήκη και επιστρέφουμε. Αν επεξεργαστούμε τον πίνακα χωρίς παραβίαση της συνθήκης, τότε συμπεραίνουμε ότι ο πίνακας είναι σωρός και επιστρέφουμε. int IsHeap (int array, int size){ for(i=; i<float(size/); i++) { if (*i+ <= A->size) // Υπάρχουν δύο παιδιά if (A->array[i] > A->array[*i] A->array[i] > A->array[*i+]) if (A->array[i] > A->array[*i]) return

Άσκηση (α) Έστω γράφος G=(V,E) και Ε υποσύνολο του Ε που συνδέει όλες τις κορυφές του V και έχει το ελάχιστο βάρος. Θέλουμε να δείξουμε ότι, αν τα βάρη των ακμών του Ε είναι θετικά, οι ακμές Ε σχηματίζουν ένα δένδρο. Ας υποθέσουμε, για να φθάσουμε σε αντίφαση ότι το Ε δεν είναι δένδρο, δηλαδή περιέχει κάποιο κύκλο. Έστω (u,v) κάποια ακμή του κύκλου. Παρατηρούμε ότι εκτός από την ακμή (u,v) υπάρχει και άλλο μονοπάτι που ενώνει τις δύο κορυφές u και v, δηλαδή το υπόλοιπο του κύκλου που περιέχει την ακμή, έστω path. Θεωρούμε το σύνολο Ε {(u,v). To σύνολο αυτό έχει προφανώς μικρότερο βάρος από το βάρος του Ε. Συγκεκριμένα, αν γράψουμε W(Ε) και W(E ) για το άθροισμα των βαρών των συνόλων Ε και Ε αντίστοιχα, παρατηρούμε ότι W(E ) = W(E) w(u,v) και αφού το βάρος όλων των ακμών είναι θετικό w(u,v) > και W(E ) < W(E ). Επίσης το σύνολο Ε {(u,v) συνδέει όλους τους κόμβους του γράφου: Για οποιοδήποτε ζεύγος κορυφών a και b αφού συνδέονται από τις ακμές Ε υπάρχει μονοπάτι που τις συνδέει. Αν το μονοπάτι αυτό δεν περιέχει την ακμή οποιοδήποτε (u,v) τότε προφανώς οι δύο κορυφές συνδέονται και μέσω τον ακμών Ε {(u,v), διαφορετικά, αν περιέχει τη συγκεκριμένη ακμή, τότε η ακμή αυτή μπορεί να αντικατασταθεί από το μονοπάτι path. Το καινούριο μονοπάτι εξακολουθεί να συνδέει τις δύο κορυφές και επιπλέον περιέχει ακμές μόνο από το σύνολο Ε {(u,v). Κατά συνέπεια το Ε {(u,v) είναι ένα σύνολο ακμών που συνδέει όλους τους κόμβους και έχει μικρότερο βάρος από το Ε Το πιο πάνω μας οδηγεί σε αντίφαση στην υπόθεση ότι το σύνολο E είναι σύνολο ακμών που συνδέει όλες τις κορυφές και έχει το ελάχιστο βάρος. (β) Το σύνολο ακμών που συνδέει όλες τις κορυφές με το ελάχιστο βάρος είναι το {(Α,Β), (Β,Γ), (Γ,Α) και προφανώς δεν είναι δένδρο. (γ) Η ιδέα αυτή μας οδηγεί στον πιο κάτω αλγόριθμο. Ξεκίνα με το κενό σύνολο ακμών Τ και κατασκεύασε ένα γεννητορικό δένδρο ως εξής.. Επέλεξε την ακμή με τον μικρότερο βάρος από αυτές που δεν έχεις επεξεργαστεί.. Εφόσον η ακμή αυτή δεν δημιουργεί κύκλο στο σύνολο Τ τότε πρόσθεσέ την σε αυτό. Διαφορετικά επανέλαβε από το βήμα και συνέχισε μέχρι να επιλέξεις V - ακμές. Spanning_Tree(graph G){ buildheap(η); (που περιέχει όλες τις ακμές του G) i = ; T = ; while (i < V -){ (u,v) = DeleteMin(H); if T {(u,v) does not contain a cycle i++; T = T {(u,v);

Άσκηση () Το πρόβλημα μπορεί να μοντελοποιηθεί ως πρόβλημα γράφων ως εξής: Θεωρήστε τον γράφο με βάρη G=(V,E) όπου V = V V και V είναι το σύνολο των εργασιών τύπου OR V είναι το σύνολο των εργασιών τύπου AND Ε={( i, j) αν η εργασία i αποτελεί προαπαιτούμενο της εργασίας j Η δομή που θα χρησιμοποιήσουμε για την υλοποίηση του γράφου είναι: struct node { struct graph { int vertex; struct node head[max]; struct node *next ; int type[max]; int size; Στον πίνακα type γράφουμε τον τύπο των διεργασιών σημειώνοντας type[i] = αν η εργασία είναι τύπου AND και type[i] = αν η εργασία είναι τύπου OR. () Η διαδικασία είναι μια παραλλαγή του αλγόριθμου τοπολογικής ταξινόμησης η οποία διακρίνει ανάμεσα στις διεργασίες τύπου OR και AND, και, σε περίπτωση που εκτελεστεί κάποιο προαπαιτούμενο μιας διεργασία τύπου OR, τότε την καθιστά έτοιμη για εκτέλεση τοποθετώντας την στην ουρά. TopSort(graph G){ MakeEmpty(Q); int I[G->size]; I[u] = ; p = G->head[u]; while (p!= NULL) I[p->vertex]++; if (I[u]==) Enqueue(u, Q); i = ; while (! IsEmpty(Q)) { u = Dequeue(Q); p = G->head[u]; while (p!= NULL) I[p->vertex]--; if (G->type[p->vertex] == OR I[p->vertex] == ) Enqueue(p->vertex, Q) if (i < V -) report The tasks contain a dependency cycle ;

(γ) Μετά από εκτύπωση των τεσσάρων πρώτων διεργασιών, παρατηρούμε ότι η εκτέλεση της e είναι αδύνατη λόγω ύπαρξης κύκλου ανάμεσα στις τελευταίες διεργασίες. Άσκηση Το πρόβλημα μπορεί να λυθεί με παραλλαγή του αλγόριθμου του Dijkstra. Αρχικά παραθέτουμε τις σχετικές δομές. struct AVLNode{ struct route{ string name; string street; int pointnum; int distance; struct node *leftchild; char direction; struct node *rightchild; string IdToLocation[N] // Τα ονόματα των σημείων struct AVLNode *LocationtoId // δένδρο με ζεύγη σημείο-αριθμός struct route Connect[N][N]; // Οι συνδέσεις ανάμεσα στα σημεία FindShortestPath(string A, string B){ heap Q; for all v V d[v]= ; P[v]= - ; Insert(Q, (v,d[v])); x = FindNum(A, LocationtoId); //Διάσχιση του AVL δέντρου και y = FindNum(B, LocationtoId); //επιστροφή του αριθμού της // τοποθεσίας βάση του ονόματος d[x]=; DecreaseKey(Q,x,); while (!IsEmpty(Q)){ u = DeleteMin(Q); if (u == y) break; for(i = ; i <= N; i++) if (Connect[u,i].direction!= # ) if d[i] > d[u] + Connect[u,i].direction d[i] = d[u] + Connect[u,i].direction; DecreaseKey(Q, i, d[i]); P[i] = u; MakeEmptyStack(S); while (y!= x) // Αποθήκευση του βραχύτερου μονοπατιού Push(S, y) // ανάποδα σε μια στοίβα y = P[y]; while(!isempty(s)) // εκτύπωση του μονοπατιού p = Pop(S); a = Connect[x,p]; print Από το σημείο IdtoLocation[x] οδήγησε προς την κατεύθυνση a.direction πάνω στον δρόμο a.street ; x = p;

Άσκηση (α) (β) Η εισαγωγή του δεν είναι εφικτή. (γ) Η εισαγωγή του δεν είναι εφικτή. (δ) Η λύση που αναφέρεται στον επανακατακερματισμό παραλείπεται.