alogirithmic computation, Exercises of Computer science

its a document about the algorithmic computation of some algorithms

Typology: Exercises

2023/2024

Uploaded on 07/04/2024

vasilis-gionis
vasilis-gionis 🇬🇷

1 / 10

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
2
2ο ΦΥΛΛΑΔΙΟ ΑΛΓΟΡΙΘΜΩΝ
VASILEIOS GKIONIS
Ε19026
pf3
pf4
pf5
pf8
pf9
pfa

Partial preview of the text

Download alogirithmic computation and more Exercises Computer science in PDF only on Docsity!

VASILEIOS GKIONIS

Ε

Contents

  • Άσκηση
  • Άσκηση
  • Άσκηση
  • Άσκηση
  • Άσκηση
  • Άσκηση

(iv) 𝑇

𝑛

3

) + √𝑛 + log 𝑛

𝑛 + log 𝑛

1

2

) και για 𝜀 =

1

2

0 έχουμε ότι 𝑓

log

𝑏

𝑎−𝜀

log

3

3 −

1

2

= 𝑛

1

2

= √𝑛), άρα

είμαστε στην 1

η

περίπτωση του Master Theorem:

Αν 𝑓(𝑛) = 𝑂(𝑛

log

𝑏

𝑎−𝜀

) για κάποια σταθερά 𝜀 > 0 , τότε 𝑇(𝑛) = 𝛩(𝑛

log

𝑏

𝑎

Επομένως 𝑇(𝑛) = 𝛩(𝑛)

(v) 𝑇(𝑛) = 𝑇 (

4 𝑛

5

) + 𝑛 log 𝑛 + √

a = 1

μπορούμε να τροποποιήσουμε το 𝑏 =

5

4

𝑓(𝑛) = 𝑛 log 𝑛 + √

Η 𝑓(𝑛) = 𝑂(𝑛 log 𝑛) και 𝑛

log

𝑏

𝑎

log

𝑏

1

= 1 , άμα υπάρχει ε> 1 τέτοιο ώστε ο όρος 𝑛 log 𝑛 να είναι

σίγουρα μεγαλύτερος από το 𝑛

𝜀

για να μπορέσουμε να ισχυριστούμε ότι 𝑓

log 𝑏

𝑎+𝜀

𝜀

Για να μπορέσουμε όμως να πούμε ότι ισχύει η 3

η

περίπτωση του Master Theorem πρέπει να

αποδείξουμε ότι ισχυέι η ανισότητα 𝑎𝑓 (

𝑛

𝑏

4 𝑛

5

) log

≤ 𝑐(log 𝑛 + √

4 𝑛

5

) log

4 𝑛

5

≤ 𝑐 log 𝑛

Αν παραβλέψουμε τοιυς μικρούς όρους το n, η παραπάνω ανίσωση ισχυεί για 𝑐 < 1 , διότι ο όρος

log

4 𝑛

5

είναι όντως μικρότερος του log 𝑛 και το

4 𝑛

5

μικραίνει περισσότερο τον όρο.

Επομένως μπορούμε να πούμε ότι ισχύει η 3

η

περίπτωση του Master theorem:

Αν 𝑓

log 𝑏

𝑎+𝜀

) για κάποια σταθερά 𝜀 > 0 , και αν 𝑎𝑓 (

𝑛

𝑏

) ≤ 𝑐𝑓(𝑛) για κάποια σταθερά 𝑐 < 1

και για όλα τα επαρκώς μεγάλα 𝑛 τότε 𝑇(𝑛) = 𝛩(𝑓(𝑛)).

Άρα 𝑇(𝑛) = 𝛩(𝑛 log 𝑛).

(vi) 𝑇(𝑛) = 2 𝑇 (

𝑛

3

2 𝑛

3

Εδώ δεν μπορούμε να χρηαιμοποιήσουμε το Master Theorem λόγω των δύο όρων 𝑇(𝑛).

Για να βρούμε ένα στοιχείο που είναι "κορυφή" (δηλαδή δεν είναι μικρότερο από τα γειτονικά του

στοιχεία), μπορούμε να χρησιμοποιήσουμε την τεχνική διαίρει και βασίλευε. Η βασική ιδέα εδώ

είναι να βρούμε το μεσσαίο στοιχείο του πίνακα και να ελέγξουμε αν είναι «κορυφή» και αν δεν

είναι μπορούμε να αποφασίσουμε από ποια μεριά του πίνακα θα συνεχίσουμε την αναζήτηση.

Χωρίζουμε 4 περιπτώσεις επιτυχίας για το πρόβλημά μας:

  1. Το peak να είναι ακριβώς το μεσσαίο στοιχείο του πίνακα A[mid]
  2. Το αριστερά στοιχείο του μεσσαίου στοιχείου είναι μεγαλύτερο από αυτό, άρα το peak θα

βρίσκεται στην αριστερή μεριά του πίνακα

  1. Ίδιο με το 2. αλλά για το δεξί στοιχείο
  2. Ο πίνακας είναι μόνο μιας θέσης

Στις περιπτώσεις 2 και 3 ο αλγόριθμος θα υποδιπλασιάζει τον πίνακα και θα κάνει συγκρίσεις με

το mid του υποδιπλασιμένου πίνακα μέχρι να βρει το peak.

low= 0

high=n- 1

όσο low<=high επανάλαβε

Mid=low+(high-low)/2 #το low είναι η πρώτη θέση του πίνακα A[0] και το high είναι η

τελευταία A[n]

αν (mid==0 ή (arr[mid- 1 ] <=arr[mid] και arr[mid+1]<=arr[mid])) τότε

εμφάνισε mid

αλλιώς αν (arr[mid-1]>arr[mid]) τότε

high=mid- 1 #θέλουμε να χωρίσουμε τον πίνακα προς τα αριστερά, άρα το νέο δεξί

άκρο του νέου υποδιπλασιασμένου πίνακα είναι το αριστερό άκρο

του mid

αλλιώς

low=mid+1#θέλουμε να χωρίσουμε τον πίνακα προς τα δεξιά, άρα το νέο αριστερό

άκρο του νέου υποδιπλασιασμένου πίνακα είναι το αριστερό στοιχείο

του mid

τέλος αν

new_sum= 0

numbers=

flag=

i=

όσο (flag==0 ή i<=n-1) επανάλαβε

new_sum=new_sum+arr[i]

numbers++

i++

αν new_sum>=S τότε

flag=

τελος αν

τέλος επανάληψης

εμφάνισε numbers

Για να βρούμε ένα ελάχιστο συνδετικό δένδρο (MST) που περιέχει την ακμή e, μπορούμε να

χρησιμοποιήσουμε τον αλγόριθμο του Kruskal για την εύρεση του MST και να προσαρμόσουμε τον

αλγόριθμο ώστε να συμπεριλάβει υποχρεωτικά την ακμή e.

Χρησιμοποιούμε την ένωση-εύρεση για την διαχείρης των συνόλων των κορυφών και στη

συνέχεια θα προσθέσουμε την ακμή στο MST και έπειτα θα ενημερώσουμε το σύνολο των

κορυφών. Έπειτα ταξινομούμε όλες τις ακμές του γράφου σε αύξουσα σειρά ανάλογα με το βάρος

τους και τέλος κατασκευάζουμε το MST, εξετάζοτνας κάθε ακμή από την ταξινομημένη λίστα και

την προσθέτουμε (εφόσον δεν δημιουργεί κύκλο), χρησιμοποιώντας ένωση-εύρεση.

(θα χρησιμοποιήσουμε πάλι την ίδια ταξινόμηση απλά σε αύξουσα σειρά αντί για φθίνουσα όπως

στην άσκηση 4 οπότε για εξοικονόμηση χρόνου δε θα ξαναγράψω την λειτουργία της, αντί αυτού

θα την θεωρήσω ως συνάρτηση και θα την καλέσω)

δεδομένα: G γράφος με E ακμές, ακμή e

#ξεκινώντας αρχικοποιούμε τη ένωση-εύρεση

για κάθε κορυφή x στο V

κατασκευή συνόλου(x)

τέλος επανάληψης

#αρικοποίηση MST και προσθήκη της ακμής e

MST={e}

συνένωση(x,y)

#ταξινόμηση με τον τρόπο που προαναφέρθηκε

Ταξινόμηση(Ε, βάρος σε αύξουσα σειρά)

#κατασκευάζουμε το MST

για κάθε ακμή (x,y) στο Ε

αν εύρεση-συνόλου(x)!=εύρεση-συνόλου(y) τότε

MST = MST U {(x,y)} #ένωση

συνένωση(x,y)

τέλος αν

τέλος επανάληψης

εμφάνισε MST

καταφέραμε λοιπόν με την χρήση του αλγορίθμου του Kruskal

𝛽𝜄𝛽𝜆ί𝜊 𝜎𝜀𝜆ί𝛿𝛼 627

να

κατασκευάσουμε έναν αλγόριθμο πολυπλοκότητας 𝑂(E log 𝐸), όπου E το σύνολο των ακμών του

κόμβου σύμφωνα με τον Kruskal, για την εύρεση ενός MST δέντρο το οποίο περιέχει την ακμή e.

Ξεκινάμε με την δημιουργία του ενός πίνακα διαστάσεων n x n εν ονόματι path ο οποίος θα

χρησιμοποιηθεί για την αποθήκευση τουπλήθος των μονοπατιών από την θέση (1,1) στη θέση (i,j).

Και σε αυτό το πρόβλημα μπορούμε να διακρίνουμε 2 περιπτώσεις

  1. Αν arr[1][1]=0, τότε path[1][1]=1, αλλιώς path[1][1]=
  2. Για κάθε θέση i,j, αν arr[i][j]=0, τότε path[i][j] είναι το άθροισμα των path[i-1][j] και

path[i][j- 1 ]

για i από 0 μέχρι n

Καταφέραμε και φτιάξαμε έναν αλγόριθμο του οποίου η πολυπλοκότητα είναι 𝛰

2

λόγω του

διπλού βρόχου που διατρέχει κάθε θέση του πίνακα.