Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 73 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
73
Dung lượng
4,44 MB
Nội dung
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