1. Trang chủ
  2. » Công Nghệ Thông Tin

Chap4New 110820045957 phpapp02

36 0 0

Đ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

Chương 4 1 Chương 4 Chiến lược biến thể để trị (transform and conquer) 2 Nội dung  Chiến lược Biến thể để trị  Giải thuật Gauss để giải hệ phương trình tuyến tính  Cấu trúc heap và heapsort  Giải[.]

Chương Chiến lược biến thể-để-trị (transform-and-conquer) Nội dung      Chiến lược Biến thể-để-trị Giải thuật Gauss để giải hệ phương trình tuyến tính Cấu trúc heap heapsort Giải thuật Horner để định trị đa thức So trùng dòng ký tự giải thuật RabinKarp 1.Biến thể để trị (transform-and-conquer)  Kỹ thuật biến thể-để-trị thường làm việc theo hai bước    Bước bước biến thể, thể toán biến đổi để chuyển sang dạng dễ dẫn đến lời giải Bước bước tìm lời giải cho tốn Có nhiều biến dạng bước 1:    Biến thể để đưa đến thể đơn giản toán (đơn giản hóa thể -instance simplification) Biến thể để đưa đến biểu diễn khác toán (biến đổi biểu diễn -representation change) Biến thể để đưa đến thể toán khác mà có tồn giải thuật (thu giảm tốn - problem reduction) Giải thuật Gauss để giải hệ phương trình tuyến tính  Cho hệ phương trình gồm n phương trình với n ẩn số a11x1 + a12x2 + … + a1nxn = b1 a21x1 + a22x2 + … + a2nxn = b2 ; ; an1x1 + an2x2 + … + annxn = bn    Để giải hệ phương trình trên, ta dùng giải thuật loại trừ Gauss (Gauss elimination) Ý tưởng giải thuật : biến đổi hệ thống n phương trình tuyến tính với n biến thành hệ thống tương đương (tức có lời giải hệ phương trình ban đầu) với ma trận tam giác (một ma trận với hệ số zero đường chéo chính) Giải thuật Gauss thể tinh thần chiến lược biến thểđể-trị theo kiểu “đơn giản hóa thể hiện” (instance simplification) a11x1 + a12x2 + … + a1nxn = b1 a21x1 + a22x2 + … + a2nxn = b2 a’11x1 + a’12x2 + … + a’1nxn = b’1 a’22x2 + … + a’2nxn = b’2 ⇒ ; ; an1x1 + an2x2 + … + annxn = bn a’nnxn = b’n Làm cách để ta chuyển hệ thống với ma trận A thành hệ thống tương đương với ma trận tam giác A’? Bằng loạt phép biến đổi sau: - - Hốn vị hai phương trình hệ thống Thay phương trình phương trình nhân với hệ số Thay phương trình với tổng hay hiệu phương trình với phương trình khác nhân hệ số Thí dụ 2x1 – x2 + x3 =1 4x1 + x2 – x3 = x1 + x2 + x3 = -1 1 -2 1 -1 1 -3 3/2 ½ -1/2 -1 -3 0 -2 row – (4/2) row row – (1/2) row row – (1/2) row ⇒ x3 = (-2/2)=1; x2 = (3-(-3)x3/3 = 0; x1 = (1-x3 – (-1)x2)/2 = Giải thuật Gauss GaussElimination(A[1 n,1 n],b[1 n]) for i := to n A[i,n+1] := b[i]; for i := to n -1 for j := i + to n for k:= i to n+1 A[j,k] := A[j,k]-A[i,k]*A[j,i]/A[i,i]; Lưu ý: Vector cột b gom vào thành cột thứ n+1 ma trận A Trở ngại: Khi A[i,i] = 0, giải thuật không làm việc Và |A[i,i]| nhỏ, giải thuật bị sai số làm trịn máy tính tính tốn (round-off-error) gây ảnh hưởng xấu, làm cho tính tốn trở nên khơng xác Giải thuật Gauss cải tiến  Để tránh trường hợp |A[i,i]| nhỏ nêu trên, ta áp dụng kỹ thuật tìm phần tử chốt bán phần (partial pivoting) mô tả sau: “Tại lượt lặp thứ i vịng lặp ngồi, ta cần tìm hàng có hệ số cột thứ i mang giá trị tuyệt đối lớn hoán đổi hàng với hàng i dùng hệ số phần tử chốt lượt lặp thứ i” Giải thuật Gauss cải tiến BetterGaussElimination(A[1 n,1 n],b[1 n]) for i := to n A[i,n+1] := b[i]; for i := to n -1 pivotrow := i; for j := i+1 to n if |A[j,i]| > |A[pivotrow,i]| then pivotrow:= j; for k:= i to n+1 swap(A[i,k], A[pivotrow,k]); for j := i + to n temp:= A[j,i]/A[i,i]; for k:= i to n+1 A[j,k] := A[j,k]-A[i,k]*temp; Độ phức tạp giải thuật Gauss n-1 n n-1 n C(n) = Σi=1 Σj=i+1(n+1-i+1) = Σi=1 Σj=i+1(n+2-i) n-1 n-1 =Σi=1 (n+2-i)(n-(i+1)+1) = Σi=1 (n+2-i)(n-i) = (n+1)(n-1)+n(n-2)+ +3.1 n-1 n-1 n-1 =Σj=1(j+2)j = Σj=1 j2 + Σj=1 2j = (n-1)n(2n-1)/6 + 2(n-1)n/2 = n(n-1)(2n+5)/6 ≈ n3/3 = O(n3) Sau dùng giải thuật Gauss để đưa ma trận dạng ma trận tam giác trên, ta dùng phương pháp thay lùi (backward subsitution) để tính giá trị ẩn 10

Ngày đăng: 11/04/2023, 20:11

Xem thêm: