Phân tích một số thuật toán trong Pascal

15 2.2K 11
Phân tích một số thuật toán trong Pascal

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

PHÂN TÍCH MỘT SỐ THUẬT TOÁN 1. Thuật toán tìm Max - Thuật toán M: Tìm giá trị lớn nhất trong dãy x[1], x[2], …, x[N] Begin j:=1; m := x[1]; for i:=2 to N do if x[i] > m then m := x[i]; j := i; end if end do End Có thể chứng minh thuật toán M là đúng bằng nguyên lý qui nạp. Nếu gọi α là thời gian thực hiện một phép so sánh và β là thời gian thực hiện một phép gán thì thời gian thực hiện thuật toán M là: T= 2 β + (N-1) α + 2 A N β Trong đó A N là số lần mà điều kiện x[i] > m được thỏa trong vòng lặp for. Nói cách khác A N số những i thỏa điều kiện sau đây: x[i] = Max {x[k], 1 ≤ k ≤ i} Có thể thấy rằng 0 ≤ A N ≤ N-1. Từ đó ta suy ra độ phức tạp (trung bình) của thuật toán M là O(ln(n)) vì dựa trên kỹ thuật tính toán dùng hàm sinh ta có thể chứng minh được rằng mean(A N ) = H n – 1 = O( ln(n) ) và độ lệch là σ = )2( NN HH − Chứng minh: Ta tính giá trị trung bình của A N dựa trên 2 giả thiết sau: (i) dãy các x[i] đôi một khác nhau, và (ii) mọi phép hoán vị đều có thể xảy ra với xác suất như nhau (là 1/N!). Ký hiệu p Nk là xác suất để A N = k. Ta có: p Nk = (số hoán vị mà A N = k) / N! Có thể kiểm tra được công thức sau đây (bài tập): p Nk = n 1 .p N-1,k-1 + n n 1 − .p N-1,k Xét hàm sinh )( ∑ = k k Nkn zz pG Ta có thể kiểm tra thấy rằng: )( 1 )( 1 z z z nn G n n G − − = + Suy ra 21 2 . 1 )( 1 +++ − −− = zzz z n n n n G n  Do đa thức 1 +− − + kn kn z là hàm sinh của dãy { 1 +− − kn kn , 1 1 +− kn } nên Ave( 1 +− − + kn knz ) = 1 1 +− kn . Từ đó Ave( )( z n G ) = 1 1 ∑ +− k kn = H n -1. 2. Số nghịch thế của một phép hon vị - Định nghĩa: Cho π là một hoán vị của n phần tử 1, 2, …, n. Một nghịch thế là một cặp (π(i),π(j)) thỏa π(i) > π(j) và i < j. Với j = 1, 2, …, n đặt b j = số các nghịch thế có thành phần thứ hai là j. Bảng b 1 , b 2 , …, b n được gọi là bảng nghịch thế của hoán vị π. Số các nghịch thế của π là: I(π) = ∑ = n j j b 1 Ví dụ: Giả sử một hoán vị π viết dưới dạng dòng như sau (π(1) π(2) … π(n)) = (5 9 1 8 2 6 4 7 3) ⇒ bảng nghịch thế là (2 3 6 4 0 2 2 1 0). - Định lý: Có một tương ứng 1-1 giữa tập hợp các hoán vị n phần tử và các bảng nghịch thế. - Tính chất: Đặt I n (k) = số các hoán vị có k nghịch thế và qui ước I n (k) = 0 nếu k < 0 hay k >         2 n . Ta có các tính chất: (i) I n (0) = 0 (ii) I n (1) = n-1 (iii)I n         −         k n 2 = I n (k) (iv)I n (k) = I n-1 (k) + I n-1 (k-1) + . . . + I n-1 (k-n+1) - Số nghịch thế trung bình: Xét hàm sinh G n (z) của phân bố xác suất       ∞ = )( ! 1 0 k I n n k . Do tính chất của I n (k) ta có: G n (z) = n 1 (1 + z + . . . + z n-1 ) G n-1 (z) ⇒ G n (z) = )1( 1 zn n z − − G n-1 (z) ⇒ G n (z) = )1(2)1)(1( 1 )1( 2 111 zzn n zn n zzz −−− − − −−−  và h k (z) = )1( 1 zk k z − − = k 1 (1 + z + . . . + z k-1 ) là hàm sinh của phân bố xác suất kkk 1 ,, 1 , 1  nên có thể tính toán được mean(h k ) = 2 1 − k Var(h k ) = 12 1 2 − k Suy ra: Mean(G n ) = ∑ = − n k k 2 2 1 = 4 )1( − nn Var(G n ) = ∑ = − n k k 2 2 12 1 = 72 )52)(1( +− nnn Tóm lại ta có định lý sau đây: Định lý: Số nghịch thế trúng bình là 4 )1( − nn = O(n 2 ) với độ lệch σ = O( nn ). 3. Sắp xếp bằng cách đếm Xét bài toán sắp xếp các record R[1], R[2], . . ., R[N] với các khóa tương ứng là K[1], K[2], . . ., K[N]. (không làm mất tính tổng quát, ta có thể giả sử các khóa đôi một khác nhau). Ta dùng một dãy phụ Count[1], count[2], . . ., count[N] với count[i] = số record có khóa nhỏ hơn K[i]. - Thuật toán C: (sắp xếp bằng cách đếm) Bước 1: đặt mọi count[i] là 0 ứng với I = 1, 2, …, N Bước 2: For I := N downto 2 do For j := i-1 downto 1 do If K[i] < K[j] then count[j] := count[j] + 1 Else count[i] := count[i] + 1 End if End do End do Bước 3: Đặt R[i] ở vị trí count[i] + 1. - Phân tích: Ở bước 1 và bước 3 số thao tác có cở N: O(N). Đối với vòng lặp ở bước 2 ta có số phép so sánh = số phép gán. Dễ thấy rằng số phép so sánh là: 2 )1( 2 − =         nn n Từ đó suy ra độ phức tạp của thuật toán là O(N 2 ). 4. Sắp xếp bằng cách chèn trực tiếp Theo cách sắp xếp “chèn trực tiếp” này thì ở bước lặp thứ j, đã có sự sắp xếp của j-1 phần tử trước, ta so sánh phần tử thứ j dần về phía trước với các phần tử khác để chèn vào đúng vị trí. - Thuật toán S: For j := 2 to N do I := j-1; K := K[j]; R := R[j]; While (I > 0) and (K < K[i]) do R[i+1] := R[i]; I := i-1; End do; R[i+1] := R; End do - Phân tích: Ở ngoài vòng lặp while ta thực hiện 3(N-1) phép gán. Trong vòng lặp while ta thực hiên A phép gán mẩu tin và A phép gán biến nguyên (Bookeeping) trong đó A chính là số cặp khoá không đúng chỗ, nghĩa là số nghịch thế của phép hoán vị π sao cho K[π(1) ] < K[π(2) ] < … < K[π(n) ] khi chưa sắp xếp. Số phép so sánh trong vòng lặp while là A + (N-1) phép so sánh khoá và A + (N-1) + B phép so sánh i > 0 (bookeeping) Ở đây B là số lần mà chỉ số i giảm đến 0 nghĩa là khi K[j] = min{K[i]; 1≤i≤j}. Đại lượng A có giá trị cực tiểu là 0 khi mảng ban đầu đã được sắp xếp và giá trị cực đại là 2 )1( − NN khi mảng ban đầu được xếp theo thứ tự ngược. Giá trị trung bình của A là 4 )1( − NN với độ lệch ) 2 5 )(1( 6 1 +− nnn . Cuối cùng đại lượng B có thể được tính toán tương tự như trong thuật toán tìm MAX với giá trị cực tiểu là 0, cực đại là N – 1 và giá trị trung bình là H N – 1 với độ lệch )2( NN HH − . Tóm lại thuật toán S chạy nhanh nhất với độ phức tạp O(N) khi mảng đã có thứ tự. Trường hợp xấu nhất và trung bình độ phức tạp là O(N 2 ). Số phép so sánh khoá trung bình của thuật toán S chỉ còn bằng một nửa số phép so sánh khoá trung bình của thuật toán C. Tuy nhiên, số phép gán đã tăng cao hơn trước. 5. Sắp xếp nhanh (Quick sort) Sự cải tiến của thuật toán S so với thuật toán C không lớn lắm do ở mỗi bước lặp, số nghịch thế chỉ giảm được một đơn vị. Do đó độ phức tạp có cùng cỡ với số nghịch thế của phép toán hoán vị cấp N mà giá trị trung bình đã được chứng minh là O(N 2 ). Để cải tiến hơn, ở mỗi bước cần làm giảm số nghịch thế càng nhiều càng tốt. Gọi K là giá trị khoá ở giữa, ta sẽ tìm cách chia mảng M ban đầu thành 2 mảng con M 1 , M 2 , trong đó M 1 là mảng con bên trái gồm các mẫu tin có khoá ≤ K và M 2 là mảng con bên phải gồm các mẩu tin có khoá > K. Phép chia này cần N phép so sánh và tối đa N phép dời chỗ. Sau khi chia, một cặp (K[i], K[j]), i < j, chỉ có thể là một nghịch thế nếu 2 mẫu tin tương ứng cùng thuộc M 1 hay cùng thuộc M 2 . Như thế số nghịch thế tối đa có thể có sẽ được giảm từ 2 )1( − NN xuống còn: 4 )2( )1 2 ( 22 1 2 − =− NNNN xx nghĩa là đã giảm được hơn một nữa. Ở bước tiếp theo, hai mảng con M 1 , M 2 lại tiếp tục được chia đôi và số nghịch thế tối đa có thể có lại được giảm hơn một nữa. Như thế chỉ cần tối đa N NN 22 log2) 2 )1( (log ≈ − bước, mảng sẽ không chứa nghịch thế. Nói cách khác mảng đã được sắp thứ tự. Số phép so sánh tối đa sẽ là NN 2 log2 và số phép dời chỗ còn ít hơn nữa. Để trình bày thuật toán Q, ta sẽ sử dụng một stack có chiều dài log 2 N mà mỗi phần tử của … là một cặp (l,r) để trỏ tới phần tử đầu tiên và phần tử cuối cùng của mảng con tương ứng. Ngoài ra để giảm bớt bookeeping, ta … thêm một mẩu tin giả R[N+1] có khóa là +∞ (lớn hơn mọi giá trị khóa trong mảng). Để đơn giản hóa thuật toán, ngoài hai thủ tục Push và Pop có sẵn của stack ta cũng đưa vào thủ tục giả cho hoán vị hai phần tử trong mảng, cũng như các … chiều dài và so sánh để trả về chiều dài r hay so sánh chiều dài hai mảng. Hàm so sánh trả về một cặp giá trị: giá trị đầu là các con trỏ chỉ đến mảng dài hơn và giá trị sau là các con trỏ chỉ đến mảng ngắn hơn trong … mảng đem so sánh. - Thuật toán Quick sort: Bước 1: Push (1,N) vào stack; Bước 2: While stack <> φ do (l,r) := Pop stack; i:=l+1; j:=r; K:=K[r]; R:=R[l]; Repeat While K[i] ≤ K do i:=i+1 end do; While K[i] > K do j:=j-1 end do; If j ≤ i then hoán vị R[l] và R[j] Else hoán vị R[i] và R[j] End if; until j ≤ i ; (M 1 , M 2 ):= so sánh ((l,j-1),(j+1,r)) If chiều dài (M 1 ) > 1 then Push M 1 vào stack end if If chiều dài (M 2 ) > 1 then Push M 2 vào stack end if End do - Phân tích: Cũng như trong các thuật toán sắp xếp khác, hai yếu tố đóng vai trò quyết định trong việc đánh giá độ phức tạp của Thuật toán Q là A N , số phép so sánh khóa, và B N , số phép đổi chỗ (hoán vị 2 mẫu tin). Ta sẽ phân tích hai đại lượng này dưới đây: Trường hợp trung bình a) ( ) N N A mean A= Gọi Nk P là xác suất để kA N = . Trong bước phân chia đầu tiên Nrl == ,1 . Số phép so sánh khóa trong vòng lặp Repeat…Until là N+1 nên 0 = k N P nếu rNk +< . Cũng trong bước này, nếu giả thiết dữ liệu hoàn toàn ngẫu nhiên, mẫu tin R[1] sẽ được dời đến đúng vị trí S với xác suất N 1 . Khi ấy ta được 2 mảng con cần xử lý tiếp là (1, S-1) và (S+1, N). Trong việc sắp xếp mảng con (1, S-1) số phép so sánh cần thiết có thể lấy giá trị tùy ý 10 −−≤≤ Nkh với xác suất 1,S h P − . Đồng thời việc sắp xếp mảng (S+1, N) cần đúng k-N-1-h phép so sánh. Do đó ta có công thức truy chứng: (7) 1 1, , 1 1 0 1 N k N Nk S h N S k N h S h P P P N − − − − − − − = = = ∑ ∑ Gọi )(zA N là hàm sinh của phân bố xác suất kNk P }{ . Ta có do (7) 1 1 1 1 1, , 1 1 1 0 1 1, , 1 0 0 ( ) 1 1 k N Nk k N N k N N k N S h N S k N h S k N h N k N k S h N S k h S k h A z P z z P P z N z P P z N ≥ + − − + − − − − − − − = ≥ + = + − − − = ≥ = = = = ∑ ∑ ∑ ∑ ∑ ∑∑ (8) 1 1 1 1 ( ) ( ) ( ) N N N S N S s A z z A z A z N + − − = = ∑ Suy ra: 1 1 1 1 1 1 ' (1) ( 1 ' (1) ' (1)) 1 1 1 N N N S N S S N N S N S S S A A N A A N N A A N N − − = − − = = = = + + + = + + + ∑ ∑ ∑ 1 0 2 1 N N S S A N A N − = = + + ∑ Đây chính là công thức truy chứng. Giải ta được kết quả là 1 3 2( 1)( ) 2 ( ) 2 N N A N H NLn N + = + − ≈ Vậy ( log ) N A O N N= Mặt khác ta có: 1 1 1 1 1 1 1 1 1 0 1 0 2( 1) '' ( 1) ( ) 2 1 ( '' (1) '' (1)) 4( 1) 2 2 ( 1) '' (1) N S N S N S N N S N S S N S S S N N N s S N S S S S S N A N N A A N A A A A N N N N N A A A A N N N − − = − − − − = = − − − − = = = + = + + + + + + + = + + + + ∑ ∑ ∑ ∑ ∑ ∑ Với điều kiện đầu 1 '' 0A = thì ta có 1 2 1 1 1 1 1 '' (1) 4( 1)( 2) 12( 1)( 2) 2 16( 1)( 2) 4( 1) 8 N N k N k N N k k A N N H N N H N k N N N H H + + = − + = = + + − + + + − + + + − + + ∑ ∑ Suy ra: . Trình bày một thuật toán sắp xếp dãy và phân tích độ phức tạp của thuật toán. Câu 2: Phân tích độ phức tạp của thuật toán tìm kiếm trên một cây nhị phân, và. Thuật toán sắp xếp dãy “merge sort”. 3. Thuật toán sắp xếp dãy “heap sort”. 4. Thuật toán tìm kiếm tuần tự. 5. Thuật toán tìm kiếm nhị phân. 6. Thuật toán

Ngày đăng: 26/12/2013, 20:12

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan