Giáo trình Cấu trúc dữ liệu và thuật toán (Tái bản): Phần 2

115 1 0
Giáo trình Cấu trúc dữ liệu và thuật toán (Tái bản): Phần 2

Đ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 PHÂN TÍCH THUẬT TỐN 6.1 K HÁ I N IỆM Mỗi thuật tốn phải đảm bảo tính chất: - Các bước phải xác định rõ ràng, rành mạch từ bắt đầu đến kết thúc; - Tổng quát, xét khả năng, trường hợp toán; - Chi tiết, khả năng, trường hợp phải xác định cơng thức tính tốn hay dịng thơng báo kết xử lý; - Dễ cài đặt chương trình máy tính; - Hữu hạn: thời gian thực thuật toán chấp nhận Trong chương trước, ta học phương pháp trình bày thuật toán, dạng thuật toán Một tốn có nhiều cách giải khác nhau, có nhiều thuật tốn khác nhau, việc chọn thuật tốn để viết chương trình cho máy tính chuyên gia tin học đề cập đến từ lâu, lĩnh vực hình thành: nghiên cứu phân tích độ phức tạp, độ hiệu thuật tốn Ví dụ: Xét thuật tốn điển hình: Bài tốn lim kiếm nhị phan Cần xác định phẩn tử T có mảng X[1 N] hay không Đưa vào T Found =.false Đầu = Cuối = N WHILE đầu n 1; T2(n) = ( f 2(n)) nên c2, n2 cho T2(n) < c2f2(n)) với V n > n2, Đặt n0 = max(ri|, n2), với V n > n0 ta có: T,(n) + T2(n) < (C| + c2)max(f|(n), f2(n)) Có thể nói cách tổng quát sau: toán chia thành nhiểu tốn độ đo cấp độ thời gian thực thuật toán lấy theo cấp độ lốn cấp độ thành phần 6.2.4 Đ ánh giá thời gian thực câu lệnh Pascal Để đánh giá thời gian thực chương trình, ta phải biết câu lệnh thực lần Tuỳ theo loại lộnh, ta có tiêu đánh sau: Lệnh gán, lệnh read, write, goto có thịi gian thực hiên ( 1); Lệnh phức hợp để cặp begin end đánh giá theo quy tắc tổng trên; Lệnh IF T H E N SI ELSE S2, thời gian thực hiên là: 0(m ax(f,(n), f2(n)) f|(n), f2(n) cận thời gian thực lệnh SI, S2 Lệnh CASE đánh lệnh IF Lệnh lập (repeat until, while for do): thời gian thực thân vòng lặp f(n) số lần lặp tối đa g(n) thời gian thực lệnh lặp 0(f(n)g(n)) Đối với hàm đệ quy: Xét hàm đệ quy tính giai thừa sau: 156 Function giaithua(n:integer):integer; Begin if n < = then giaithua : = else giaithua : = n*giaithua(n-l); End; Ta đặt thời gian thực hàm với n T(n) Với n = thời gian thực hàm 0(1) Với n >1, thực hàm thời gian thực lệnh gán giaithua: = n*giaithua(n - 1), tức (1 ) cộng với T (n -l) Ta có quan hệ đệ quy: T (l) = 0(1); T(n) = 0(1) + T(n - 1) Ta T(n) T(n - 1), T(n - 2), T(2), T( 1): T(n) = 0(1) + 0(1 + +0(1) + T (l) = (n - 1)0(1) + T (l) = nc, = O(n) 6.2.5 Phân tích m ột sơ th u ậ t tốn 6.2.5.1 Hàm fỵbonacy Function fibonacy(n:integer):integer; Begin If n 2k < log2n => 2k +1 < log2n +1 Thời gian thực thuật toán (lo g 2n) 158 C hư ong CÁC THUẬT TOÁN SẮP XÊP 7.1 SẮP XẾP BẰNG CH Ọ N L ự A ĐƠN GIẢN C H O MÁNG 7.1.1 Bài toán Cho m ảng X|, x„ số thực bất kỳ, lập thuật toán xếp lại mảng theo thứ tự tăng dần 7.1.2 Sơ đồ th u ật tốn © 159 Đoạn cốt lõi chương trình sau: for I := to n-1 for j := i+ to n if x[i] Nil làm bưóc sau: a) Đặt trỏ SmallPtr : = p b) Đặt Sm allest: = Du_Lieu(SmallPtr); c) Đạt trỏ q : = Next(p) d) While q < > nil then begin if Du_Lieu(q) < Smallest then begin SmallPtr : = q; Sm allest: = Du_Lieu(q) end; q : = Next(q) end e) Du_Lieu(SmallPtr): = Du_Lieu(p) D u_Lieu(p): = Smallest g) p : = Next(p) 160 Sơ đồ thuật toán: 161 Theo sơ đồ Lany NuHoff (Tài liệu tham khảo số 2) For i: = to n-1 Do begin smallpos := i; Smallest := X[smallpos]; for j : = i+1 to n Do if x[j] < smallet then begin Smallpos := j; smallest := XỊsmallpos] end; X[smallpos]:=X[i]; x[i]:= smallest; end; Độ phức tạp (n -1 ) + (n - 2) + + +1 = — —= ( n 2) 7.3 SẮP XẾP KIỂU NỔI BỌT - SẮP XẾP DAN 7.3.1 X ét tốn Cho dãy sơ' thực X | , tăng dần theo kiểu bọt Xi, x3, xn, yêu cầu xếp lại theo trật tự 7.3.2 Phân tích tốn Sắp xếp bọt thực theo thuật toán: lần qua khơng có thứ tự xếp hai phần tử liền kề Theo phương pháp này, lần duyệt qua lượt danh sách, sô' phần tử lớn lên trên, số phần tử bé bị chìm xuống Bắt đầu t s o s n h X, v x Nếu X, > X t h ì h o n v ị Xị v x 2: x 2, Xị, X , , x n = > h o n đ ổ i c h ỉ s ố , X| v o vị t r í x v n g ợ c lạ i: kết quả: => X |, x 2, x 3.„ , x„ Tiếp tục so sánh x vối x3 X n.| xn Như kết thúc lần qua thứ nhất, phần tử lớn "nổi" lên cuối danh sách, vài phần tử "chìm" phía gần đầu danh sách 162 {#65: ma ASCII cua chu A) exit; end; #66: begin ch:=2; exit; end; #67: begin ch:=3; exit; end; #68: begin ch:=4; exit; end; #27: begin {neu nhan esc thi quay tro ve menu chinh } h e lp (200,100,500,170,3); b:=upcase(b); if b='C' then begin rem ove(d1,c1); rem ove(d2,c2); initq(d1,c1,d2,c2); close(f); nen_man_hinh; done:= true; end; end; #59: help(a1,b1,a2,b2,2); end; {of case key} {Tro ve Menu) 253 if not done then ve_menu(p,sott); end; {of while} End; procedure ad dq (var d,c:q;x:nut); {themmot gia tri vao queue} var p:q; i: integer; begin new(p); pA.cauhoi:=x.cauhoi; for i:=1 to pA.da:=x.da; pA.tl:=x.tl; pA.ds:= false; pA.lk:= nil; if d = nil then begin d:=p; c:=p; end else begin cA.lk:=p; c:=p; end; end; { } procedure duyetq(d,c:q;var done: boolean; ten:string; maso:string); {duyet queue} var p:q; ch.diem , c o u n tl, count2: integer; 254 x:nut; tg: string; a: char; begin diem:=0; p:=d; count1:=0; count2:=0; while p o n il begin chon_Doc(ch,p,done); if done then exit; if ch=pA.tl then begin diem := diem+1; pA.ds:=true; count1:= count1 + 1; end else begin x:= pA; addq(d2,c2,x); end; p:=pA.lk; end;{of while} p:=d2; {In bang ket qua} cleardevice; C u a _so (30,100 ,600 ,400 ,3,w h ite,8 ,7); C u a _so (40,110 ,590 ,390 ,2,w h ite,8 ,7); cu a_s o (4 5,11 5,58 5,16 5,2,8 ,w h ite,1 {b lu e}); settextstyle(1,horizdir,5); for i:=1 to 255 begin setcolor(black); outtextxy(80+i,115-i,'Ket Q ua Kiem Tra'); end; setcolor(11); outtextxy(80,115,'Ket Q ua Kiem Tra'); cua_so(45,200,585,385,2,8,w hite,5); settextsty le( horizdir, 1); setcolor(11); outtexb

Ngày đăng: 22/06/2023, 17:06

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

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

Tài liệu liên quan