Giáo trình: Toán rời rạc - Đại học Thái Nguyên - chương III

22 1.3K 5
Giáo trình: Toán rời rạc - Đại học Thái Nguyên - chương III

Đ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

Giáo trình: Toán rời rạc - Đại học Thái Nguyên - chương III

Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH CHƯƠNG II BÀI TOÁN VÀ THUẬT TOÁN 2.1 KHÁI NIỆM BÀI TỐN 2.1.1 Bài tốn Trong phạm vi Tin học, ta quan niệm tốn việc ta muốn máy tính thực Viết dịng chữ hình, giải phương trình bậc hai, quản lí điểm trường học v.v… Khi dùng máy tính giải toán, ta cần quan tâm đến hai yếu tố: đưa vào máy thơng tin (Input) cần lấy thơng tin (Output) Do để phát biểu toán ta cần phải rõ Input Output tốn Ví dụ 1: Giải phương trình bậc ax+b=0 Input: Các giá trị thực a,b Output: Nghiệm giá trị x thông báo khơng có nghiệm Ví dụ 2: Quản lí điểm trường học Input: Thông tin cá nhân học sinh Output: Thông tin cần khai thác học sinh, lớp học sinh, khối hay toàn trường 2.1.2 Các bước giải tốn máy tính điện tử Học sử dụng máy tính thực chất học cách giao cho máy tính việc mà ta muốn làm Khả khai thác máy tính phụ thuộc nhiều vào hiểu biết người sử dụng.Việc giải tốn máy tính tiến hành qua bước sau: Bước 1: Xác định toán Như trình bày, tốn đặc tả hai thành phần: Input Output Việc xác định toán xác định rõ hai thành phần Các thơng tin cần nghiên cứu cẩn thận để lựa chọn thuật tốn, cách thể đại lượng cho đại lượng phát sinh q trình giải tốn ngơn ngữ lập trình thích hợp 20 Bài tốn thuật tốn Nguyễn Thế Vinh - ĐHKH Ví dụ, tốn Tin học đề cập đến số nguyên dương N ta phải biết rõ phạm vi giá trị nó, để lựa chọn cách thể N kiểu liệu thích hợp Bước 2: Lựa chọn thiết kế thuật toán Bước lựa chọn thiết kế thuật toán bước quan trọng để giải toán Mỗi thuật toán giải toán đó, có nhiều thuật tốn khác giải toán Cần chọn thuật toán phù hợp để giải toán cho Khi lựa chọn thuật toán người ta thường quan tâm đến tài nguyên CPU, số lượng ô nhớ, Trong loại tài nguyên, người ta quan tâm nhiều đến thời gian dạng tài ngun không tái tạo Trong thực tế, lựa chọn thuật tốn người ta cịn quan tâm tới việc viết chương trình cho thuật tốn dễ dàng Việc thiết kế lựa chọn thuật toán để giải toán cụ thể cần vào lượng tài ngun mà thuật tốn địi hỏi lượng tài ngun thực tế cho phép Bước 3: Viết chương trình Việc viết chương trình tổng hợp hữu việc lựa chọn cấu trúc liệu ngôn ngữ lập trình để diễn đạt thuật tốn Khi viết chương trình ta cần lựa chọn ngơn ngữ bậc cao, hợp ngữ, ngôn ngữ máy, phần mềm chun dụng thích hợp cho thuật tốn lựa chọn Viết chương trình ngơn ngữ ta cần phải tuân theo quy định ngữ pháp ngơn ngữ Chương trình dịch giúp ta phát thơng báo đầy đủ sai sót mặt ngữ pháp Bước 4: Hiệu chỉnh Sau viết xong, chương trình cịn có nhiều lỗi khác chưa phát nên chương trình khơng cho kết Vì vậy, cần phải thử chương trình cách thực với số Input tiêu biểu phụ thuộc vào đặc thù toán Các Input gọi Test Nếu 21 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH có sai sót, ta phải sửa chương trình thử lại Quá trình gọi hiệu chỉnh Bước 5: Viết tài liệu Tài liệu phải mơ tả chi tiết tốn, thuật tốn, chương trình, kết thử nghiệm hướng dẫn sử dụng Tài liệu có ích cho người sử dụng chương trình cho việc đề xuất khả hồn thiện thêm Các bước lặp lặp lại nhiều lần mà ta cho chương trình làm việc đắn 2.2 KHÁI NIỆM THUẬT TỐN 2.2.1 Định nghĩa Thuật tốn để giải toán dãy hữu hạn thao tác xếp theo trình tự xác định cho sau thực dãy thao tác đó, từ Input toán, ta nhận Output cần tìm Có nhiều cách trình bày thuật tốn: dùng ngơn ngữ tự nhiên; sơ đồ khối; ngơn ngữ lập trình(tựa Pascal) 2.2.2 Một số ví dụ Ví dụ 1: Mơ tả thuật tốn tìm phần tử lớn dãy hữu hạn số (nguyên thực) a) Dùng ngôn ngữ tự nhiên để mô tả bước cần phải thực hiện: Đặt giá trị cực đại tạm thời số dãy So sánh số tiếp sau với giá trị cực đại tạm thời, lớn giá trị cực đại tạm thời đặt cực đại tạm thời số Lặp lại bước cịn số dãy Dừng khơng cịn số dãy Cực đại tạm thời điểm số lớn dãy b) Dùng ngôn ngữ tựa Pascal: Procedure max (a1, a2, , an: Item); Begin max:= a1; for i:= to n if max 0 then S:= S+ ai; {S tổng phần tử dương} End; 2.2.3 Các đặc trưng thuật tốn Tính hữu hạn: Sau số hữu hạn lần thực thao tác thuật toán phải kết thúc; Tính xác định: Sau thực thao tác, thuật toán kết thúc có thao tác xác định để thực tiếp theo; Tính đắn: Sau thuật tốn kết thúc, ta phải nhận Output cần tìm; Tính chi tiết: Các thao tác thuật toán phải xác định cách chặt chẽ theo nghĩa đủ chi tiết để đối tượng thực thuật tốn làm được; Tính phổ dụng: Thuật tốn khơng cho phép giải toán đơn lẻ mà áp dụng cho lớp tốn có cấu trúc 23 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH 2.3 THUẬT TỐN TÌM KIẾM 2.3.1 Bài tốn tìm kiếm: Bài tốn xác định vị trí phần tử tập hữu hạn phần tử Chẳng hạn chương trình kiểm tra tả từ; tìm kiếm từ từ điển; tra cứu điểm thi đại học v.v….Các toán thuộc loại gọi tốn tìm kiếm Bài tốn tìm kiếm tổng qt mơ tả sau: xác định vị trí phần tử x dãy phần tử a1, a2, , an xác định khơng có mặt dãy Input: dãy số a1, a2, , an giá trị x Output: Nghiệm i x=ai x khơng có mặt dãy 2.3.2 Thuật tốn tìm kiếm tuyến tính: Tìm kiếm tuyến tính hay tìm kiếm Tư tưởng thuật toán bắt đầu việc so sánh x với a1; x=a1, nghiệm vị trí a1, tức 1; x≠a1, so sánh x với a2 Nếu x=a2, nghiệm vị trí a2, tức Khi x≠a2, so sánh x với a3 Tiếp tục trình cách so sánh x với số hạng dãy tìm số hạng x kết thúc dãy Dùng ngơn ngữ tựa Pascal: Procedure tìm kiếm tuyến tính (x: Item, a1,a2, ,an: Item); Begin i := 1; while (i ≤ n and x ≠ ai) if i ≤ n then kq := i i := i + 1; else kq := 0; End; {kq vị trí số hạng x khơng tìm x} 2.3.3 Thuật tốn tìm kiếm nhị phân: Thuật tốn dùng dãy số xếp đơn điệu theo thứ tự tăng giảm dần.Tư tưởng thuật toán chọn phần tử vị trí làm chốt, chia dãy thành phần có kích thước nhỏ Sau so sánh phần tử cần tìm x với chốt, x lớn chốt tìm nửa sau dãy, x nhỏ chốt tìm nửa trước dãy(áp dụng với dãy tăng), trình tiếp tục tìm x dãy chia khơng cịn phần tử 24 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH Ví dụ: Cho dãy số: A={-6,1,3,5,8,10,14,16,19,21 }; x=5; dãy gồm 10 phần tử Gọi phần tử chốt k, ban đầu k=8 Bước 1: k=8, so sánh x với k, xk ta tìm kiếm x nửa sau {3,5,8} Bước 3: k=5, so sánh x với k, x=k ta tìm x kết thúc Dùng ngôn ngữ tựa Pascal: {Thuật tốn áp dụng với dãy tăng dần} Procedure tìm kiếm nhị phân (x: Item, a1,a2, ,an: Item); Begin d := {d điểm đầu đoạn tìm kiếm} c := n {c điểm cuối đoạn tìm kiếm} while (d am then d:=m+1 else c := m-1 end if x = then kq := i else kq := {kq vị trí số hạng x khơng tìm thấy x} End; 2.4 ĐỘ PHỨC TẠP CỦA THUẬT TOÁN 2.4.1 Khái niệm độ phức tạp thuật toán Thước đo hiệu thuật tốn thời gian mà máy tính sử dụng để giải toán theo thuật toán xét, giá trị đầu vào có kích thước xác định Một thước đo thứ hai dung lượng nhớ địi hỏi để thực thuật tốn giá trị đầu vào có kích thước xác định Các vấn đề liên quan đến độ phức tạp tính tốn thuật tốn Sự phân tích thời gian cần thiết để giải tốn có kích thước đặc biệt liên quan đến độ phức tạp thời gian thuật tốn Sự phân tích nhớ cần thiết máy 25 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH tính liên quan đến độ phức tạp khơng gian thuật tốn Vệc xem xét độ phức tạp thời gian không gian thuật toán vấn đề thiết yếu thuật toán thực Biết thuật toán đưa đáp số micro giây, phút tỉ năm, hiển nhiên quan trọng Tương tự vậy, dung lượng nhớ đòi hỏi phải khả dụng để giải tốn,vì độ phức tạp khơng gian cần phải tính đến.Vì việc xem xét độ phức tạp không gian gắn liền với cấu trúc liệu đặc biệt dùng để thực thuật toán nên ta tập trung xem xét độ phức tạp thời gian Độ phức tạp thời gian thuật tốn biểu diễn qua số phép tốn dùng thuật tốn giá trị đầu vào có kích thước xác định Sở dĩ độ phức tạp thời gian mô tả thơng qua số phép tốn địi hỏi thay thời gian thực máy tính máy tính khác thực phép tính sơ cấp khoảng thời gian khác Hơn nữa, phân tích tất phép tốn thành phép tính bit sơ cấp mà máy tính sử dụng điều phức tạp Ví dụ: Xét thuật tốn tìm số lớn dãy n số a1, a2, , an Có thể coi kích thước liệu nhập số lượng phần tử dãy số, tức n Nếu coi lần so sánh hai số thuật tốn địi hỏi đơn vị thời gian (giây chẳng hạn) thời gian thực thuật tốn trường hợp xấu n-1 giây Với dãy 64 số, thời gian thực thuật toán nhiều 63 giây Ta nói độ phức tạp n-1 Ví dụ: Thuật toán toán “Tháp Hà Nội” Bài tốn “Tháp Hà Nội” sau: Có ba cọc A, B, C kim cương 64 đĩa vàng đĩa có đường kính đơi khác Nguyên tắc chuyển đĩa là: lần chuyển đĩa không chồng đĩa to lên đĩa nhỏ Ban đầu, 64 đĩa đặt chồng lên cột A; hai cột B, C trống Vấn đề phải chuyển 64 đĩa từ cột A sang cột B lấy cột C làm trung gian Xét trò chơi với n đĩa ban đầu cọc A (cọc B C trống) Gọi Sn số lần chuyển đĩa để chơi xong trò chơi với n đĩa 26 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH Nếu n=1 rõ ràng S1=1 Nếu n>1 trước hết ta chuyển n-1 đĩa bên sang cọc B (giữ yên đĩa thứ n cọc A) Số lần chuyển n-1 đĩa Sn-1 Sau ta chuyển đĩa thứ n từ cọc A sang cọc C Cuối cùng, ta chuyển n-1 đĩa từ cọc B sang cọc C (số lần chuyển Sn-1) Như vậy, số lần chuyển n đĩa từ A sang C là: Sn=Sn-1+1+Sn=2Sn-1+1=2(2Sn-2+1)+1=22Sn-2+2+1= =2n-1S1+2n2 + +2+1=2n−1 Thuật tốn tốn “Tháp Hà Nội” địi hỏi 264−1 lần chuyển đĩa (xấp xỉ 18,4 tỉ tỉ lần) Nếu lần chuyển đĩa giây thời gian thực thuật toán xấp xỉ 585 tỉ năm! Ta nói độ phức tạp 2n−1 Hai thí dụ cho thấy rằng: thuật toán phải kết thúc sau số hữu hạn bước, số hữu hạn q lớn thuật tốn khơng thể thực thực tế 2.4.2 So sánh độ phức tạp thuật tốn Một tốn thường có nhiều cách giải, có nhiều thuật tốn để giải, thuật tốn có độ phức tạp khác Xét tốn: Tính giá trị đa thức P(x)=anxn+an-1xn-1+ +a1x+a0 x0 Thuật tốn 1: Procedure tính giá trị đa thức (a0, a1, , an, x0: real); Begin S:=a0 for i:=1 to n S:=S+aix0i; End; {S giá trị đa thức P(x) x0} Chú ý đa thức P(x) viết dạng: P(x)=( ((anx+an-1)x+an-2)x )x+a0 Ta tính P(x) theo thuật tốn sau: 27 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH Thuật tốn 2: Procedure tính giá trị đa thức (a0, a1, , an, x0: real); Begin P:=an for i:=1 to n P:=P.x0+an-i; End; {P giá trị đa thức P(x) x0} Ta xét độ phức tạp hai thuật toán Đối với thuật toán 1: bước 2, phải thực phép nhân phép cộng với i=1; phép nhân phép cộng với i=2, , n phép nhân phép cộng với i=n Vậy số phép tính (nhân cộng) mà thuật tốn địi hỏi là: (1+1)+(2+1)+ +(n+1)= n(n + 1) n(n + 3) +n= 2 Đối với thuật toán 2, bước phải thực n lần, lần địi hỏi phép tính (nhân cộng), số phép tính (nhân cộng) mà thuật tốn địi hỏi 2n Nếu coi thời gian thực phép tính nhân cộng đơn vị thời gian với n cho trước, thời gian thực thuật tốn n(n+3)/2, cịn thời gian thực thuật toán 2n Rõ ràng thời gian thực thuật tốn so với thời gian thực thuật toán Hàm f1(n)=2n hàm bậc nhất, tăng chậm nhiều so với hàm bậc hai f2(n)=n(n+3)/2 Ta nói thuật tốn (có độ phức tạp 2n) thuật toán hữu hiệu (hay nhanh hơn) so với thuật tốn (có độ phức tạp n(n+3)/2) Để so sánh độ phức tạp thuật toán, điều tiện lợi coi độ phức tạp thuật toán cấp hàm biểu thời gian thực thuật toán Các hàm xét sau hàm biến số tự nhiên n>0 Định nghĩa 1: Ta nói hàm f(n) có cấp thấp hay hàm g(n) tồn số C>0 số tự nhiên n0 cho 28 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH |f(n)| ≤ C|g(n)| với n≥n0 Ta viết f(n)=O(g(n)) cịn nói f(n) thoả mãn quan hệ big-O (o lớn) g(n) Theo định nghĩa này, hàm g(n) hàm đơn giản được, đại diện cho “sự biến thiên” f(n) Khái niệm big-O dùng toán học gần kỷ Trong tin học, sử dụng rộng rãi để phân tích thuật toán Nhà toán học người Đức Paul Bachmann người đưa khái niệm big-O vào năm 1892 Ví dụ: Hàm f(n)= n(n + 3) hàm bậc hai hàm bậc hai đơn giản n2 Ta có: f(n)= n(n + 3) n(n + 3) =O(n2) ≤ n2 với n≥3 (C=1, n0=3) 2 Một cách tổng quát, f(n)=aknk+ak-1nk-1+ +a1n+a0 f(n)=O(nk) Thật vậy, với n>1, |f(n)|| ≤ |ak|nk+|ak-1|nk-1+ +|a1|n+|a0| = nk(|ak|+|ak-1|/n+ +|a1|/nk-1+a0/nk) ≤ nk(|ak|+|ak-1|+ +|a1|+a0) Điều chứng tỏ |f(n)| ≤ Cnk với n>1 Cho g(n)=3n+5nlog2n, ta có g(n)=O(nlog2n) Thật vậy, 3n+5nlog2n = n(3+5log2n) ≤ n(log2n+5log2n) = 6nlog2n với n≥8 (C=6, n0=8) Mệnh đề: Cho f1(n)=O(g1(n)) f2(n) O(g2(n)) Khi (f1 + f2)(n) = O(max(|g1(n)|,|g2(n)|), (f1f2)(n) = O(g1(n)g2(n)) Chứng minh Theo giả thiết, tồn C1, C2, n1, n2 cho |f1(n)| ≤ C1|g1(n)| |f2(n)| ≤ C2|g2(n)| với n > n1 n > n2 Do |(f1 + f2)(n)| = |f1(n) + f2(n)| ≤ |f1(n)| + |f2(n)| ≤ C1|g1(n)| + C2|g2(n)| ≤ (C1+C2)g(n) với n > n0=max(n1,n2), đâyC=C1+C2 g(n)=max(|g1(n)| , |g2(n)|) |(f1f2)(n)| = |f1(n)||f2(n)| ≤ C1|g1(n)|C2|g2(n)| ≤ C1C2|(g1g2)(n)| với n > n0=max(n1,n2) 29 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH Định nghĩa 2: Nếu thuật tốn có độ phức tạp f(n) với f(n)=O(g(n)) ta nói thuật tốn có độ phức tạp O(g(n)) Nếu có hai thuật tốn giải tốn, thuật tốn có độ phức tạp O(g1(n)), thuật tốn có độ phức tạp O(g2(n)), mà g1(n) có cấp thấp g2(n), ta nói thuật toán hữu hiệu (hay nhanh hơn) thuật toán 2.4.3 Đánh giá độ phức tạp thuật tốn 2.4.3.1 Thuật tốn tìm kiếm tuyến tính Số phép so sánh dùng thuật toán xem thước đo độ phức tạp thời gian Ở bước vịng lặp thuật tốn, có hai phép so sánh thực hiện: để xem tới cuối bảng chưa để so sánh phần tử x với số hạng bảng Cuối phép so sánh làm ngồi vịng lặp Do đó, x=ai, có 2i+1 phép so sánh sử dụng Số phép so sánh nhiều nhất, 2n+2, đòi hỏi phải sử dụng phần tử x mặt bảng Từ đó, thuật tốn tìm kiếm tuyến tính có độ phức tạp O(n) 2.4.3.2 Thuật tốn tìm kiếm nhị phân Để đơn giản, ta giả sử có n=2k phần tử bảng liệt kê a1,a2, ,an, với k số nguyên không âm (nếu n khơng phải lũy thừa 2, ta xem bảng phần bảng gồm 2k+1 phần tử, k số nguyên nhỏ cho n < 2k+1) Ở giai đoạn thuật tốn vị trí số hạng i số hạng cuối j bảng hạn chế tìm kiếm giai đoạn so sánh để xem bảng nhiều phần tử hay không Nếu i < j, phép so sánh làm để xác định x có lớn số hạng bảng hạn chế hay khơng Như giai đoạn, có sử dụng hai phép so sánh Khi bảng phần tử, phép so sánh cho biết khơng cịn phần tử thêm phép so sánh cho biết số hạng có phải x hay khơng Tóm lại cần phải có nhiều 2k+2=2[log2n]+2 phép so sánh để thực phép tìm kiếm nhị phân (nếu n khơng phải lũy thừa 2, bảng gốc mở rộng tới bảng có 2k+1 phần tử, với k=[log2n] tìm kiếm địi hỏi phải thực nhiều 2[log2n]+2 30 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH phép so sánh) Do thuật tốn tìm kiếm nhị phân có độ phức tạp O(log2n) Từ phân tích suy thuật tốn tìm kiếm nhị phân, trường hợp xấu nhất, hiệu thuật tốn tìm kiếm tuyến tính Các thuật ngữ thường dùng cho độ phức tạp thuật toán Độ phức tạp Thuật ngữ O(1) Độ phức tạp số O(logn) Độ phức tạp lơgarit O(n) Độ phức tạp tuyến tính O(nlogn) Độ phức tạp nlogn O(nb) Độ phức tạp đa thức O(bn) (b>1) Độ phức tạp hàm mũ O(n!) Độ phức tạp giai thừa Thời gian máy tính dùng thuật tốn Các phép tính bit sử dụng Kích thước n logn N 10 102 103 104 105 106 -9 -8 3.10 s 7.10-9 s 1,0.10-8 s 1,3.10-8 s 1,7.10-8 s 2.10-8 s 10 s 10-7 s 10-6 s 10-5 s 10-4 s 10-3 s nlogn -8 3.10 s 7.10-7 s 1.10-5 s 1.10-4 s 2.10-3 s 2.10-2 s n2 -7 10 s 10-5 s 10-3 s 10-1 s 10 s 17 phút 2n n! -6 3.10-3 s * * * * * 10 s 4.1013năm * * * * 2.5 SỐ NGUN VÀ THUẬT TỐN 2.5.1 Thuật tốn Euclide Phương pháp tính ước chung lớn hai số cách dùng phân tích số ngun thừa số nguyên tố không hiệu Lý chỗ thời gian phải tiêu tốn cho phân tích Dưới phương pháp hiệu để tìm ước số chung lớn nhất, gọi thuật toán Euclide Thuật toán biết từ thời cổ đại Nó mang tên nhà tốn học cổ Hy lạp Euclide, người 31 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH mơ tả thuật tốn sách “Những yếu tố” tiếng ông Thuật toán Euclide dựa vào mệnh đề sau Mệnh đề 1: Cho a b hai số nguyên b≠0 Khi tồn hai số nguyên q r cho a = bq+r, ≤ r < |b| Trong đẳng thức trên, b gọi số chia, a gọi số bị chia, q gọi thương số r gọi số dư Mệnh đề 2: Cho a = bq + r, a, b, q, r số nguyên Khi UCLN(a,b) = UCLN(b,r) (Ở UCLN(a,b) để ước chung lớn a b.) Giả sử a b hai số nguyên dương với a ≥ b Đặt r0 = a r1 = b Bằng cách áp dụng liên tiếp thuật tốn chia, ta tìm được: r0 = r1q1 + r2 ≤ r2 < r1 r1 = r2q2 + r3 ≤ r3 < r2 rn-2 = rn-1qn-1 + rn ≤ rn < rn-1 rn-1 = rnqn Cuối cùng, số dư xuất dãy phép chia liên tiếp, dãy số dư a = r0 > r1 > r2 > ≥ chứa a số hạng Hơn nữa, từ Mệnh đề ta suy ra: UCLN(a,b) = UCLN(r0,r1) = UCLN(r1,r2) = = UCLN(rn-1,rn) = rn Do đó, ước chung lớn số dư khác không cuối dãy phép chia Ví dụ: Dùng thuật tốn Euclide tìm UCLN(414, 662) 662 = 441.1 + 248 414 = 248.1 + 166 248 = 166.1+ 82 166 = 82.2 + 82 = 2.41 Do đó, UCLN(414, 662) = 32 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH 2.5.2 Biểu diễn số hệ đếm khác 2.5.2.1 Biến đổi biểu diễn số hệ đếm khác sang hệ thập phân Cho số N hệ đếm số b: N = (dn dn-1 dn-2 d1 d 0, d -1 d -2 d -m)b ( N = bdnbdn-1 bd0.bd-1bd-2 bd-m) Trước hết xét trường hợp N nguyên Để tìm biểu diễn số nguyên N hệ đếm thập phân, ta tiến hành bước sau: Bước Viết N dạng đa thức số b: N = dn bn + dn-1 bn-1 + dn-2 bn-2 + + d0b0 Bước Tính giá trị đa thức Trường hợp ngồi phần ngun cịn có phần phân ta tách phần nguyên phần phân Mỗi phần biến đổi riêng sau hai kết kết nối để có kết cần tìm Ví dụ 1110,1012 = ?10 Sau tách ra, ta có phần nguyên 1110 phần phân 101 Với phần nguyên ta có: 11102 = × 23 + × 22 + × 21 + × 20 = 1410 Tương tự, với phần phân, ta có: 0,1012 = × 2-1 + × 2-2 + × 2-3 = 0,5 + 0,125 = 0,62510 Vậy 1110,1012 = 14,62510 Một ví dụ khác, D3F,416 = ?10 Cũng thực trên, ta có: Phần ngun: D3F16 = D × 162 + × 161 + F × 160 = 13 × 16 × 16 + × 16 + 15 × = 3391 Phần phân: 0,416 = x 16-1= 0,25 Vậy, D3F,416 = 3391,2510 2.5.2.2 Biến đổi biểu diễn số hệ thập phân sang hệ đếm số khác Trước hết ta tách phần nguyên phần phân tiến hành biến đổi chúng riêng biệt, sau ghép lại để có kết cần tìm a) Biến đổi biểu diễn số nguyên Cho N số tự nhiên Ta viết N duới dạng đa thức: 33 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH N = dn bn + dn-1 bn-1 + + d0 (1) Nhận xét rằng, ≤ d0 < b Do vậy, chia N cho b phần dư phép chia d0 cịn thương số N1 là: N1 = dn bn-1 + dn-1 bn-2 + + d1 (2) Tương tự, d1 phần dư phép chia N1 cho b Gọi N2 thương phép chia Q trình chia thực liên tiếp ta nhận giá trị di Quá trình dừng lại nhận thương số Để có biểu diễn cần tìm, phần dư thu cần xếp theo thứ tự ngược lại Ví dụ: 5210 = ?2 = ?16 Sau thực theo cách ta có: 5210 = 1101002 5210 = 3416 b) Biến đổi biểu diễn phần phân Kí hiệu N' phần phân (phần sau dấu phẩy thập phân) số N Giả sử N’ viết dạng đa thức số b sau: N' = d-1 b-1 + d-2 b-2 + + d-m b-m (1') Nhân hai vế (1') với b, ta thu được: N'1 = d-1 + d-2 b-1 + + d-m b-(m-1) Ta nhận thấy d-1 phần nguyên kết phép nhân Còn phần phân kết là: N'2 = d-2 b-1 + + d-m b-(m-1) (2') Lặp lại phép nhân (2'), ta thu d-2 phần nguyên Thực liên tiếp phép nhân theo cách trên, cuối thu dãy d-1 d-2 d3 , ≤ d-i < b Ví dụ: 0,6787510 = ?2 Thực phép nhân theo cách trên, ta có kết quả: 0,6787510 = 0,101000001 Cũng thực theo cách tương tự ta có, ví dụ 0,843510 = 0,D7EF16 2.5.2.3 Biến đổi biểu diễn số hệ nhị phân hệ Hexa Hệ nhị phân hệ Hexa hai hệ đếm thường dùng Tin học Vì 16 luỹ thừa (16 = 24) nên việc biến đổi biểu diễn số hai hệ đếm 34 Bài toán thuật tốn Nguyễn Thế Vinh - ĐHKH thực dễ dàng Để đổi biểu diễn số từ hệ nhị phân sang hệ 16 ta áp dụng quy tắc thực hành sau: Gộp chữ số nhị phân thành nhóm chữ số hai phía kể từ vị trí phân cách phần nguyên phần phân Thay nhóm chữ số nhị phân kí tự tương ứng hệ đếm 16 Ví dụ: 1011100101,112 =?16 Gộp thành nhóm bốn chữ số nhị phân: 0010 1110 0101,11002 Thay nhóm nhị phân kí tự hệ 16 tương ứng: 2, E, 5, C Từ ta có: 1011100101,112 = 2E5,C16 Để biến đổi biểu diễn số hệ 16 sang biểu diễn số hệ nhị phân ta cần thay kí tự hệ 16 nhóm kí tự tương ứng hệ nhị phân Ví dụ : 3,D7EF16 = 0011,1101 0111 1110 11112 2.6 THUẬT TOÁN ĐỆ QUY 2.6.1 Khái niệm đệ quy Đôi quy việc giải tốn với tập liệu đầu vào xác định việc giải tốn với giá trị đầu vào nhỏ Chẳng hạn, tốn tìm UCLN hai số a, b với a > b rút gọn tốn tìm ƯCLN hai số nhỏ hơn, a mod b b Khi việc rút gọn thực lời giải tốn ban đầu tìm dãy phép rút gọn trường hợp mà ta dễ dàng nhận lời giải toán Ta thấy thuật toán rút gọn liên tiếp toán ban đầu tới toán có liệu đầu vào nhỏ hơn, áp dụng lớp rộng toán Định nghĩa: Một thuật tốn gọi đệ quy giải toán cách rút gọn liên tiếp toán ban đầu tới toán có liệu đầu vào nhỏ 2.6.2 Một số ví dụ Ví dụ 1: Tìm thuật tốn đệ quy tính giá trị an với a số thực khác không n số nguyên không âm 35 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH Ta xây dựng thuật toán đệ quy nhờ định nghĩa đệ quy an, an+1=a.an với n>0 n=0 a0=1 Vậy để tính an ta quy trường hợp có số mũ n nhỏ hơn, n=0 Function power (a, n):Item; Begin if n = then power := else power := a * power(a,n-1) End; Ví dụ 2: Tìm thuật tốn đệ quy để tính UCLN hai số ngun a,b khơng âm Function UCLN (a,b) :Item; Begin if a=b then UCLN := a else if a>b then UCLN := UCLN (a-b,b) else UCLN:=UCLN(a,b-a) End; Ví dụ 3: Hãy biểu diễn thuật tốn tìm kiếm tuyến tính thủ tục đệ quy Để tìm x dãy tìm kiếm a1,a2, ,an bước thứ i thuật toán ta so sánh x với Nếu x i vị trí cần tìm, ngược lại việc tìm kiếm quy dãy có số phần tử hơn, cụ thể dãy ai+1, ,an Thuật tốn tìm kiếm có dạng thủ tục đệ quy sau Cho search (i,j,x) thủ tục tìm số x dãy ai, ai+1, , aj Dữ liệu đầu vào ba (1,n,x) Thủ tục dừng số hạng dãy lại x dãy cịn lại có phần tử khác x Nếu x khơng số hạng cịn có số hạng khác lại áp dụng thủ tục này, dãy tìm kiếm phần tử nhận cách xóa phần tử dãy tìm kiếm bước vừa qua Procedure search (i,j,x); Begin if = x then loacation := i 36 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH else if i = j then loacation := else search (i+1,j,x) End; Ví dụ 4: Hãy xây dựng phiên đệ quy thuật tốn tìm kiếm nhị phân Giả sử ta muốn định vị x dãy a1, a2, , an tìm kiếm nhị phân Trước tiên ta so sánh x với số hạng a[(n+1)/2] Nếu chúng thuật tốn kết thúc, khơng ta chuyển sang tìm kiếm dãy ngắn hơn, nửa đầu dãy x nhỏ giá trị của dãy xuất phát, nửa sau ngược lại Như ta rút gọn việc giải toán tìm kiếm việc giải tốn dãy tìm kiếm có độ dài giảm nửa Procedure binary search (x,i,j); Begin m := [(i+j)/2]; if x = am then loacation := m else if (x < am and i < m) then binary search (x,i,m-1) else if (x > am and j > m) then binary search (x,m+1,j) else loacation := 0; End; 2.6.3 Đệ quy lặp Một yêu cầu đặt cho với tốn dùng thủ tục đệ quy, dùng thủ tục lặp thủ tục tối ưu ta tìm hiểu qua ví dụ tính n! với n số nguyên dương đủ lớn dãy số Fibonacci Hàm đệ quy Function factorial (n):Item; Begin if n = then factorial := else factorial:= n * factorial(n-1) End; 37 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH Có cách khác tính hàm giai thừa số nguyên từ định nghĩa đệ quy Thay cho việc rút gọn việc tính tốn cho giá trị nhỏ hơn, ta xuất phát từ giá trị hàm 1và áp dụng định nghĩa đệ quy để tìm giá trị hàm số nguyên lớn dần Đó thủ tục lặp Thủ tục lặp Procedure iterative factorial (n) Begin gt := 1; for i := to n gt := i * gt; {gt= n!} End; Thơng thường để tính dãy giá trị định nghĩa đệ quy, dùng phương pháp lặp số phép tính dùng thuật toán đệ quy (trừ dùng máy đệ quy chuyên dụng) Ta xem xét tốn tính số hạng thứ n dãy Fibonacci Hàm đệ quy Function fibonacci (n):Item; Begin if n = the fibonacci := else if n = then fibonacci := else fibonacci := fibonacci(n - 1) + fibonacci(n - 2) End; Theo thuật tốn này, để tìm fn ta biểu diễn fn = fn-1 + fn-2 Sau thay hai số tổng hai số Fibonacci bậc thấp hơn, tiếp tục f0 f1 xuất thay giá trị chúng theo định nghĩa Do để tính fn cần fn+1-1 phép cộng Bây ta tính phép tốn cần dùng để tính fn sử dụng phương pháp lặp Thủ tục khởi tạo x f0 = y f1 = Khi vòng lặp duyệt qua tổng x y gán cho biến phụ z Sau x gán giá trị y y gán giá trị z Vậy sau qua vịng lặp lần 1, ta có x = f1 y = f0 + f1 = f2 Khi qua vịng lặp lần n-1 x = fn-1 Như có n – phép cộng dùng để tìm fn n > 38 Bài toán thuật toán Nguyễn Thế Vinh - ĐHKH Thủ tục lặp Procedure Iterative fibonacci (n); Begin if n = then a := else begin a := ; b := 1; for i := to n - begin c := a + b; a := b ; b := c;end; end; {c số Fibonacci thứ n} End; Ta số phép toán dùng thuật toán đệ quy nhiều dùng phương pháp lặp Tuy nhiên người ta thích dùng thủ tục đệ quy tỏ hiệu so với thủ tục lặp Đặc biệt, có tốn giải thủ tục đệ quy mà giải thủ tục lặp 39 ... 106 -9 -8 3.10 s 7.1 0-9 s 1,0.1 0-8 s 1,3.1 0-8 s 1,7.1 0-8 s 2.1 0-8 s 10 s 1 0-7 s 1 0-6 s 1 0-5 s 1 0-4 s 1 0-3 s nlogn -8 3.10 s 7.1 0-7 s 1.1 0-5 s 1.1 0-4 s 2.1 0-3 s 2.1 0-2 s n2 -7 10 s 1 0-5 s 1 0-3 ... = d-1 b-1 + d-2 b-2 + + d-m b-m (1'') Nhân hai vế (1'') với b, ta thu được: N''1 = d-1 + d-2 b-1 + + d-m b-(m-1) Ta nhận thấy d-1 phần nguyên kết phép nhân Còn phần phân kết là: N''2 = d-2 b-1... chuyển n-1 đĩa từ cọc B sang cọc C (số lần chuyển Sn-1) Như vậy, số lần chuyển n đĩa từ A sang C là: Sn=Sn-1+1+Sn=2Sn-1+1=2(2Sn-2+1)+1=22Sn-2+2+1= =2n-1S1+2n2 + +2+1=2n−1 Thuật toán toán “Tháp

Ngày đăng: 12/09/2012, 22:08

Từ khóa liên quan

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

Tài liệu liên quan