Bài giảng Kỹ thuật lập trình - Bài 3: Giải thuật cung cấp cho người học các kiến thức: Tìm kiếm, sắp xếp, đệ quy. Đây là một tài liệu hữu ích dành cho các bạn sinh viên đang theo học môn học này dùng làm tài liệu học tập, nghiên cứu.
Trịnh Thành Trung (ThS) trungtt@soict.hust.edu.vn Bài GIẢI THUẬT Các toán thực tế thường phức tạp Phải xác định o Các liệu liên quan đến toán o Các thao tác cần thiết để giải tốn Ví dụ Bài tốn Quản lý nhân viên quan Cần quản lý thông tin nào? Thông tin nhân viên: tên, ngày sinh, số bảo hiểm xã hội, phòng ban làm việc,… Cần thực thao tác quản lý nào? Tạo hồ sơ cho nhân viên vào làm Cập nhật số thông tin hồ sơ Tìm kiếm thơng tin nhân viên Ai phép thực thao tác nào? Giải thuật Các đặc trưng giải thuật Đầu vào (Input) Đầu (Output) tập lệnh để thực tác vụ định Độ xác (Precision) Hữu hạn (Finiteness) Đơn trị (Uniqueness) Tổng quát (Generality) Nội dung Tìm kiếm Sắp xếp Đệ quy Tìm kiếm Search Tìm kiếm Search Input ▪ Một tập phần tử liệu có cấu trúc ▪ Một khóa cần tìm Process ▪ Tìm phần tử có chứa khóa trùng với khóa cần tìm Output ▪ Vị trí phần tử có chứa khóa (nếu có) Phần tử liệu có cấu trúc khóa ▪ Phần tử liệu có cấu trúc: ▫ Dữ liệu khóa ▫ Các liệu thành phần khác ▪ Khóa: ▫ So sánh ▸ Có thể giá trị phần tử ▸ Có thể liệu thành phần phần tử ▫ Thường số ▪ Trích khóa từ phần tử liệu có cấu trúc: ▫ So sánh liệu thành phần Các giải thuật tìm kiếm Tìm kiếm ▪ Các phần tử tập đầu vào không xếp theo khóa tìm kiếm ▪ Q trình xử lý Duyệt tập đầu vào So sánh với khóa cần tìm tới tìm thấy khóa duyệt qua hết tập đầu vào mà chưa tìm thấy Tìm kiếm nhị phân ▪ Các phần tử tập đầu vào xếp theo khóa tìm kiếm ▪ Q trình xử lý So sánh khóa cần tìm với phần tử Nếu nhỏ tìm bên trái tập đầu vào Ngược lại tìm bên phải tập đầu vào Lặp lại động tác Sắp xếp Sort Đệ quy dạng đệ quy đuôi ▪ Xét thủ tục P dạng P(X) ≡ if B(X) then D(X) else { A(X) ; P(f(X)) ; } ▪ Trong đó: ▫ X tập biến (một nhiều biến) ▫ P(X) thủ tục đệ quy phụ thuộc X ▫ A(X); D(X) thao tác không đệ quy ▫ f(X) hàm biến đổi X Đệ quy dạng đệ quy đuôi ▪ Xét trình thi hành P(X) : ▫ gọi Po lần gọi P thứ (đầu tiên) P(X) ▫ P1 lần gọi P thứ (lần 2) P(f(X)) ▫ Pi lần gọi P thứ i (lần i + 1) P(f(f( f(X) ) ▫ ( P(fi(X)) hợp i lần hàm f ) ▪ Gọi Pi B(fi(X)) ▫ (false) { A gọi Pi+1 } ▫ (true) { D } ▪ Giả sử P gọi n +1 lần Khi lần gọi cuối (thứ n ) Pn B(fn(X)) = true, lệnh D thi hành chấm dứt thao tác gọi thủ tục P Đệ quy dạng đệ quy đuôi ▪Sơ đồ thực giải thuật vòng lặp While (!B(X)) { A(X); X = f(X); } D(X); Ví dụ Tìm ước chung lớn Giải thuật đệ quy int USCLN(int m, int n) { if (n == 0) return m; else USCLN(n, m % n); } ▪X là( m , n ) ▪P(X) USCLN(m ,n) ▪B(X) n == ▪D(X) lệnh return m ▪A(X) lệnh rỗng ▪f(X ) f(m,n) = ( n , m mod n ) Khử đệ quy int USCLN(int m , int n ) { while(n != ) { int sd = m % n ; m = n ; n = sd ; } return (m) ; } Khử đệ quy stack ▪ Trạng thái tiến trình xử lý giải thuật: nội dung biến lệnh cần thực ▪ Với tiến trình xử lý giải thuật đệ quy thời điểm thực hiện, cần lưu trữ trạng thái xử lý dang dở ▪ Xét giải thuật giai thừa FAC ( n ) ≡ if(n = ) then return 1; else return ( n * FAC (n –1)); ▪ Sơ đồ thực Thủ tục đệ quy tháp Hà Nội THN (n , A , B , C) THN (n : integer ; A ,B , C : char) ≡ { if (n > ) then { THN(n-1,A ,C ,B); Move(A, C); THN(n-1,B,A,C);} } Sơ đồ thực THN(3,A,B,C) Khử đệ quy stack ▪ Lời gọi đệ quy sinh lời gọi đệ quy gặp trường hợp suy biến (neo) ▪ Ở lần gọi, phải lưu trữ thông tin trạng thái dang dở tiến trình xử lý thời điểm gọi Số trạng thái số lần gọi chưa hoàn tất ▪ Khi thực xong (hồn tất) lần gọi, cần khơi phục lại tồn thông tin trạng thái trước gọi ▪ Lệnh gọi cuối (ứng với trương hợp neo) hoàn tất ▪ Cấu trúc liệu cho phép lưu trữ dãy thông tin thỏa yêu cầu cấu trúc lưu trữ thỏa mãn LIFO (Last In First Out ~ Cấu trúc stack) Chủ động tạo cấu trúc stack chuyên dụng Đệ quy có lệnh gọi trực tiếp ▪ Đệ quy có dạng sau: P(X) ≡ if C(X) then D(X) else begin A(X) ; P(f(X)) ; B(X) ; end; ▫ X biến đơn biến véc tơ ▫ C(X) biểu thức boolean X ▫ A(X) , B(X) , D(X): không đệ quy ▫ f(X) hàm X Đệ quy có lệnh gọi trực tiếp ▪ Giải thuật thực P(X) với việc sử dụng Stack có dạng P(X) ≡ { Create_Stack (S); ( tạo stack S ) While(not(C(X)) begin A(X); Push(S,X); ( cất gía trị X vào stack S ) X := f(X); end; D(X); While(not(EmptyS(S))) begin POP(S,X); ( lấy liệu từ S ) B(X); end; } Ví dụ Chuyển từ số thập phân sang nhị phân Đệ quy Khử đệ quy Binary(m) ≡ if ( m > ) then begin Binary( m / ) ; write( m % ) ; end; Binary (m) ≡ { Create_Stack(S); While ( m > ) begin sdu = m % ; Push(S,sdu) ; m = m / ; end; While(not(EmptyS(S)) begin POP(S,sdu) ; Write(sdu) ; end; } Trong ▫X m ▫P(X) Binary(m) ▫A(X) ; D(X) lệnh rỗng ▫B(X) lệnh Write(m % ) ; ▫C(X) ( m 0) 1, X, Z, Y); Z ); 1, Y, X, Z); Trong ▫Biến X (n,X,Y,Z) ▫C(X) n 0) begin Push (S ,(n,X,Y,Z,2)) ; n = n - 1; Swap (Y,Z) ; end ; Pop (S,(n,X,Y,Z,k)) ; if ( k ) then begin Move (X ,Z ) ; n = n - ; Swap (X,Y) ; end ; until ( k == ) ; } Ví dụ Cho dãy số 1,2,3,7,14,27,55,110,219 Viết hàm đệ quy tính số hạng thứ n dãy số (n > nhập từ bàn phím), tính tổng số hạng dãy Sau đó, khử đệ quy chương trình Thanks! Any questions? Email me at trungtt@soict.hust.edu.vn Presentation template by SlidesCarnival ... factorial(2) factorial(2) factorial (3) factorial (3) factorial (3) factorial (3) factorial (3) factorial (3) factorial (3) t Thời gian hệ thống Gọi hàm Gọi hàm factorial (3) factorial(2) Trả từ Gọi hàm Gọi... 1; else return (F(n -1 ) + F(n -2 )); } Ví dụ Tính tổng giá trị dãy số H(n), biết H(n) = n n 2 long H(int n) { if (n