GVGD: Tr ng Ph c H i
Phân tích gi i thu t
2
N i dung
1 ánh giá gi i thu t
3 Quy t c xác đ nh đ ph c t p
4 ánh giá các c u trúc đi u khi n
2 ph c t p c a gi i thu t
ánh giá gi i thu t
M i bài toán có th có nhi u ph ng pháp (gi i
thu t) đ gi i quy t
ánh giá gi i thu t là vi c làm c n thi t đ l a
ch n gi i thu t t i u cho bài toán
Gi i thu t đ c đánh giá d a trên các tiêu chí
Trang 24
ánh giá gi i thu t
Tính đúng đ n c a gi i thu t có th đ c ch ng
minh b ng công c toán h c (s d ng b test ch
giúp phát hi n gi i thu t sai)
Gi i thu t đ n gi n d n đ n ch ng trình đ c cài
đ t d dàng (ti t ki m th i gian vi t mã l nh)
i v i ch ng trình c n x lý d li u l n thì th i
gian th c thi là tiêu chí đ c bi t quan tr ng
5
ánh giá gi i thu t
Tính hi u qu c a gi i thu t đ c đo l ng d a
vào t c đ th c thi khi đ c cài đ t trên máy tính
Th i gian th c thi ph thu c
Tr ng thái d li u
6
ánh giá gi i thu t
Th i gian th c thi đ c đánh giá d a trên s thao
tác s c p mà gi i thu t ph i th c hi n
Th i gian th c thi đ c bi u di n t ng đ i b ng
hàm T(N) v i N là kích th c c a d li u đ u vào
Trang 37
ánh giá gi i thu t
Xét ví d tính S = A[0] + A[1] + … + A[N-1]
for ( int i = 0; i < N; i++)
S = S + A[i];
Thao tác chính đ th c hi n tính S là phép c ng và phép
gán trong câu l nh S = S + A[i]
S l n th c hi n thao tác S = S + A[i] b ng s l n th c thi
vòng l p: N
V y th i gian th c hi n đo n ch ng trình T(N) = c*N,
trong đó c là m t h ng s
8
ánh giá gi i thu t
Xét đo n ch ng trình sau
for ( int i = 0; i < N; i++)
for ( int j = 0; j < N; j++)
if (max < A[i][j]) max = A[i][j];
gán
đi u ki n if (max <A[i][j])
V y th i gian th c hi n đo n ch ng trình theo s phép
gán là T(N) = c*N2, trong đó c là m t h ng s
N i dung
1 ánh giá gi i thu t
3 Quy t c xác đ nh đ ph c t p
4 ánh giá các c u trúc đi u khi n
2 ph c t p c a gi i thu t
Trang 410
ph c t p c a gi i thu t
Th i gian th c thi T(N) không th tính b ng th i
gian đ ng h nên không th d a vào s giây th c
hi n đ so sánh 2 gi i thu t
Ví d xét T 1 (N) = 100*N, T 2 (N) = N 2
Khi N đ l n (N > 100) thì T1(N) < T2(N) => th i gian th c
hi n T1 ít h n th i gian th c hi n T2
Ta nói th i gian th c hi n T1 t l thu n v i N và th i gian
th c hi n T2 t l thu n v i N2
Cách đánh giá th i gian th c hi n nh trên g i là
đánh giá đ ph c t p c a gi i thu t
11
ph c t p c a gi i thu t
Xét gi i thu t t ng quát v i N là kích th c c a bài
toán, T(N) là th i gian th c thi v i kích th c N
s d ng c và N0 sao cho T(N) ≤ c*f(N) N ≥ N0
Kí hi u đ ph c t p c a gi i thu t T(N) = O(f(N))
12
ph c t p c a gi i thu t
Ví d tính đ ph c t p c a T(N) = (N + 1) 2
Ch n c = 4, N0 = 1 ta có (N + 1)2 ≤ c*N2, N ≥ N0
V y đ ph c t p c a hàm th i gian T(N) = O(N2)
Ví d tính đ ph c t p c a T(N) = 3*N 3 + 2*N 2
Ch n c = 5, N0 = 1 ta có 3*N3 + 2*N2 ≤ c*N3, N ≥ N0
V y đ ph c t p c a hàm th i gian T(N) = O(N3)
Trang 513
ph c t p c a gi i thu t
Các tr ng h p đánh giá đ ph c t p gi i thu t
Tr ng h p t t nh t: s thao tác s c p ít nh t mà gi i
thu t th c hi n trên các b d li u cùng c p
Tr ng h p x u nh t: s thao tác s c p nhi u nh t mà
gi i thu t th c hi n trên các b d li u cùng c p
thu t th c hi n trên các b d li u cùng c p
Vi c tính toán hàm th i gian trong tr ng h p
trung bình khá khó kh n nên đ ph c t p đ c
đánh giá trong tr ng h p x u nh t
14
ph c t p c a gi i thu t
Ví d : xét đo n ch ng trình sau
for ( int i = 0; i < n - 1; i++)
for ( int j = i + 1; j < n; j++)
if (A[i] > A[j])
int t = A[i];
A[i] = A[j];
A[j] = t;
}
Các thao tác s c p: phép so sánh, phép gán
ph c t p c a gi i thu t
Phân tích phép so sánh if (A[i] > A[j])
T(N) = O(N2)
Trang 616
ph c t p c a gi i thu t
Phân tích phép gán
Vi c th c hi n ph thu c đi u ki n if (A[i] > A[j])
Tr ng h p x u nh t: đi u ki n A[i] > A[j] luôn đúng, s
phép gán 3*((N – 1) + (N – 2) + … + 1) = 3*N*(N – 1)/2
Tr ng h p t t nh t: đi u ki n A[i] > A[j] luôn sai, s phép
gán b ng 0
đo n ch ng trình là T(N) = O(N2)
17
N i dung
1 ánh giá gi i thu t
3 Quy t c xác đ nh đ ph c t p
4 ánh giá các c u trúc đi u khi n
2 ph c t p c a gi i thu t
18
Quy t c xác đ nh đ ph c t p
Vi c xác đ nh đ ph c t p c a m t gi i thu t theo
hàm th i gian có th là vô cùng ph c t p
Tuy nhiên m t s hàm th i gian có th xác đ nh đ
ph c t p theo m t s quy t c đ n gi n sau
Trang 719
Quy t c xác đ nh đ ph c t p
Quy t c b h ng s
T(N) = O(k*f(N)) v i k là m t h ng s d ng thì đ ph c
t p T(N) = O(f(N))
20
Quy t c xác đ nh đ ph c t p
Quy t c l y max
T(N) = O(f(N), g(N)) thì đ ph c t p là O(max{f(N), g(N)})
Quy t c xác đ nh đ ph c t p
Quy t c t ng
th i gian th c hi n T1(N) = O(f(N)) và T2(N) = O(g(N)) thì
T1(N) + T2(N) = O(f(N) + g(N))
t p g(N) N u th c hi n P1 r i sau đó th c hi n P2 thì đ
ph c t p c a c ch ng trình là f(N) + g(N)
Trang 822
Quy t c xác đ nh đ ph c t p
Quy t c nhân
N u th c hi n P trong th i gian K(N) v i K(N) = O(g(N)) thì
đ ph c t p s là O(g(N)* f(N))
23
Quy t c xác đ nh đ ph c t p
M t s tính ch t c a bi u th c đ ph c t p
P(N) là đa th c b c k thì O(P(N)) = O(Nk)
f(N) > 0 N, logaf(N) = logab*logbf(N) => O(logaf(N)) =
O(logbf(N)) ph c t p c a gi i thu t c p logarit c a f(N)
là O(logf(N))
Gi i thu t có đ ph c t p c p 2N, N!, NN là gi i thu t có đ
ph c t p hàm m
log2N < N < N.log2N < N2 < N3 < 2N < N! < NN v i N l n
24
N i dung
1 ánh giá gi i thu t
3 Quy t c xác đ nh đ ph c t p
4 ánh giá các c u trúc đi u khi n
2 ph c t p c a gi i thu t
Trang 925
ánh giá các c u trúc đi u khi n
L nh gán
<bi n> = <bi u th c>
Th i gian c a thao tác b ng th i gian th c hi n bi u th c
vd:
d = sqrt(b*b – 4*a*c): ph thu c hàm sqrt
a = sin(x): ph thu c hàm sin
26
ánh giá các c u trúc đi u khi n
L nh r nhánh
if (đi u ki n) //th i gian th c hi n T 1 (N)
L nh 1; //th i gian th c hi n T 2 (N)
T(N) = T1(N) + max(T2(N), T3(N))
ánh giá các c u trúc đi u khi n
L nh vòng l p:
câu l nh; //th i gian th c hi n T i (N)
Th i gian th c hi n:
X(N): s l n l p
Ti(N): th i gian th c hi n l n th i
T0(N): đi u ki n l p
thì ta ph i xét s l n l p trong tr ng h p x u nh t
Trang 1028
Bài t p
Tính th i gian th c hi n và đ ph c t p c a đo n
ch ng trình tính t ng n giá tr do ng i dùng
nh p vào t bàn phím
s = 0;
for ( int i = 0; i < n; i++)
{
cin>>x;
s = s + x;
}
29
Bài t p
Tính th i gian th c hi n và đ ph c t p c a đo n
ch ng trình tìm ma tr n tích c a A kích th c
NxK v i ma tr n B kích th c KxM
for ( int i = 0; i < N; i++)
for ( int j = 0; j < M; j++)
{
C[i][j] = 0;
for ( int p = 0; p < K; p++)
C[i][j] = C[i][j] + A[i][p]*B[p][j];
}
30
Bài t p
D a vào hàm th i gian c a gi i thu t đ đánh giá
đo n ch ng trình nào sau đây là t t h n đ gi i
bài toán tính v i N, k nguyên d ng Cho bi t
đ ph c t p c a các đo n ch ng trình
Trang 1131
Bài t p
Cách 1
{
int P = 1;
for ( int i = 1; i <= N; i++)
P = P*i;
}
int ToHop( int N, int k)
{
int N_GT = GiaiThua(N);
int k_GT = GiaiThua(k);
int N_k_GT = GiaiThua(N – k);
}
32
Bài t p
Cách 2
int ToHop( int N, int k)
{
int C = 1;
for ( int i = 1; i <= N; i++)
C = C * (N – i + 1)/i;
}
Bài t p
D a vào đ ph c t p c a gi i thu t đ đánh giá
đo n ch ng trình nào sau đây là t t h n đ gi i
bài toán tính giá tr bi u th c sau
Trang 1234
Bài t p
Cách 1
double Sum( int N)
{
for ( int i = 1; i <= N; i++)
{
int P = 1;
for ( int j = 1; j <= i; j++)
P = P*j;
S = S + ( double )1/P;
}
}
35
Bài t p
Cách 2
double Sum( int N)
{
for ( int i = 1; i <= N; i++)
{
P = P*i;
S = S + ( double )1/P;
}
}