Đồ án giải thuật chia để trị

73 7 0
Đồ án giải thuật 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

1 MỤC LỤC LỜI CẢM ƠN i PHẦN XÁC NHẬN VÀ ĐÁNH GIÁ CỦA GIẢNG VIÊN iii TÓM TẮT iv MỤC LỤC DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT CHƯƠNG – [] 1.1 Brute-force .7 1.2 Giải thuật chia để trị .7 1.2.1 Giải thuật xếp trộn (Merge Sort) 1.2.1.1 Ý tưởng thuật toán 1.2.1.2 Thuật toán Mergesort .8 1.2.1.3 Thuật toán Merge 1.2.1.4 Đánh giá thuật toán 10 1.2.2 Giải thuật xếp nhanh (Quick Sort) 10 1.2.2.1 Ý tưởng thuật toán 10 1.2.2.2 Thuật toán 10 1.2.2.3 Đánh giá thuật toán 11 1.2.3 Duyệt nhị phân (Binary Tree Traversals and Related Properties) .11 1.2.3.1 Pre- order .12 1.2.3.2 In-order 13 1.2.3.3 Post-order 14 1.2.4 Phép nhân số nguyên lớn nhân hai ma trận thuật toán Strassen 14 1.2.4.1 Phép nhân số nguyên lớn .14 1.2.4.2 Nhân hai ma trận thuật toán Strassen 15 1.2.5 Cặp điểm gần tìm phần lồi (the closest-pair and convexhull problem) 16 1.2.5.1 Cặp điểm gần (The Closest-Pair) 16 1.2.5.2 Tìm phần lồi (Convex-Hull problem) 19 1.3 Thuật toán tham lam .21 1.3.1 Thuật toán Prim 21 1.3.2 Thuật toán Kruskal 23 1.3.3 Thuật toán Dijkstra 26 1.3.4 Thuật toán Huffman 28 CHƯƠNG – CHIẾN LƯỢC BIẾN THỂ ĐỂ TRỊ 31 2.1 Sắp xếp 31 2.1.1 Merge sort 31 2.1.1.1 Ý tưởng Merge sort 31 2.1.1.2 Mã Merge Sort 32 2.1.1.3 Phân tích Merge Sort 33 2.1.1.4 Hạn chế Merge Sort .34 2.1.2 Quick sort 34 2.1.2.1 Ý tưởng Quick sort 34 2.1.2.2 Mã Quick Sort .34 2.1.2.3 Ý tưởng Partition 35 2.1.2.4 Mã Quick Sort .35 2.1.2.5 Phân tích Quick Sort 36 2.1.2.6 Hạn chế Quick Sort .36 2.2 Phép khử Gaussian .36 2.2.1 Ý tưởng thuật toán .37 2.2.2 Chương trình minh họa .41 2.3 [THỊNH] 44 2.4 [THỊNH] 44 2.5 Horner’s Rule and Binary Exponentiation 44 2.5.1 Phương pháp Horner (Horner’s Rule) .44 2.5.1.1 Thuật toán 45 2.5.1.2 Mã giả 45 2.5.2 Hệ số mũ nhị phân (Binary Exponentiatio) .45 2.6 Giảm vấn đề (Problem reduction) 47 2.6.1 Bài tốn tìm bội chung nhỏ 47 PHÂN CÔNG VÀ ĐÁNH GIÁ 48 Phân công nhiệm vụ 48 Đánh giá thành viên 48 TÀI LIỆU THAM KHẢO 49 DANH MỤC KÍ HIỆU VÀ CHỮ VIẾT TẮT CÁC KÝ HIỆU CÁC CHỮ VIẾT TẮT DANH MỤC CÁC BẢNG BIỂU, HÌNH VẼ, ĐỒ THỊ DANH MỤC HÌNH Hình 1 Ví dụ xếp merge sort .8 Hình Cây nhị phân T 11 Hình Cây nhị phân 12 Hình Cây nhị phân 12 Hình Cây nhị phân 13 Hình Ví dụ chia đơi mảng 16 Hình Khoảng cách d 17 Hình Các điểm mặt phẳng 19 Hình Ví dụ thuật tốn Prim 21 Hình 10 Kết ví dụ thuật toán Prim 22 Hình 11 Ví dụ thuật tốn Kruskal 23 Hình 12 Kết ví dụ thuật tốn Kruskal 24 Hình 13 Ví dụ thuật tốn Dijkstra 26 DANH MỤC BẢN Bảng 1 Các bước sử dụng thuật toán Prim 21 Bảng Các bước sử dụng thuật toán Kruskal .24 Bảng Các bước sử dụng thuật toán Dijkstra .27 Bảng Bảng thống kê tần số xuất ký tự 28 Bảng Các bước sử dụng thuật toán Huffman 28 Bảng Kết ví dụ thuật tốn Huffman .29 Y Bảng Ví dụ tính giá trị đa thức 44 Bảng 2 Ví dụ tính theo thuật tốn LeftRightBinaryExponentiation .46 CHƯƠNG – [] 1.1 Brute-force 1.2 Giải thuật chia để trị Giải thuật chia để trị (Divide and Conquer) phương pháp quan trọng việc thiết kế giải thuật Ý tưởng phương pháp là: Khi cần giải toán, ta chia tón thành tốn Tiếp tục chia tốn nhỏ khơng thể chia thêm nữa, ta giải toán nhỏ cuối từ kết tất toán nhỏ ta tìm giải pháp cho tốn ban đầu Bước 1: Chia nhỏ - Trong bước này, chia toán ban đầu thành toán Mỗi toán nên phần toán ban đầu Bước 2: Giải toán - Trong bước này, toán giải Bước 3: Kết hợp lời giải - Sau toán giải, bước kết hợp chúng cách đệ qui để tìm giải pháp cho toán ban đầu 1.2.1 Giải thuật xếp trộn (Merge Sort) 1.2.1.1 Ý tưởng thuật tốn Sắp xếp trộn thí dụ hồn hảo việc áp dụng thành công kỹ thuật chia để trị Thuật toán xấp mảng A[0…n-1] cách chia thành hai nửa … ⌊ n/ ⌋ −1 ] A¿ A [ ⌊ n/2 ⌋ … n−1] , xếp đệ qui mảng gộp hai mảng xếp thành mảng xếp hồn thiện 1.2.1.2 Thuật tốn Mergesort Mô tả: Sắp xếp mảng A[0 … n-1] cách đệ quy Đầu vào: Một mảng A[0 … n-1] xếp Đầu ra: Một mảng A[0 … n-1] xếp theo thứ tự tăng dần M i 1.2.1.3 Thuật tốn Merge Mơ tả: Gộp mảng xếp thành mảng Đầu vào: Mảng B [0 … p−1] C [0 … q−1] hai xếp Đầu ra: Một mảng A[0 … p+q-1] gồm phần tử B C M Các bước thực - Bước cắt mảng thành hai - Nếu chiều dài mảng chẵn chia mảng - Nếu chiều dài mảng lẻ chia mảng thứ lớn mảng thứ hai phần tử - Sau tiếp tục chia hai mảng thành hai mảng nhỏ chiều dài mảng - Cuối gộp tất mảng để có mảng xếp Ví dụ: Hình 1 Ví dụ xếp merge sort 10 1.2.1.4 Đánh giá thuật toán Độ phức tạp thuật toán - Trường hợp tốt: O(nlog(n)) - Trường hợp xấu: O ( nlog ( n )) Không gian nhớ sử dụng: O(n) 1.2.2 Giải thuật xếp nhanh (Quick Sort) 1.2.2.1 Ý tưởng thuật toán Giống merge sort, thuật toán xếp quick sort thuật tốn chia để trị Nó chọn phần tử mảng làm điểm đánh dấu (pivot) Thuật toán thực chia mảng thành mảng dựa vào pivot chọn Việc lựa chọn pivot ảnh hưởng nhiều đến tốc độ xếp Việc chọn phần tử pivot x để đưa tất phần tử mảng mà nhỏ x sang bên trái vị trí x, di chuyển tất phần tử mảng mà lớn x sang bên phải vị trí x Khi ta có mảng con: mảng bên trái x mảng bên phải x Tiếp tục công việc với mảng (chọn pivot, phân đoạn) mảng xếp A [ ] … A [s−1 ] A [ s ] ⏟ A [ s+1] … A [n−1] ⏟ all are ≤ A [ s ] 1.2.2.2 all are ≥ A [ s ] Thuật toán Hàm partition chia mảng A[l … r] thành hai thành phần với pivot chọn A[p], trả lại vị trí A[p] mảng sau chia Mô tả: Sắp xếp mảng quicksort Đầu vào: Các mảng mảng A[0 … n-1] hai tham số l r tương ứng vị trí bên trái mảng vị trí bên phải cuối mảng Đầu ra: Mảng A[l … r] xếp tăng dần Q 59 , c hi ti n h tu a[ k] [i + 1] */ > > > f or (j = i + 1; j < = n 1; j+ +) > > > a[ 60 k] [j ] = a[ k] [j ] p * a[ i] [j ]; > > > } > > > } > > > x[ n] = a[ n] [n + 1] ; > 61 > > f or (i = n 1; i > = 1; i-) > > > { > > > d o u bl e x x = 0; > > > f or 62 (j = i + 1; j < = n; j+ +) > > > x x = x x + a[ i] [j ] * x[ j]; > > > x[ i] = a[ i] 63 [n + 1] x x; // b[ i] x x > > > } > > / / D at ca c gi a tri p hi a d u oi d u o n g > 64 c h e o c hi n h b a n g > > > (p h a n n a y k h o n g ca n) > > > f or (i = 2; i 65 < = n; i+ +) > > > f or (j = 1; j < i; j+ +) > > > a[ i] [j ] = 0; > > > / /T h u la i 66 > > > k v ec to b b; > > > f or (i = 1; i < = n; i+ +) > > > { > > > b b[ i] = aa [i 67 ] [1 ] * x[ 1] ; > > > f or (j = 2; j < = n; j+ +) > > > b b[ i] + = aa [i ] [j ] * x[ 68 j]; > > > } > > > / / D u a k et q u a v a o te p k et q u a > > > r et ur n tr u e; > 69 > > } 2.3 [THỊNH] 2.4 [THỊNH] 2.5 Horner’s Rule and Binary Exponentiation 2.5.1 Phương pháp Horner (Horner’s Rule) Phương pháp Horner thuật toán biến đổi đa thức để tính giá trị đa thức Qui tắc Honer thí dụ tốt chiến lược Biến thể-để-trị dùng kỹ thuật “thay đổi biểu diễn” (representation change) Ta có đa thức: p( x ) =an x + an−1 x n n−1 + … …+ a1 x + a Dùng qui tắc Horner biến đổi đa thức: Ta thu đa thức cách liên tiếp dùng x làm thừa số chung đa thức lại số mũ giảm dần p(x)=( …(an x+ an−1 ) x +… ) x +a0 Ví dụ: f ( x ) =2 x 3−6 x 2+ x −1 ¿ x( x 2−6 x+ )−1 ¿ x( x (2 x−6 )+ ) −1 Việc tính tốn đa thức biểu diễn dòng Dòng tất hệ số đa thức theo số mũ giảm dần Dịng chứa giá trị đa thức tính cơng thức “nhân ngang cộng chéo” Ví dụ: Tính giá trị đa thức f ( x ) =2 x 3−6 x 2+ x −1 x=3 Bảng Ví dụ tính giá trị đa thức Dễ thấy f ( ) =5 70 Ta thấy - ×2+(−6 )=0 - ×0 + =2 - ×2+(−1)=5 giá trị 2.5.1.1 giá trị x −6 x=3 giá trị x ( x−6 ) +2 x=3 x ( x ( x−6 ) +2) −1=f ( x) x=3 Thuật toán Dữ liệu đầu vào: Một mảng P[0…n] gồm hệ số đa thức bậc n Đầu ra: Giá trị đa thức x Ví dụ: Đầu vào: P[] = {2, -6, 2, -1}, x=3 Đầu ra: 2.5.1.2 Mã giả p  P[n] for i  n – downto p = p*x + P[i] return p n−1 M ( n )= A ( n ) =∑ 1=n i=0 Tổng số phép nhân tổng số phép cộng giải thuật n Trong tính trực tiếp đa thức riêng số hạng an x n cần đến n phép nhân  Giải thuật Horner giải thuật tối ưu để định trị đa thức 2.5.2 Hệ số mũ nhị phân (Binary Exponentiatio) Để tính x 25 ta cần nhân với 24 lần Nhưng x lớn (giả sử triệu chữ số) làm điều thời gian Luỹ thừa nhị phân thủ thuật cho phép tính tốn an với độ phức tạp O(logn) thay phải nhân n lần Đặt: n=b I … b i … b Là dạng biểu diễn số nguyên n dạng nhị phân Ví dụ: số mũ 13: 13=11012=1 × 23 + × 22+ × 21+ 1× 20 71  Chúng ta có cơng thức p ( )=b I 2I +…+ bi 2i +…+b0 Vậy công thức an khai triển số mũ nhị phân ta được: n a =a p (2) =a I i bI + …+ bi + …+b0 Để tính tốn luỹ thừa có thuật tốn: LeftRightBinaryExponentiation RightLeftBinaryExponentiation Ở chung ta qua thuật tốn LeftRightBinaryExponentiation Thuật tốn LeftRightBinaryExponentiation nói chữ số nhị phân vị trí xét ln bình phương giá trị trước nhân với a { p a2 p +b =a2 p abi=(a p )2 a b = ( a ) ,∧if bi=0 p (a ) a ,∧if b i=1 i i Thuật toán LeftRightBinaryExponentiation (a, b(n)) Đầu vào: Một số a danh sách b(n) số nhị phân bI, …, b0 Đầu ra: Giá trị an product ← a for i ← I − downto product ← product ∗ product if bi = 1: product ← product ∗ a return product Ví dụ: Tính a13 theo thuật tốn LeftRightBinaryExponentiation Với n=13=11012 Bảng 2 Ví dụ tính theo thuật tốn LeftRightBinaryExponentiation Ta chứng minh độ phức tạp thuật toán ưu với phép tính luỹ thừa ln u cầu n-1 phép nhân log2 n Nó tối 72 73 2.6 Giảm vấn đề (Problem reduction) 2.6.1 Bài tốn tìm bội chung nhỏ Việc tính bội chung nhỏ hai số nguyên dương m n, kí hiệu lcm(m, n), xác định số nguyên nhỏ chia hết cho m n Với phương pháp trung học tính tốn nó: tính tích tất thừa số nguyên tố chung m n, bao gồm tất thừa số nguyên tố m không thuộc n ngược lại thừa số nguyên tố n không thuộc m Ví dụ: 24 =2 × × 2× 3=23 × 60=2 × ×3 × 5=22 ×3 ×  lcm ( 24,60) =23 × ×5=120 Việc tính tốn cách khơng hiệu yêu cầu danh sách số nguyên tố liên tiếp Một thuật toán hiệu nghĩ cách sử dụng phương pháp giảm thiểu vấn đề (problem reduction) Đó sử dụng thuật tốn Euclid để tìm ước số chung lớn nhất, tích tất thừa số nguyên tố chung m n Khơng khó để thấy tích lcm(m, n) gcd(m, n) bao gồm thừa số m n dẫn đến cơng thức: lcm ( m, n ) = m×n gcd(m ⁡ , n) Trong gcd(m, n) tính hiệu thuật toán Euclid ... thuật chia để trị Giải thuật chia để trị (Divide and Conquer) phương pháp quan trọng việc thiết kế giải thuật Ý tưởng phương pháp là: Khi cần giải toán, ta chia tón thành tốn Tiếp tục chia tốn... (Quick Sort) 1.2.2.1 Ý tưởng thuật toán Giống merge sort, thuật toán xếp quick sort thuật toán chia để trị Nó chọn phần tử mảng làm điểm đánh dấu (pivot) Thuật toán thực chia mảng thành mảng dựa... toán ban đầu Bước 2: Giải toán - Trong bước này, toán giải Bước 3: Kết hợp lời giải - Sau toán giải, bước kết hợp chúng cách đệ qui để tìm giải pháp cho toán ban đầu 1.2.1 Giải thuật xếp trộn (Merge

Ngày đăng: 06/06/2022, 16:25

Hình ảnh liên quan

Hình 1.1 Ví dụ sắp xếp bằng merge sort - Đồ án giải thuật chia để trị

Hình 1.1.

Ví dụ sắp xếp bằng merge sort Xem tại trang 9 của tài liệu.
Hình 1.2 Cây nhị phâ nT - Đồ án giải thuật chia để trị

Hình 1.2.

Cây nhị phâ nT Xem tại trang 12 của tài liệu.
Hình 1.3 Cây nhị phân - Đồ án giải thuật chia để trị

Hình 1.3.

Cây nhị phân Xem tại trang 13 của tài liệu.
Hình 1.4 Cây nhị phân - Đồ án giải thuật chia để trị

Hình 1.4.

Cây nhị phân Xem tại trang 13 của tài liệu.
Hình 1 .5 Cây nhị phân - Đồ án giải thuật chia để trị

Hình 1.

5 Cây nhị phân Xem tại trang 14 của tài liệu.
Hình 1 .6 Ví dụ chia đôi 2 mảng - Đồ án giải thuật chia để trị

Hình 1.

6 Ví dụ chia đôi 2 mảng Xem tại trang 17 của tài liệu.
Hình 1 .7 Khoảng cách d - Đồ án giải thuật chia để trị

Hình 1.

7 Khoảng cách d Xem tại trang 18 của tài liệu.
Ví dụ: Mô tả hoạt động của thuật toán Prim trên đồ thị trong Hình 1.1, sử dụng đỉnh Minneapolis làm điểm bắt đầu. - Đồ án giải thuật chia để trị

d.

ụ: Mô tả hoạt động của thuật toán Prim trên đồ thị trong Hình 1.1, sử dụng đỉnh Minneapolis làm điểm bắt đầu Xem tại trang 21 của tài liệu.
Hình 1 .9 Ví dụ thuật toán Prim - Đồ án giải thuật chia để trị

Hình 1.

9 Ví dụ thuật toán Prim Xem tại trang 21 của tài liệu.
Bảng 1.1 Các bước sử dụng thuật toán Prim - Đồ án giải thuật chia để trị

Bảng 1.1.

Các bước sử dụng thuật toán Prim Xem tại trang 22 của tài liệu.
Ví dụ: Mô tả hoạt động của thuật toán Kruskal trên đồ thị trong Hình 10.7.4, trong đó n=8. - Đồ án giải thuật chia để trị

d.

ụ: Mô tả hoạt động của thuật toán Kruskal trên đồ thị trong Hình 10.7.4, trong đó n=8 Xem tại trang 23 của tài liệu.
Bảng 1.2 Các bước sử dụng thuật toán Kruskal - Đồ án giải thuật chia để trị

Bảng 1.2.

Các bước sử dụng thuật toán Kruskal Xem tại trang 24 của tài liệu.
Hình 1. 12 Kết quả ví dụ thuật toán Kruskal - Đồ án giải thuật chia để trị

Hình 1..

12 Kết quả ví dụ thuật toán Kruskal Xem tại trang 24 của tài liệu.
Sử dụng thuật toán của Dijkstra, chúng ta có thể lập bảng sau. - Đồ án giải thuật chia để trị

d.

ụng thuật toán của Dijkstra, chúng ta có thể lập bảng sau Xem tại trang 26 của tài liệu.
Hình 1. 13 Ví dụ thuật toán Dijkstra - Đồ án giải thuật chia để trị

Hình 1..

13 Ví dụ thuật toán Dijkstra Xem tại trang 26 của tài liệu.
Bảng 1.3 Các bước sử dụng thuật toán Dijkstra - Đồ án giải thuật chia để trị

Bảng 1.3.

Các bước sử dụng thuật toán Dijkstra Xem tại trang 27 của tài liệu.
Bảng 1.4 Bảng thống kê tần số xuất hiện của các ký tự - Đồ án giải thuật chia để trị

Bảng 1.4.

Bảng thống kê tần số xuất hiện của các ký tự Xem tại trang 28 của tài liệu.

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

  • Đang cập nhật ...

Tài liệu liên quan