Phương pháp “chia để trị”

26 1K 9
Phương pháp “chia để trị”

Đ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ương pháp “chia để trị” Phương pháp “chia để trị” Bởi: Đại Học Phương Đông Sơ đồ chung phương pháp Bài toán ví dụ Giả sử ta có thuật toán α để giải toán kích thước liệu với thời gian bị chặn cn2 Xét thuật toánβđểgiải toán cách • Bước : Chia toán cần giải thành toán với kích thước n/2 • Bước : Giải toán thuật toán α • Bước3 : Tổng hợplời giải toán để thu lời giải toán Giả sử bước đượcthực với thời gian d.n Gọi T (n) : thời gian thuật toánα m T (n): thời gian thuật toán β p Khi T (n) = cn2 m T (n) =3 T (n) +dn= cn2 + dn p m Nên dnTheo định lý thợ T( n ) =Ρ(nlog 3) Một số giải thuật xếp Cho T[1 n] mảng n phần tử Vấn đề đặt xếp phần tử theo thứ tự tăng Chúng ta giải vấn đề phương phápselection sort hay insertion sort heapsort Như biết thời gian dùng selection sort hay insertion sort để xếp mảng T hai trường hợp: xấu trung bình vào cỡ n2 Còn heapsort vào khoảng nlogn Có số giải thuật đặc biệt cho toán theo mô hình chia để trị làmergesortvà quicksort, nghiên cứu chúng MergeSort Chia để trị tiếp cận tới toán việc tách mảng T thành hai phần màkích thước chúng sai khác tốt, xếp phần cách gọi đệ qui sau trộn chúng lại (chú ý trì tính thứ tự) Để làm điều cần giải thuật hiệu cho việc trộn hai mảng U V thành mảng T mà kích thước mảng T tổng kích thước hai mảng U V Vấn đề thực tốt ta thêm vào ô nhớ có sẵn cuối mảng U V giá trị đứng canh (giá trị lớn tất giá trị U V) Procedure merge(U[1 m+1],V[1 n+1],Ta[1 m+n]); (*Trộn mảng U[1 m+1] V[1 n+1] thành mảng T[1 m+n]); U[m+1],V[n+1] dùng để chứa giá trị cầm canh*) Begin i:=1;j:=1; U[m+1]:= ∞ ; V[n+1]:= ∞ ; For k:=1 to n+m 10/26 Phương pháp “chia để trị” Hình sau bước mergesort Giải thuật xếp minh hoạ tất khía cạnh chia để trị Khi số lượng phần tử cần nhỏ ta thường sử dụng giải thuật xếp đơn giản Khi số phần tử đủ lớn ta chia mảng phần, tiếp đến trị phần cuối kết hợp lời giải Giả sử t(n) thời gian cần thiết để giải thuật xếp mảng n phần tử Việc tách T thành U V tuyến tính Ta dễ thấy merge(U,V,T) tuyến tính Do vậy: t(n)=t([n/2]) + t([n/2]) + g(n) g( n ) = O( n ) hay t( n )=2t( n /2)+g( n ) Theo định lý chủ Tacó: l=2; b=2và k=1 Nên t(n)= Ρ (nlogn), bk =l Như hiệu mergesort tương tự heapsort Trong thực tế xếp trộn nhanh heapsort cần nhiều nhớ cho mảng trung gian U V Ta nhớ lại heapsort xếp chỗ (in-place), cảm giác sử dụng 12/26 Phương pháp “chia để trị” biến phụ mà Theo lý thuyết mergesort làm nhiên giá thành có tăng chút Khi giải toán theo thuật giải chia để trị ý đến việc tạo toán con, không tạo thảm hại mà lường trước Giải thuật sau minh hoạ tính chất quan trọng kích thước toán hỗn độn: Procedure badmergesort(T[1 n]); Begin If n đủ nhỏ then Insert(T) Else Begin Array U[1 n-1, V[1 2]; U[1 n-1]:= T[1 n-1]; V[1]:= T[n]; badmergesort(U[1 n-1]); badergesort(V[1 1]); merge(U,V,T); End; ˆ Gọi t (n) thời gian cần để n phần tử với giải thuật badmergesort Rõ ràng là: ˆ ˆ ˆ ˆ t (n) = t (n-1) + t (1) + g (n), (n) ∈ Ρ(n) Sự đệ qui tạo (n) ∈ Ρ(n2), việc quên cân kích thước toán ảnh hưởng đáng kể đến hiệu việc sử dụng giải thuật chia đểtrị Quicksort Giải thuật phát minh Hoare, thường hiểu tên gọi - xếp nhanh, dựa theo nguyên tắc chia để trị Không giống mergesort quan tâm đến việc giải toán kết hợp lời giải chúng Bước giải thuật chọn vật trung tâm (pivot) từ phần tử mảng cần Tiếp đến vật trung tâm ngăn mảng phần: phần tử lớn vật trung tâm chuyển bên phải nó, ngược lại chuyển bên trái Sau phần mảng xếp độc lập cách gọi đệ qui giải thuật Cuối mảng xếp xong Để cân kích thước mảng ta có 13/26 Phương pháp “chia để trị” thể sử dụng phần tử (median) vật trung tâm Đáng tiếc việc tìm phần thời gian đáng kể Để giải quyêt điều đơn giNn sử dụng phần tử tuỳ ý mảng cần vậttrung tâm hi vọng làtốt Việc thiết kế giải thuật ngăn cách mảng vật trung tâm với thời gian tuyến tính thách đố (có thể làm được) Tuy nhiên điều cần thiết để so sánh với giải thuật xếp khác heapsort Vấn đề đặt mảng T[i j] cần ngăn vật trung tâm p=T[i] Một cách làm chấp nhận là: Duyệt qua phần tử của lần hai phía (đầu cuối mảng) Khi khởi tạo k=i; l=j+1, k tăng dần T[k] > p, l giảm dần T[l] ( l Tiếp đến hoán vị T[k] T[l] Quá trình tiếp tục k ( l Cuối đổi chổ T[i] T[l] cho lúc ta xác định vị trí phần tử trung tâm Procedure Pivot(T[i j], var l) (* Hoán vị phần tử mảng T[i j] cuối trả giá trị l (1≤l≤j) cho T[l]=p ,T[k]≤p với k (i≤k < l) T[k] > p với k (l < k≤ j), p khởi tạo T[i] *) Begin p:=T[i]; k:=i; l:=j+1; repeat k:=k+1; until (T[k] > p) or (k≥j); repeat l:=l-1; until (T[l] < p); while (k p); repeat l:=l-1; until (T[l]≤p); Swap(T[i],T[l]); end; Sau giải thuật xếp với tên gọi Quicksort dùng để xếp mảng T[1 n]: Procedure Quicksort(T[i j]); (* Sắp xếp theo thứ tự không giảm *) Begin 14/26 Phương pháp “chia để trị” if n đủ nhỏ then Insert(T[i j]) else begin pivot(T[i j],l); quicksort(T[i l-1]; quicksort(T[l+1,j]; End; end; Hình vẽ sau cho thấy làm việc pivot quicksort 15/26 Phương pháp “chia để trị” Quicksort không hiệu sử dụng việc gọi đệ quy toán mà không ý đến cân kích thước chúng Tình xấu T trước mà gọi quicksort thời gian dùng quicksort để O( n 2) Gọi t( n ) thời gian trung bình dùng quicksort để mảngnphần tử T[1 n ].llà 16/26 Phương pháp “chia để trị” giá trị trả gọi pivot(T[1 n],l) Theo pivot() l nằm ( n xác suất 1/n Thời gian để tìm vật trung tâm g(n) tuyến tính Thời gian để dùng đệ qui để xếp hai mảng kích thước (l-1) (n-l) tương ứng t(n-1) t(n-l) Như với n đủ lớn ta có: Hay rõ ràng ta chọnn giá trị đủ lớn để sử dụng công thức Nghĩa n nn Với công thức khó phân tích độ phức tạp Ta dự đoán tương tự mergesort hi vọng tức vào cỡ O(nlogn) Thật ta có định lý sau: Định lý: Quicksort cần nlogn thời gian để xếp n phần tử trường hợp trung bình Chứng minh Gọi t( n ) thời gian cần thiết để n phần tử trường hợp trung bình a,n số giống công thức 2.7.1 Ta chứng minh t( n ) = cnlogn với mọin≥ với c số Dùng phương pháp qui nạp để chứng minh: - Với mọinnguyên dương: (2 ≤n≤n) Dễ thấy t( n ) ≤ cnlogn - Bước qui nạp Ta có 17/26 Phương pháp “chia để trị” Giả thiết rằng: t(k) ≤ cklogk với ≤ k < n Ta c cho t( n ) ≤ cnlogn Lấy a = t(0) +t(1) Theo giả thiết qui nạp : t(k) = cklogk t( n ) = cnlogn với điều kiện , 18/26 Phương pháp “chia để trị” hay c ≥ 2d + 4a/n2 Từ xem xét với n > n0 thoả mãn: Hay ta có t( n ) ≤ cnlogn với mọin≥ 2, định lý chứng minh Như quicksort xếp mảng n phần tử khác trường hợp trung bình O( nlogn ) Câu hỏi đặt liệu sửa đổi quicksort để xếp với thời gian O( nlogn ) trương hợp xấu hay không Câu trả lời có thể!!! Tuy nhiên việc tìm phần tử T[i j] tuyến tính lấy làm vật trung tâm (pivot) (Finding the median) quicksort cần O( n 2) để xếpnphần tử trường hợp xấu (khi tất phần tử mảng cần nhau) Giải thuật sau khắc phục vấn đề này: Procedure Pivotbis(T[1 n],p; var k,l); p - vật trung tâm T[1 n] chia phần: T[1 k]: gồm phần tử < p T[k+1 l-1]: gồm phần tử = p T[l n]: gồm phần tử >p k,l giá trị trả Pivotbis(T[i j],T[i],k,l) Sau ngăn cách mảng T[1 n] việc gọi Pivotbis(T[i j],T[i],k,l), phần lại gọi đệ qui quicksort cho T[1 k] T[l+1 n] Với cách sửa đổi việc mảng tuyến tính Thú vị quicksort với thời gian O( nlogn ) trường hợp xấu phần tử chọn làm vật trung tâm tuyến tính Tuy nhiên đưa vấn đề có tính lý thuyết 19/26 Phương pháp “chia để trị” để cải tiến tăng phức tạp giải thuật số Nn (hide constant), dùng heapsort hơn! Bài toán nhân ma trận Bài toán : Cho hai ma trận A, B với kích thước n*n, ta có ma trận C chứa kết phép nhân hai ma trận A B Thuật toán nhân ma trận cổ điển công thức đây: phân tích thuật toán Với mảng chiều (kích thước n phần tử), ma trận C tính thời gian O(n), giả sử phép cộng vô hướng phép nhân phép tính (có thời gian tính số) Với mảng hai chiểu (kích thước n*n) thời gian để tính phép nhân ma trận AB O( n 3) Đến cuối năm 1960, Strassen đưa giải pháp cải tiến thuật toán trên, có tính đột phá lịch sử thuật toán chia để trị, chí gây ngạc nhiên không thuật toán nhân số nguyên lớn phát minh thập kỷ trước ý tưởng thuật toán Strassen tương tự thuật toán Đầu tiên ta chứng minh phép nhân hai ma trận với kích thước 2*2 thực cách sử dụng phép nhân vô hướng thuật toán cổ điển bắt buộc Ta xét phép nhân hai ma trận A, B sau: Ta có biểu thức sau, biểu thức có phép nhân: 20/26 Phương pháp “chia để trị” Ta có ma trận C tích hai ma trận A B là: Do ta thấy rằng, nhân hai ma trận kích thước 2*2 cách sử dụng phép nhân vô hướng Nhìn thoáng qua thấy thuật toán thú vị lắm, sử dụng số lượng lớn phép cộng phép trừ, thuật toán cổ điển cần phép cộng Bây ta thay phần tử A B ma trận có kích thước n*n, để thực phép nhân hai ma trận A B ta phải thực phép nhân hai ma trận với kích thước n*n phép cộng, trừ hai ma trận n*n Nếu ta làm việc với ma trận lớn phép cộng nhanh nhiều so với phép nhân, việc tiết kiệm phép nhân lợi nhiều so với việc thực phép cộng Gọi t(n) thời gian cần thiết để nhân hai ma trận kích thước n*n cách sử dụng đệ quy hai phương trình 2.3.1 2.3.2 Giả sử n luỹ thừa bậc Do thời gian để tình phép cộng, trừ ma trận Do ta thấy rằng, nhân hai ma trận kích thước 2*2 cách sử dụng phép nhân vô hướng Nhìn thoáng qua thấy thuật toán thú vị lắm, sử dụng số lượng lớn phép cộng phép trừ, thuật toán cổ điển cần phép cộng Bây ta thay phần tử A B ma trận có kích thước n*n, để thực phép nhân hai ma trận A B ta phải thực phép nhân hai ma trận với kích thước n*n phép cộng, trừ hai ma trận n*n Nếu ta làm việc với ma trận lớn phép cộng nhanh nhiều so với phép nhân, việc tiết kiệm phép nhân lợi nhiều so với việc thực phép cộng 21/26 Phương pháp “chia để trị” Gọi t(n) thời gian cần thiết để nhân hai ma trận kích thước n*n cách sử dụng đệ quy hai phương trình 2.3.1 2.3.2 Giả sử n luỹ thừa bậc Do thời gian để tình phép cộng, trừ ma trận là, đót ( n ) = t ( n /2) +dn 2, điều ví dụ minh hoạ cho việc phân tích tổng quát thuật toán chia để trị áp dụng dụng định lý thợ ta có Đối với trường hợp ma trận vuông kích thước luỹ thừa bậc giải vấn đề cách thêm dòng cột cho kích thước ma trận gấp đôi kích thước ma trận cũ gán giá trị cho phần tử thêm Điều không làm ảnh hưởng đến thời gian tính toán Do lg7[...]... thuật sắp xếp với tên gọi là Quicksort dùng để sắp xếp mảng T[1 n]: Procedure Quicksort(T[i j]); (* Sắp xếp theo thứ tự không giảm *) Begin 14/26 Phương pháp “chia để trị” if n đủ nhỏ then Insert(T[i j]) else begin pivot(T[i j],l); quicksort(T[i l-1]; quicksort(T[l+1,j]; End; end; Hình vẽ sau cho thấy sự làm việc của pivot và quicksort 15/26 Phương pháp “chia để trị” Quicksort sẽ không hiệu quả nếu sử... trước mà gọi quicksort và thời gian dùng quicksort để sắp là O( n 2) Gọi t( n ) là thời gian trung bình dùng quicksort để sắp mảngnphần tử T[1 n ].llà 16/26 Phương pháp “chia để trị” giá trị trả về khi gọi pivot(T[1 n],l) Theo pivot() thì l nằm giữa 1 ( n và xác suất là 1/n Thời gian để tìm vật trung tâm g(n) là tuyến tính Thời gian để dùng đệ qui để sắp xếp hai mảng con kích thước (l-1) và (n-l) tương... trung bình Chứng minh Gọi t( n ) là thời gian cần thiết để sắp n phần tử trong trường hợp trung bình a,n 0 là các hằng số giống như công thức 2.7.1 Ta chứng minh t( n ) = cnlogn với mọin≥ 2 với c là hằng số Dùng phương pháp qui nạp để chứng minh: - Với mọinnguyên dương: (2 ≤n≤n) Dễ thấy t( n ) ≤ cnlogn - Bước qui nạp Ta có 17/26 Phương pháp “chia để trị” Giả thiết rằng: t(k) ≤ cklogk với mọi 2 ≤ k < n... thiết để tính ra ϕ 24/26 Phương pháp “chia để trị” vàs Chị ta biết được không phải do có tài phân tíchzra thừa số mà do chị ta tính z từ các thừa số được chị ta chọn Hiện tại độ chắc chắn của sơ đồ mật mã hóa này vẫn chưa được xác định trên phương diện toán học: Không có chứng minh toán học nào khẳng định việc phân tích ra thừa số là không thể được và cũng không có chứng minh nào khẳng định rằng để phá... đánh giá độ phức tạp trong chương 1 để đánh giá độ phức tạp của các thuật toán trong chương 2 25/26 Phương pháp “chia để trị” Dành cho độc giả Xét ma trận F= 0 1 1 1 Hãy tính thử kết quả của phép nhân ma trận này với vector (i, j) Trong đó i, j là hai số nguyên Có gì đặc biệt khi i, j là hai số hạng liên tiếp của dãy Fibonaci? Từ đó xây dựng thuật toán chia để trị để tính các phần tử của dãy số Fibonaci... thì để thực hiện phép nhân hai ma trận A và B ta phải thực hiện 7 phép nhân hai ma trận với kích thước n*n và cũng từng đấy phép cộng, trừ của hai ma trận n*n Nếu ta làm việc với các ma trận lớn thì phép cộng sẽ nhanh hơn rất nhiều so với phép nhân, việc tiết kiệm 1 phép nhân sẽ lợi hơn nhiều so với việc thực hiện các phép cộng cơ bản 21/26 Phương pháp “chia để trị” Gọi t(n) là thời gian cần thiết để. .. ý tưởng của Diffie, Hellman và Merkle về sự khả thi vấn đề trên trong những năm giữa thập kỷ 70 thế kỷ 20 Tiếp theo đây chúng tôi sẽ trình bày một giải pháp độc đáo được 23/26 Phương pháp “chia để trị” Rivest, Shamir và Adleman đưa ra ít năm sau Giải pháp nàyn ngày nay được biết dưới cái tên hệ thống mật mã RSA, viết tắt từ tên của những người đã phát minh ra nó Xét hai số nguyên tố có 1 trăm chữ sốpvàqđược... của mảng được sắp xếp độc lập bằng cách gọi đệ qui giải thuật này Cuối cùng mảng sẽ được sắp xếp xong Để cân bằng kích thước của 2 mảng này ta có 13/26 Phương pháp “chia để trị” thể sử dụng phần tử ở giữa (median) như là vật trung tâm Đáng tiếc là việc tìm phần ở giữa cũng mất 1 thời gian đáng kể Để giải quyêt điều đó đơn giNn là chúng ta sử dụng 1 phần tử tuỳ ý trong mảng cần sắp như là vậttrung... merge(U,V,T); 11/26 Phương pháp “chia để trị” Hình sau chỉ ra các bước của mergesort Giải thuật sắp xếp này minh hoạ tất cả các khía cạnh của chia để trị Khi số lượng các phần tử cần sắp là nhỏ thì ta thường sử dụng các giải thuật sắp xếp đơn giản Khi số phần tử đủ lớn thì ta chia mảng ra 2 phần, tiếp đến trị từng phần một và cuối cùng là kết hợp các lời giải Giả sử t(n) là thời gian cần thiết để giải thuật... mà chúng ta quan tâm sẽ là phần dư 22/26 Phương pháp “chia để trị” của phép chia này Như vậy thời gian cần cho mỗi phép nhân đồng dư phần nào không bị ảnh hưởng bởi giá trị của hai sốxvày dụng những phân tích trong phần trước với một số thay đổi cần thiết cho phép chúng ta kết luận rằng thuật toán trên chỉ cần một số lượng phép nhân đồng dư vào cỡ (log n) để tínhanmodz Phân tích một cách chính xác ... quicksort để mảngnphần tử T[1 n ].llà 16/26 Phương pháp “chia để trị” giá trị trả gọi pivot(T[1 n],l) Theo pivot() l nằm ( n xác suất 1/n Thời gian để tìm vật trung tâm g(n) tuyến tính Thời gian để. .. cnlogn với mọin≥ với c số Dùng phương pháp qui nạp để chứng minh: - Với mọinnguyên dương: (2 ≤n≤n) Dễ thấy t( n ) ≤ cnlogn - Bước qui nạp Ta có 17/26 Phương pháp “chia để trị” Giả thiết rằng: t(k)... cộng 21/26 Phương pháp “chia để trị” Gọi t(n) thời gian cần thiết để nhân hai ma trận kích thước n*n cách sử dụng đệ quy hai phương trình 2.3.1 2.3.2 Giả sử n luỹ thừa bậc Do thời gian để tình phép

Ngày đăng: 30/12/2015, 09:40

Mục lục

  • Phương pháp “chia để trị”

  • Sơ đồ chung của phương pháp

    • Bài toán ví dụ

    • Sơ đồ thuật toán tổng quát

    • Thuật toán tìm kiếm nhị phân

      • Phép nhân các số nguyên lớn

      • Một số giải thuật sắp xếp

        • MergeSort

        • Bài toán nhân ma trận

        • Giới thiệu về khoa học mật mã

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

Tài liệu liên quan