Professional Documents
Culture Documents
Ορέστης Τελέλης
telelis@unipi.gr
• Διδάσκων:
▶ Ορέστης Τελέλης
▶ e-mail: telelis@unipi.gr
• Αίθουσα: 002
• Ιστοσελίδα μαθήματος:
https://aristarchus.ds.unipi.gr/courses/DS-COURSES-SEM113/
• Θέματα και υλικό σχετικά με το μάθημα
▶ ΔΙΑΛΕΞΕΙΣ
▶ ΑΝΑΚΟΙΝΩΣΕΙΣ
▶ ΕΚΦΩΝΗΣΕΙΣ ΕΡΓΑΣΙΩΝ
▶ ΠΑΡΑΔΟΣΗ ΕΡΓΑΣΙΩΝ
▶ ΒΟΗΘΗΤΙΚΟ ΥΛΙΚΟ
▶ …
Βαθμολόγηση ( Β ):
ΠΡΟΣΟΧΗ !!!
Οι εργασίες του μαθήματος παραδίδονται ΜΟΝΟ στην περίοδο της
διδασκαλίας του. ΟΧΙ το Σεπτέμβριο (ΟΧΙ τον Ιούνιο, αν υπάρξει εξέταση).
Αν δεν παραδοθούν, ο βαθμός τους εκλαμβάνεται ίσος με 0.
Ο. Τελέλης Δομές Δεδομένων 6 / 70
Εργαστήρια
• Προαιρετικά 3-4
▶ Ενίσχυση κατανόησης δομών και σχετικών αλγορίθμων.
▶ Για την εμπειρία υλοποίησης αλγοριθμικών κατασκευών.
▶ Σας μένει ο κώδικας που θα γράψουμε στα εργαστήρια.
Δομές Δεδομένων
• Διευθέτηση ή οργάνωση δεδομένων στη μνήμη (ή στο δίσκο).
• Πίνακες, Συνδεδεμένες Λίστες, Ουρές, Στοίβες.
• Δυαδικά Δέντρα, Σωροί.
• Πίνακες Κατακερματισμού, Γραφήματα.
Αλγόριθμοι
• Διαδικασίες εκτέλεσης συγκεκριμένης εργασίας.
• Χειρίζονται τα δεδομένα αποθηκευμένα σε δομές.
• Εισάγοντας, Διαγράφοντας, Αναζητώντας, Ταξινομώντας.
• Προγραμματιστικά Εργαλεία:
▶ Για τη διεκπεραίωση μιας πιο σύνθετης λειτουργίας
▶ Μοντελοποίηση πραγματικού κόσμου
▶ Παράδειγμα:
- Γραφήματα για αναπαράσταση δρομολογίων αεροπλάνων μεταξύ πόλεων
- Γραφήματα για αναπαράσταση σχέσεων σε ένα κοινωνικό δίκτυο
45 23 28 95 71 19 a b c
Πρόγραμμα (Υλοποίηση):
Τυπική περιγραφή αλγόριθμου σε μία γλώσσα προγραμματισμού.
Ροή Εργασίας:
1. Διατύπωση Προβλήματος.
2. Διατύπωση Αλγορίθμου Επίλυσης.
3. Ελεγχος Ορθότητας.
4. Ανάλυση Απόδοσης.
5. Καθορισμός Πόρων.
• Χρόνος εκτέλεσης.
▶ Ταχύτητα εκτέλεσης των λειτουργιών για την ολοκλήρωση υπολογισμών.
▶ Εξαρτάται από: αλγόριθμο, δομές, γλώσσα, μεταγλωττιστή/διερμηνευτή.
▶ Επίσης από: υλικό, λειτουργικό σύστημα, ταυτόχρονα εκτελούμενες
διεργασίες κ.λ.π.
η τάξη της f(n) είναι O( g(n) ) αν υπάρχουν σταθερές C και n0 , τέτοιες ώστε:
cg(n)
f (n)
n0
f = O(g)
H f (n) μεγαλώνει το πολύ τόσο γρήγορα όσο ένα σταθερό πολλαπλάσιο της
g(n), καθώς το n πηγαίνει στο άπειρο.
105
n! n
104 102
103
2n √
102 n
n2 101
log n
n log n
101 n log log n
log n
100 1
100 1
2 4 6 8 10
50 100 150 200
Πολυώνυμα:
f(n) = ap np + · · · + a1 n + a0 , για p ∈ N, =⇒ f(n) = O(np ).
}
f1 (n) = O( g1 (n) ) ( { })
=⇒ (f1 +f2 )(n) = O max g1 (n), g2 (n)
f2 (n) = O( g2 (n) )
}
f1 (n) = O( g(n) )
=⇒ (f1 + f2 )(n) = O( g(n) )
f2 (n) = O( g(n) )
}
f1 (n) = O( g1 (n) )
=⇒ (f1 · f2 )(n) = O( g1 (n)g2 (n) )
f2 (n) = O( g2 (n) )
Ανατρέξετε στην αντίστοιχη ενότητα των Διακριτών Μαθηματικών.
Παράδειγμα 2
i n t sum = 0 ;
for ( i = 0; i < n ; i ++)
for ( j = 0; j < n ; j ++)
sum + + ;
Παράδειγμα 3
i n t sum = 0 ;
f o r ( i = 1 ; i <= n ; i + + )
f o r ( j = 1 ; j <= i * i ; j + + )
sum + + ;
int k = 0;
for ( i n t i = 0; i < n ; i ++)
k += i ;
Ανάλυση
• H στοιχειώδης πράξη k+=i; αποτελεί ένα (1) βήμα (χρόνου O(1) ).
Ανάλυση
• Εξωτερικός Βρόχος:
∑ ( ) ( )
χρόνος εσωτερικού βρόχου = n× χρόνος εσωτερικού βρόχου
0⩽i<n
∑
• Εσωτερικός Βρόχος: 1=n
0⩽i<n
∑ n−1
n−1 ∑
• Ολικός χρόνος εκτέλεσης: 1 = n × n = O(n2 )
j=0 i=0
f o r ( i = 1 ; i <= n ; i + + )
f o r ( j = 1 ; j <= i * i ; j + + )
sum + + ;
Ανάλυση
n (
∑ )
• Εξωτερικός Βρόχος: χρόνος εσωτερικού βρόχου(i)
i=1
∑
i·i
• Εσωτερικός βρόχος: 1 = i2 .
j=1
∑
n ∑
i·i ∑
n
n(n + 1)(2n + 1)
• Συνολικά: 1= i2 = = O(n3 )
6
i=1 j=1 i=1
i n t sum = 0 ;
f o r ( i = 0 ; i <n ; i + + )
i f ( ( n mod 2 ) == 0 ) / / n even
f o r ( j = 0 ; j <n ; j + + )
sum + + ;
else / / n odd
sum−−;
Ανάλυση
1 Εξωτερικός βρόχος: n επαναλήψεις
Εξοδος: πίνακας n αριθμών όπου A[i] μέσος όρος των X[0], . . . , X[i].
int a = 0;
f o r ( i n t j = 0 ; j <= i ; j + + ) { a = a + X [ j ] ; }
A[ i ] = a /( i +1) ;
}
return A;
int s = 0;
for ( i n t i = 0; i < n ; i ++) {
s = s + X[ i ];
A[ i ] = s /( i +1) ;
}
return A;
Πολυπλοκότητα?
int [] x , y , z ;
String [] a;
x = new i n t [ 3 ] ;
y = x;
a = new S t r i n g [ 3 ] ;
x [1] = 2;
y [1] = 3;
a [1] = ” Hello ” ;
int [] q;
q = new i n t [ ] { 1 , 2 , 3 } ;
/ / S h o r t form f o r d e c l a r a t i o n s :
int [ ] r = {7 , 8 , 9};
0 1 2 3 4 5 6 7 8 9
37 22 99 42 11 58 67 71
bo o l e a n f i n d ( l o n g s e a r c h K e y ) {
f o r ( i n t j = 0 ; j < nElems ; j + + )
i f ( a [ j ] == s e a r c h K e y ) r e t u r n t r u e ;
return false ;
}
0 1 2 3 4 5 6 7 8 9
37 22 99 42 11 58 67 71 27 16
←− ←− ←− ←−
0 1 2 3 4 5 6 7 8 9
37 22 99 42 11 67 71 27 16 ⊗
0 1 2 3 4 5 6 7 8 9
37 22 99 42 11 58 67 71 27 16
0 1 2 3 4 5 6 7 8 9
37 22 99 42 11 16 67 71 27 ⊗
0 1 2 3 4 5 6 7 8 9
11 22 37 42 58 67 71 83 ⊗ ⊗
Είσοδος: 11 22 37 42 58 67 71 83
1η Επανάληψη: 11 22 37 42 58 67 71 83
2η Επανάληψη: 11 22 37 42 58 67 71 83
3η Επανάληψη: 11 22 37 42 58 67 71 83
Τερματισμός: 11 22 37 42 58 67 71 83
c l a s s MyArray {
private long [ ] a ; // r e f e r e n c e to a r r a y a
p r i v a t e i n t nElems ; / / number o f d a t a i t e m s
// . . . ... ... ... ... ... ... ... ...
p u b l i c boolean b i n a r y S e a r c h ( long searchKey ) {
i n t lowerBound = 0 ; // lower index
i n t upperBound = nElems − 1 ; / / upper i n d e x
int curIn ; // middle index
while ( true ) {
c u r I n = ( lowerBound + upperBound ) / 2 ;
i f ( a [ c u r I n ] == s e a r c h K e y ) r e t u r n t r u e ;
e l s e i f ( lowerBound > upperBound )
return false ;
else i f ( a [ curIn ] < searchKey )
lowerBound = c u r I n + 1 ;
e l s e upperBound = c u r I n − 1 ;
}
}
}
• Θέματα απόδοσης.
▶ Μη ταξινομημένοι πίνακες.
▶ Ταξινομημένοι πίνακες.
▶ Δίνεται απλώς μια θέση i του πίνακα (και όχι ένα στοιχείο/κλειδί).
1
▶ με πιθανότητα .
n!
2. επίστρεψε A
Πολυπλοκότητα: O(n).
1
Δίνει τυχαία μετάθεση των περιεχομένων του A, με πιθανότητα n! . Γιατί?
i m p o r t j a v a . u t i l . Random ;
/ / Random p o s i t i o n i n { i , i + 1 , . . . , n−1}
i n t pos = i + rndGen . n e x t I n t ( A . l e n g t h −i ) ;
/ / Swap
i n t tmp = A [ i ] ;
A [ i ] = A [ pos ] ;
A [ pos ] = tmp ;
}
}
• Η πιθανότητα του A[1] να έχει στην έξοδο την τιμή που παρατηρούμε,
είναι Pr( A[1] ) = n1 .
• Η πιθανότητα του A[2] να έχει στην έξοδο την τιμή που παρατηρούμε,
δεδομένου του A[1] είναι Pr( A[2] | A[1] ) = n−1
1
.
• Η πιθανότητα του A[3] να έχει στην έξοδο την τιμή που παρατηρούμε,
δεδομένων των A[1], A[2], είναι Pr( A[3] | A[1] ∧ A[2] ) = n−2
1
.
...............
• Η πιθανότητα του A[i] να έχει στην έξοδο την τιμή που παρατηρούμε,
δεδομένων των A[1], A[2], …, A[i − 1] είναι:
( )
1
Pr A[i] A[1] ∧ A[2] ∧ · · · ∧ A[i − 1] =
n−i+1
( )
Pr( A ) = Pr A[1] ∧ A[2] ∧ · · · ∧ A[n]
( ) ( )
= Pr A[n] A[1] ∧ A[2] ∧ · · · ∧ A[n − 1] × Pr A[1] ∧ A[2] ∧ · · · ∧ A[n − 1]
( ) ( )
= Pr A[n] A[1] ∧ A[2] ∧ · · · ∧ A[n − 1] × Pr A[n − 1] A[1] ∧ A[2] ∧ · · · ∧ A[n − 2]
( )
× Pr A[1] ∧ A[2] ∧ · · · ∧ A[n − 2]
∏
n ( )
= Pr A[i] A[1] ∧ A[2] ∧ · · · ∧ A[i − 1]
i=1
1 1 1 1
=1× × × ··· × =
2 3 n n!