Bài giảng Phân tích thiết kế và đánh giá thuật toán (Phần 1)

Tóm tắt Bài giảng Phân tích thiết kế và đánh giá thuật toán (Phần 1): ... p ầ ủa y số a l mộ ủa mộ ụ . T m mộ m ả ộ a số l mộ m ù l mộ ả . 1 2 Đ c tr ng của thuật toán T ắ : T ầ p ả ảm ả mộ ả sa ự ố ớ ộ l ầ . Đ y l ư a ọ ố ớ mộ . T : ầ p ả ảm ả s sa mộ số ướ . T x : C ướ ủa p ả ượ p ụ y p ầm lẫ ố ớ ư ọ . T ả: ượ xem l ả ư ả ă ả y ả a a p p ...Cấu tr c dữ iệu – Data structure Niklaus Wirth, một l p trình viên và nhà khoa họ m y ư i phát minh ra ngôn ng l p Pas al ng nói một câu nói n i ti l ực l p : C ư (Programs) = C u trúc d li u (Data Structures) + Giải thu t (Algorithms). Câu nói này nói lên bản ch t của vi c l p l m một c u t...h họa cho thu t toán: void selection_sort(int a[], int n) { int i, j, vtmin; ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 17 for(i=0; i<n-1;i++) { vtmin = i; // m lư p ầ a .. -1] for(j=i+1;j<n;j++) if(a[j] < a[vtmin]) vtmin = j; swap(a[vtmin], a...

pdf39 trang | Chia sẻ: havih72 | Lượt xem: 302 | Lượt tải: 0download
Nội dung tài liệu Bài giảng Phân tích thiết kế và đánh giá thuật toán (Phần 1), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
mộ x N ý ự. Mộ 
 ả l y a ộ x ố ớ m ý ự ự m xem ý ự x 
 a ê lầ . K ướ ủa ả l ố l ố ớ ô 
 l p C l y ố ớ N. N ư s l ố l ộ 
p p ủa l  S*N S l số p ầ ủa ả s ụ . C ý 
l mộ ố ả y ớ ộ p p l  (S + N). 
Trong ộ l p mộ ự 1000000000 p p 
 ô a m ộ a . C a am ả ả sa êm: 
Độ phức tạp Giá tr N ớn nhất 
 (N) 100 000 000 
 (N log N) 40 000 000 
 (N2) 10 000 
 (N3) 500 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
8 
 (N4) 90 
 (2N) 20 
 (N!) 11 
Th i gian thực hiện của các thuật toán c độ phức tạp khác nhau 
O(Log(N)) 10-7 giây 
O(N) 10-6 giây 
O(N*Log(N)) 10-5 giây 
O(N2) 10-4 giây 
O(N6) 3 p 
O(2N) 1014 ăm 
O(N!) 10142 ăm 
Ch ý về phân tích thuật toán. 
T ô ư a y mộ ố ộ p p 
 a ủa l s ụ  . T y ê ê ự a ay ù ý p p 
 -O – ô lắm y ượ 
 ư . N ư ê l -O l ê ư a 
s m mô ê ố . 
Ví dụ: C mộ mả ượ sắp A. H y x xem mả A a p ầ 
 m ủa D ay ô . H y xem m ư sa : 
int j=0; 
for (int i=0; i<N; i++) 
{ 
while ( (j D) ) 
 j++; 
 if (A[i]-A[j] == D) 
return 1; 
} 
R ê l O(N2 : l p le ê ượ ọ N 
lầ m lầ ă lê ố a N lầ . N ư mộ p ố s a y 
 l O(N) ả a ự ủa l ă ô y 
 N lầ . 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
9 
N a l O(N2 a ẫ ư l 
 l O N a ưa a ượ ô x . 
4. Cấu tr c dữ iệu – Data structure 
Niklaus Wirth, một l p trình viên và nhà khoa họ m y ư i phát minh ra ngôn 
ng l p Pas al ng nói một câu nói n i ti l ực l p : C ư 
(Programs) = C u trúc d li u (Data Structures) + Giải thu t (Algorithms). Câu nói này nói 
lên bản ch t của vi c l p l m một c u trúc d li u phù hợp bi u di n d li u của 
bài toán và t x y ựng giải thu t phù hợp với c u trúc d li chọn. Ngày nay với sự 
phát tri n của các k thu t l p trình, câu nói của Wirth không hẳ y ối n a 
 ư ẫn phản ánh sự gắn k t và tầm quan trọng của các c u trúc d li u và giải thu t. 
C u trúc d li ược s dụ bi u di n d li u còn các giải thu ược s dụ thực 
hi n các thao tác trên các d li u của bài toán nh m hoàn thành các ch ă ủa ư 
trình 
 Các chiến c thiết kế thuật toán 
K ô mộ p ư p p p a x y ự ê 
 ả l . C a ọ m y ê ưa a 
 lượ ả p ụ l a . 
5.1. Duyệt toàn ộ (E hausted search) 
C lượ y ộ l lượ m m l p ê p ả ầ ê 
 ả y . T p ư p p y ộ a s xem x ả 
 ê ộ mộ ô a ủa xem p ả l m ủa 
 ay ô . P ư p p y yê ầ mộ m m a xem mộ ê 
 p ả l m ủa ay ô . M ù s p ư p p y ô 
p ả l ự l ô ả ố ớ m ướ p 
lớ . C p ư p p ả ă ủa p ư p p y ộ a s 
xem x ư 3. 
5.2. Đệ qui quay ui – Backtracking 
C lượ ay l l mộ lượ x y ự ựa ê a 
qui. N m ủa ượ mô a ướ mộ e m p ầ ủa e 
 m s mộ p s ướ 
 p ầ ủa m x m ủa . M ù ô p ả 
 p ụ s ả ựa ê p ư p p ay l 
l ô ẻ ẹp sự ắ ọ s m ma l . 
 3 Chia đ tr (Divide and Conquer) 
C lượ a l mộ lượ a ọ ả . 
 ư ủa lượ y e ả y l : ầ ả y mộ 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
10 
 a s a ả 
sa ợp m ủa l m ủa a ầ . 
T y ê ă y m a y ố: l m a 
mộ ợp lý l ượ ả y 
 a s p p y ố a l ợp l ả ủa 
 s ượ ự ư . 
C sắp x p ộ me e s sắp x p a s ộ l 
 a y ượ y ư 3 . 
Ví dụ[6, trang 57]: T ụ y a s xem x Na . 
Đ Na a ý ô sa : 
N N/2 2
N/2 2
1 nÕu N = 0
a (a ) nÕu N ch½n
a*(a ) nÕu N lÎ
T ô ê a s y a ủa ư sa : 
int power(int a, int n) 
{ 
 if(n==0) 
 return 1; 
 else{ 
 int t = power(a, n/2); 
 if(n%2==0) 
 return t*t; 
 else 
 return a*t*t; 
 } 
} 
 Chiến c tham am (Greedy) 
C lượ am lam l mộ lượ x y ự m m ố ư ụ ộ 
 ố ư m ượ m ố ư ụ ả ư 
 ợp . T ư ợp m l ả ủa lượ am lam ư 
 ă a ộ p p p . 
Ch ý: T mộ số x y ự ượ m ọ ợp 
 m ố ư . T am ă m ầ ớ m 
 ố ư . 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
11 
5.5. Qui hoạch động (Dynamic Programming) 
 ộ l lượ x y ự ả y ố ư 
 ủa ô p ả l m lớ / 
 l a ê ô ụ ượ . Trong 
 lượ ộ a s x y ự a ủa ố 
s l ả ựa ê s p lems ựa ê a . C 
qui ộ ư s ụ mả lư l m ủa 
 a p : m p p . 
 ài tập 
 ài tập 1: X y ự s ồ ả số a N y 
số a ượ a ư sa : 
 0 1 1 N N-1 + N- ớ N . 
 ài tập 2 X y ự s ồ ả : 
...x x x   ớ N số x ự m ă a N x p 
p m. 
 ài tập 3 T mộ ma a p MxN mộ p ầ a ượ ọ l m 
yê ựa ủa ma sa le p ư l p ầ ê p ầ lớ 
 ê ộ ủa ma . C ẳ a 0 l mộ p ầ yê ựa ma sa : 
1 2 3
4 5 6
7 8 9
 
 
 
  
H y ư m ả m yê ựa ủa mộ ma p 
p m ưa a ộ p p ủa . 
 ài tập C mộ ma ướ MxN ồm số yê ả số m 
 ư . H y ư m ma ủa ma sa p ầ 
 ma lớ ượ max m m s m pla ea . H y ưa a 
 ộ p p ủa s ụ . 
 ài tập V ư p số ủa mộ a ả s số l 
 yê a x l mộ số yê mộ x0. H y ủa a 
 e ô H e sa : 
N x an*x
n + an-1*x
n-1+ .. +a1*x + a0 
f(x) = a0 + x*(a1+x*(a2+x* .+x an-1+an*x Cô H e . 
 ài tập C 4 ộp ướ a m m ủa ộp ượ ô 1 
 4 m xa m . H y ưa a ả x p ộp 1 y sa 
 e p a ê x ố ướ sa ủa y ủ ả 4 m 
xa m . 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
12 
 ài tập 7 H y ư a ượ a ả số yê 
số a số. 
 ài tập 8 p ụ s a ả số yê ố N. 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
13 
CHƯƠNG II: S P XẾP (S RTING) VÀ T IẾ (SE RCHING) 
1. Bài toán s p ếp 
1 1 S p ếp trong (Interna Sorting) 
Sắp x p ược xem là một trong nh l ực nghiên c u c n của khoa học máy 
 . T ướ t toán chi ti t chúng ta cần nắm v ng một số khái ni m ản 
sau: 
+ Mộ ư ng (field) là mộ d li ẳng h ư ê i, số n tho i 
của mộ ư i ... 
+ Một bản ghi (record) là một t p hợp ư ng 
+ Một file là một t p hợp các bản ghi 
Sắp x p (sorting) là một quá trình x p t các bản ghi của một file theo một th tự nào 
 . V c x p y ược thực hi n dựa trên một hay nhi ư ô 
 y ược gọi là khóa xắp x p (key). Th tự của các bả ượ x nh dựa trên các khóa 
khác nhau và vi c sắp x p ố ược thực hi ối với m i khóa theo các th tự khác nhau. 
Chúng ta s t p trung vào các thu t toán xắp x p và giả s khóa ch gồm 1 ư ng duy nh t. 
Hầu h t các thu t toán xắp x p ược gọi là các thu t toán xắp x p so sánh: chúng s dụng hai 
 a ả l s s i ch (swap) các phần t cần sắp x p. 
C sắp x p ả ượ a l m a . 
Sắp x p (internal sorting): D l ầ sắp x p ượ lư ầy ủ ộ ớ 
trong ự sắp x p. 
1 2 S p ếp ngoài (E terna Sorting) 
Sắp x p ex e al s : D l ầ sắp x p ướ lớ ô 
 lư ộ ớ sắp x p a y p l m a 
 . 
T p m ủa mô ọ y a xem x sắp x p . Cụ 
 l sắp x p s l mộ mả ả ồm a ư l ư l 
 ư a p a xem x ư a ủa 
 ả y ụ m ọa ượ ự ê mả số yê 
 ư l ư a ủa ả . 
1 3 S p ếp gián tiếp 
Khi các bả ước lớn vi i các bản ghi là r t tố m 
giảm p ư i ta có th s dụ p ư p p sắp x p gián ti p. Vi c này có th ược 
thực hi n theo nhi u cách khác nhau và môt trong nh p ư p p l o ra một file 
mới ch a ư ng khóa của le a ầu, ho c con tr tới ho c là ch số của các bản ghi ban 
 ầu. Chúng ta s sắp x p trên file mới này với các bả ước nh sa y 
c p vào các bả le a ầu thông qua các con tr ho c ch số y l l m 
 ư ng th y ối với các h quản tr s d li u). 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
14 
Ví dụ: chúng ta muốn sắp x p các bản ghi của le sa y: 
Index Dept Last First Age ID number 
1 123 Smith Jon 3 234-45-4586 
2 23 Wilson Pete 4 345-65-0697 
3 2 Charles Philip 9 508-45-6859 
4 45 Shilst Greg 8 234-45-5784 
Sau khi sắp x p x truy c p vào các bản ghi theo th tự sắp x p chúng ta s 
dụng th tự ược cung c p b i cột index (ch số . T ư ng hợp này là 3, 2, 4, 1. (chúng 
ta không nh t thi t phả i các bả a ầu). 
1.3 Các tiêu chuẩn đánh giá một thuật toán s p ếp 
Các thu t toán sắp x p có th ược so sánh với nhau dựa trên các y u tố sa y: 
+ Th i gian thực hi n (run-time): số các thao tác thực hi ư ng là số các phép so 
s i các bản ghi). 
+ Bộ nhớ s dụ Mem y : l lượng bộ nhớ cần thi thực hi n thu t toán 
 lượng bộ nhớ s dụ ch a d li u cần sắp x p. 
+ Một vài thu t toán thuộc lo “ pla e ô ần (ho c cần một số cố nh) thêm 
bộ nhớ cho vi c thực hi n thu t toán. 
+ Các thu ư ng s dụng thêm bộ nhớ t l thu n theo hàm tuy n tính ho c 
 m m ớ ước file sắp x p. 
+ T t nhiên là bộ nhớ s dụng càng nh càng tốt m c dù vi ối gi a th i gian và 
bộ nhớ cần thi t có th là có lợi. 
+ Sự nh (Stability):Một thu ược gọi là nh n ư gi ược 
quan h th tự của các khóa b a ô l m ay i th tự của các khóa b ng nhau). 
C a ư ng lo lắng nhi u nh t là v th i gian thực hi n của thu t toán vì các thu t 
toán mà chúng ta bàn v ư ng s dụ ước bộ nhớ ư ư a . 
Ví dụ v sắp x p nh: Chúng ta muốn sắp x p le sa y ự trên ký tự ầu của các 
bả ướ y l t quả sắp x p của các thu t toán nh và không nh: 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
15 
Chúng ta s xem xét t i sao tính nh trong các thu t toán sắp x p l ượ 
quan trọ ư y. 
2. Các ph ng pháp s p ếp c ản 
2.1. S p ếp chọn (Selection sort) 
Mô ả : 
Tìm phần t có khóa lớn nh t (nh nh sa sắp x p phần 
còn l i của mảng. 
S ồ : 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
16 
Bắ ầu
K t c
Nh p n, a[0..n-1]
i=0
i<n
vtmin=i
j<n
j=i+1
a[j]<a[vtmin]
vtmin=j
vtmin!=i
Đ i ch a[i], a[vtmin]
Đ
S
i=i+1
j=j+1
Đ
S
S
Đ
Đ
S
Đ n mã sau minh họa cho thu t toán: 
void selection_sort(int a[], int n) 
{ 
 int i, j, vtmin; 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
17 
 for(i=0; i<n-1;i++) 
{ 
 vtmin = i; // m lư p ầ a .. -1] 
 for(j=i+1;j<n;j++) 
 if(a[j] < a[vtmin]) 
 vtmin = j; 
 swap(a[vtmin], a[i]); // m a m a 
} 
} 
Ví dụ: 
Với m i giá tr của i thu t toán thực hi n (n – i – 1) phép so sánh và vì i ch y t 0 cho tới 
(n–2), thu t toán s cần (n-1) + (n- + + 1 -1)/2 t c là O(n2) phép so sánh. T mọ 
 ư ợp số lầ s s ủa l ô . M lầ y ủa l p ố ớ 
 mộ lầ a p ầ ê số lầ ủa 
 l . N ư y ư ợp ố ầ 0 lầ ầ / 
lầ ồ ầ lầ . 
2 2 S p ếp đổi ch trực tiếp (E change sort) 
Tư ự ư sắp x p ọ ư ầm ớ 
 sắp x p è l sắp x p ự p mộ số l ọ l 
 I e a e s ay S a Sele S . 
Mô ả: Bắ ầ x p ầ ầ ê a ớ 0 a x ả p ầ sa 
a ọ l a ớ y +1 ớ -1 ố ù . Vớ m p a a ý l a 
l p ầ sa a a a l xảy a sa a s a 
a[j]. 
Ví dụ minh họa G ả s mả a ầ l a 1 19 3 1 . C ướ ủa 
 s ượ ự ư sa : 
i=0, j=2: 1, 6, 2, 19, 3, 12 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
18 
i=1, j=2: 1, 2, 6, 19, 3, 12 
i=2, j=4: 1, 2, 3, 19, 6, 12 
i=3, j=4: 1, 2, 3, 6, 19, 12 
i=4, j=5: 1, 2, 3, 6, 12, 19 
K ả ố ù : 1 3 1 19. 
S ồ : 
Bắ ầu
K t c
Nh p n, a[0..n-1]
i=0
i<n
j<n
j=i+1
a[j]<a[i]
Đ
S
i=i+1
j=j+1
Đ
S
S
Đ
Đ i ch a[i], a[j]
C ủa : 
void exchange_sort(int a[], int n) 
{ 
 int i, j; 
int tam; 
 for(i=0; i<n-1;i++) 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
19 
for(j=i+1;j<n;j++) 
 if(a[j] < a[i]) 
 { 
// a a 
tam = a[i]; 
a[i] = a[j]; 
a[j] = tam; 
} 
} 
Độ p p ủa : C y s ớ sắp x p ọ 
sắp x p ự p ầ số ướ s s ư ư : l * -1 / lầ s s . 
N ư số ướ a p ầ ớ số lầ s s : * -1 / . T ư 
 ợp x số ướ ủa ớ số lầ s s ư ợp 
 số ướ l * -1 /4. C ư ợp ố số ướ 0. 
N ư y sắp x p ự p l m s ớ 
sắp x p ọ số lầ . 
2.3. S p ếp ch n (Insertion sort) 
Mô ả : 
T ựa a l hèn m i khóa vào mộ y ược sắp x p 
của dãy cần sắp. P ư p p y ư ược s dụng trong vi c sắp x p các cây bài trong 
 . 
S ồ ả ủa ư sa : 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
20 
Bắ ầu
K t c
i=1
i<n
tam=a[i]
j=i-1
Đ
j>=0
a[j]>tam
a[j]=a[j-1]
j=j-1
S
a[j+1]=tam
i=i+1
S
Đ
Đ
S
C mô ả l ư sa : a ầ a ư mả a 0.. -1 ồm p ầ 
 ư ợp ầ ê 1 l ượ sắp ướ ủa a s 
 è a mả a 0.. -1] sao c sa è p ầ ẫ e ự ă 
 ầ . Bướ p e s è a +1 mả a 0.. mộ ư ự. T 
 ớ mả è a -1 mả a 0.. -2]). Đ è a mả 
a 0.. -1 a ù mộ m lư a sa ù mộ số -1 
 ớ ầ mả a am s py a a +1 a l lù mả l mộ 
 è am mả . V l p s a am -1 a a +1 
tam. 
Đ m ư ư sa : 
void insertion_sort(int a[], int n) 
{ 
 int i, j, temp; 
 for(i=1;i<n;i++) 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
21 
 { 
 int j = i; 
 temp = a[i]; 
 while(j>0 && temp < a[j-1]) 
 { 
 a[j] = a[j-1]; 
 j = j-1; 
 } 
 a[j] = temp; 
 } 
} 
Ví dụ: 
T sắp x p è l mộ sắp x p s a le l 
 a số sắp x p ả . 
Với m i i chúng ta cần thực hi n so sánh khóa hiên t i (a[i]) với nhi u nh t là i khóa và 
vì i ch y t 1 tới n-1 nên chúng ta phải thực hi n nhi u nh : 1 + + + -1 = n(n-1)/2 t c 
là O(n2 p p s s ư ự ư t toán sắp x p chọn. Tuy nhiên l p le ô 
p ả l ượ ự ự ô l l p lầ ê 
 ê ự sắp x p è a s ớ sắp x p ọ . T ư 
 ợp ố ầ s ụ lầ s s 0 lầ . T ê ự mộ 
mả ỳ ồm mả ượ sắp ê è ộ ả. 
T sắp x p è l a sắp x p ả 
 ộ p p O(n2)). 
2.4. S p ếp nổi ọt ( u e sort) 
Mô ả : 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
22 
T sắp x p ọ ựa ê s s a p ầ a : 
+ Duy t qua danh sách các bản ghi cần sắp theo th tự i ch hai phần t k nhau 
n u chúng không theo th tự. 
+ L p l u này cho tới khi không có hai bản ghi nào sai th tự. 
K ô th y r ng n pha thực hi l ủ ự x . 
Thu y ư ự ư t toán sắp x p chọn ngo i tr vi c có thêm nhi u 
 a i ch hai phần t . 
S ồ : 
Bắ ầu
K t c
Nh p n, a[0..n-1]
i=0
i<n
j>i
j=n-1
a[j]<a[j-1]
Đ
S
i=i+1
j=j-1
Đ
S
S
Đ
Đ i ch a[j], a[j-1]
C : 
void bubble_sort1(int a[], int n) 
{ 
 int i, j; 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
23 
 for(i=n-1;i>=0;i--) 
for(j=1;j<=i;j++) 
if(a[j-1]>a[j]) 
 swap(a[j-1],a[j]); 
} 
void bubble_sort2(int a[], int n) 
{ 
 int i, j; 
 for(i=0;i<n;i++) 
for(j=n-1;j>i;j--) 
if(a[j-1]>a[j]) 
 swap(a[j-1],a[j]); 
} 
T ộ p p l O(N*(N-1)/2) = O(N2), số lầ s s số lầ 
 ủa ư ợp ồ . T sắp x p ọ l 
 m số sắp x p ả m sắp x p 
 ự p m ù số lầ s s a ư a p ầ a 
 ê số lầ . 
2.5 So sánh các thuật toán s p ếp c ản 
S p xếp chọn: 
+ T i n2/ p p s s ướ i ch . 
+ T ư ng hợp x u nh ư ự. 
S p xếp chèn: 
+ Trung bình cần n2/4 phép so sánh, n2/8 ướ i ch . 
+ X u nh t cần g p ô ước so vớ ư ng hợp trung bình. 
+ Th i gian là tuy ối với các file hầ ư sắp l a 
 số sắp x p ả . 
S p xếp nổi bọt: 
+ Trung bình cần n2/2 phép so sánh, n2/ a i ch . 
+ X u nh ư ự. 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
24 
3. Cấu tr c dữ iệu Heap, s p ếp vun đống (Heap sort). 
3.1. Cấu tr c Heap 
T ướ m eap s a s m mộ 
 ọ l Heap eap a a s e ay ọ l ố . 
Heap l mộ y p ầy ủ m a ey l ey pa e . H y ớ 
l mộ y p ầy ủ l mộ y p ầy ả ầ ủa y ầ ố 
 ù ầy p a ủa y . C mô ả l mộ y p m 
 m sa : l mộ ủa y ô m ố ù s 
 l mộ m ố ù s ô a em 
 ê ủa ô 1 s 1 ư a 
em ê ủa ủ m l l m ố ù mộ s số 
 số ủa a em ê ủa . 
Ví dụ 
Chiều cao của một heap 
Mộ eap s a l O l . 
Chứng minh 
G ả s l số ủa mộ eap a l . 
V mộ y p số ố a l 2
h
-1 nên suy ra: 
12h 2
h
-1 
L y l a a ủa ẳ a ượ : 
h – 1 l 
T êm 1 ủa ẳ l l y l a a a l ượ : 
log(n + 1) 
T ê s y a: 
3 
7 
4 
5 1
7
7 
2 6 
9 1
3 
1 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
25 
l + 1 l (n) + 1 
Các ví dụ về cấu tr c Heap: 
Heap ớ a 3: 
 eap ớ a 4 
 i u diễn Heap 
C a mộ y p ê mộ eap 
 ô ư ự ố ư mộ y p mộ mả . 
Đố ớ mộ eap lư mộ mả a a sa ả s a ắ ầ 
 0): 
 Left(i) = 2*i + 1 
 Right(i) = 2*i + 2 
 Parent(i) = (i-1)/2 
Ví dụ 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
26 
Thủ tục heapri y 
Đ y l ủ ụ ả ả ủ ụ a ê eap 
Input: 
+ Mộ mả A mộ số mả 
+ G ả s a y Le R l eap 
+ A p ỡ Heap y ớ Le R . 
Output: 
+ Mả A y ố l l mộ Heap 
K ô a y ộ p p l O(log n). 
C a s y y l mộ ủ ụ m y ư ượ l 
 a ay ủa mộ a eap ủa eap s p ỡ y 
 p ả sự s a . 
Sa y l C ủa ủ ụ : 
void heaprify(int *A, int i, int n) 
{ 
 l = Left(i); /* l = 2*i +1*/ 
 r = Right(i); /* r = 2*i + 2 */ 
 if(l A[i]) 
 largest = l; 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
27 
 else 
 largest = i; 
 if(r A[largest]) 
 largest = r; 
 if(lagest !=i) 
 { 
 swap(A[i], A[largest]); 
 heaprify(A, largest, n); 
 } 
} 
V ả y l mộ ủ ụ ả s ớ a ảm 
 . T ủ ụ y ả ớ ướ ư sa : 
+ X p ầ lớ 3 p ầ A A Le A R . 
+ N A ô p ả l p ầ lớ 3 p ầ ê A ớ 
A la es A la es s l A Le A R . 
+ Gọ ủ ụ ớ la es l m ay ủa eap 
 l A la es . 
Ví dụ 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
28 
Thủ tục ui dheap 
T ủ ụ l eap s y mộ mả ỳ mộ eap. V ả ủ ụ y 
 ự ọ ớ ủ ụ eap y ê e ự ượ l . V y e ự 
 ượ l ê a y ố l eap. N a ố ủa 
mả ư ớ l ê a ô ầ p ả ự ủ ụ eap ố ớ 
 . 
Đ m C ự l eap: 
void buildheap(int *a, int n) 
{ 
 int i; 
 for(i=n/2; i>=0; i--) 
 heaprify(a, i, n); 
} 
Dựa y y eap mả ộ p p l O(n*log n . 
T ê ự eap ộ p p l O . T a ự ủa 
 eap y ê mộ y ướ mộ ụ l mố a 
 a p ầ a a Le a R l O 1 . Cộ êm ớ a ủ ụ y 
 ự ê mộ y ố mộ l ủa . Số y ủa 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
29 
 ủa l ố l /3. S y a a ô ộ p p ủa 
 l : T T /3 + O 1 T O l y s y a ộ p p ủa 
 l eap l *l . C lý l ư sa : K ướ ủa p 
 ủa y l : /4 /8 /1 1 l số ủa y. T a ự 
 eap y ố ớ ướ y l 1 3 l – 1 a 
 s x p x l : 
1*n/4 + 2 * n/8 + 3 * /1 + + l -1) * 1 < n/4(1 + 2* ½ + 3 * ¼ + 4 * 1/8 + ...) = 
O(n). 
Ví dụ 
Các thao tác trên heap khác 
N eap a sa y ư ự ố ớ mộ eap: 
+ Insert() 
+ Extract_Max() 
C a ô a y y ư a y ô 
 ự ớ s ụ ủ ụ eap y m a ê . Vớ a y 
 a s ụ mộ eap mộ ợ ư ê . Mộ ợ ư ê l 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
30 
mộ l ớ a ả l se max m m ex a max m m 
 a s p ầ sa ủa a ọ . 
3.2. S p ếp vun đống (Heap sort) 
T Heap s ý ư ả : 
+ T ự ủ ụ l eap mả A mộ eap 
+ V A l mộ eap ê p ầ lớ s l A 1 . 
+ Đ A 0 A -1], A[n-1 m ủa a 
 a ư mả y ướ l -1 ay l xem x p ầ ầ ủa 
mả ô l mộ eap a. 
+ V A 0 l ê a s ọ ủ ụ eap y ố ớ l mả 
 mộ eap. 
+ L p l a ê ớ mộ p ầ eap mả 
 ượ sắp. 
C C ủa : 
void heapsort(int *A, int n) 
{ 
 int i; 
 buildheap(A, n); 
 for(i=n-1;i>0;i--) 
 { 
 swap(A[0], A[i]); 
 heaprify(A, 0, i-1); 
} 
} 
Ch ý: Đ ọ sắp x p ê mả a n p ầ ọ m eaps ư sa : 
heapsort(a, n); 
Độ phức tạp của thuật toán heapsort 
T ủ ụ l eap ộ p p l O . 
T ủ ụ eap y ộ p p l O l . 
Heaps ọ ớ l eap 1 lầ -1 lầ ọ ớ eap y s y a ộ p p ủa l 
O(n + (n-1)logn) = O(n*log n). 
T ê ự eaps ô a quicksort. 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
31 
4. T m kiếm tuyến tính 
4.1 ài toán t m kiếm 
T m m l mộ ộ l ự ê ủa a ọ 
m y ượ ụ ộ ê ự . Bả m ư a 
 p ư p p ma ự ự m m. T 
 ô y a ư x yê p ả m m: m m mộ ố 
s ọ mộ ầ a m m mộ l lư ê m y 
 ê m m mộ m mộ ả a m mộ 
 s l m m ê m I e e . 
T mô ọ y a a m ớ m m ê mộ mả mộ 
 a s p ầ ù . T ô ư p ầ y l mộ ả ượ p 
 a a ư ê : ư lư l mộ ư p 
p ầ ớ a ô ư l ố a ọ l 
 ư a p p ầ y ượ ọ l ô a m m ủa m m 
 ô a m m ượ lư ê ộ ớ ủa m y m m. 
K ả m m l v trí của phần tử th a mãn điều kiện t m kiếm: ư a 
 ớ mộ a ướ a m m . T m y y a 
 y p ớ ô ượ a ư l ủa p ầ m y. N 
 ả l ô m y ư ợp y ẫ ô ả 
 s ượ mộ ư ư ớ ô ồ p ầ 
 : ẳ ư -1 ố ớ mả NULL ố ớ a s l ê . 
C m m : m m m m 
 ầ ự m m p ớ m m ựa ê l 
 ư l y ư y m m p y y e 
T y ê p ầ y a s xem x a p ư p p m m ượ p ụ ớ 
 l mả l m m ượ a ộ ớ ủa m y . 
Đ ầ ê m a ầ lư ý l ố ớ mả y y p ớ 
p ầ a l ư a ựa số p a s p 
 ê ư m p ầ ư a l số yê . 
4.2 T m kiếm tuần tự (Sequentia search) 
 ư ủa m m ầ ự ả : y a ả p ầ ủa 
mả y m y p ầ a ớ a m m ả 
 ủa p ầ . C y ớ mả m ẫ ô p ầ a 
 ớ a m m ả -1 ô m y . 
T s ồ ả ư sa : 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
32 
C C ủa : 
int sequential_search(int a[], int n, int k) 
{ 
 int i; 
 for(i=0;i<n;i++) 
 if(a[i]==k) 
 return i; 
 return -1; 
} 
D a s ả ả l ủa p ầ ầ ê a m 
 m m ồ p ầ . 
Độ p p ư ợp ồ : O(n). 
T ư ợp ố ộ p p O(1). 
C m p ầ lớ m p ầ ủa mộ mả a s 
 l m m ầ ự. Mộ y l số p ầ ủa mả 
 ỡ 10000000 l m ố ộ p ượ ư số p ầ ủa 
mả lê ẳ ư m ê mộ ư số ê ư ủa ả ớ 
 a ô ả. 
Begin 
mả a[0..n-1] a 
i = 0 
k==a[i] return i; 
End 
sai 
i >= n 
return -1; 
i = i + 1; 
sai 
 ài giảng môn học Phân tích thiết kế và đánh giá giải thuật 
33 
5 Các vấn đề khác 
N ượ y ê ẫ mộ số m 
 a am ả : ẳ ư sắp x p S ell s sắp x p m 
Counting sort sắp x p số Ra x s . C y ượ xem ư p ầ ự m 
 ủa s ê . 
6. ài tập 
 ài tập 1: C sắp x p ả ô l p C ê 1 mả 
 số yê l ủa ư ượ p le ex ượ s ẫ ê số 
p ầ ả 10000 s s a ự ự ủa . 
 ài tập 2: C sắp x p a ô C ớ mộ mả 
 s ê ê : x ý ự ộ ố a l 0 : số yê m : số 
 a sắp x p l ư ê . S s a ự ủa s s ớ 
 m s s ủa C. 
 ài tập 3[6, trang 52]: C ủa sắp x p ự e 
 a . H y m p l mả a 0.. p ầ số 0 ớ 
 số -1 ượ sắp x p ă ầ a ô a p ầ mộ số x è x 
mả a 0.. -1 sa sa è ả ượ l a 0.. l mộ mả ượ sắp x p. 
S ụ m a x y ự sắp x p è . 
G i ý C è p ầ mả ư p ầ ủa 
sắp x p è ượ y s ụ p ư p p . 

File đính kèm:

  • pdfbai_giang_phan_tich_thiet_ke_va_danh_gia_thuat_toan_phan_1.pdf