Thuật toán tìm kiếm nhị phân
Tìm Kiếm Nhị Phân Vũ Anh Qn Thuật tốn tìm nhị phân hay cịn gọi phương pháp chia đơi ápdụng nhiều tin học Phương pháp làm giảm nhiều thời gian tìmkiếm, giúp chương trình chạy nhanh Sau xin giới thiệu số bàitoán sử dụng phương pháp Bàitoán 1: Xác định vị trí phần tử X bảng liệt kê sắpxếp tăng phần tử phân biệt A1, A2, , AN.(A1< A2< < AN) Bài giải: Chia đôi bảng liệt kê A1, A2, , AN thành bảng liệt kê: A1, A2, , Am Am+1,Am+2, , AN (trong m=(N+1) div 2) +Nếu X>Am thìtìm kiếm bảng liệt kê Am+1, Am+2, , AN +Nếu XA[m] then i:=m+1 else i:=m; end; if x=A[i] then VT:=i else VT:=0; End; Bài toán 2: Có N thành phố, cho biết đường nối từ thành phố bất kìi đến thành phố j (với i khác j) cho xe với trọng tải không quáC[i,j] qua Cho thành phố xuất phát x thành phố đích y Hãy tìm đườngđi từ thành phố x tới thành phố y mà trọng tải lớn Dữ liệu vàotrong file Thanhpho.inp có dạng Dịng đầu gồm số N,x,y (N ≤ 100) N dòng sau dòng N số nguyên không âm thể matrận C[i,j] (C[i,j]kiểu Integer) Kết file Thanhpho.out có dạng - Dịng đầu làtrọng tải lớn từ x tới y - Dòng hai làdãy thành phố từ x tới y Ví dụ: Thanhpho.inp 414 Thanhpho.out 0211 1234 1021 1102 1112 Bài giải: Cmax =MAX{Cij} với i khác j; Cmin =0; Kết toán nằm đoạn [ Cmin , Cmax] Đặt Ctg = (Cmax+Cmin)div Ta thử xem xe có trọng tải Ctg tồntại đường từ x tới y hay khơng? Dùng thuật tốn tìm kiếm theo chiều sâu(hoặc tìm kiếm theo chiều rộng) để xác định đường từ x tới y Chú ý nếuCtg ≤ C[i,j] từ thành phố i sang thành phố j Nếu tồn đường ta tìm kiếm tiếp đoạn [Ctg +1,Cmax ],và lưu kết Nếu khơng tồn đường ta tìm kiếm tiếp trongđoạn [Cmin ,Ctg -1] Cứ tiếp tục tìm kiếm đoạn có điểm đầu lớnhơn điểm cuối Chương trình thể thuật tốn sau: {$A+, B-, D+, E+, F-, G-, I+, L+, N-, O-, P-, Q+, R+,S+, T-, V+, X+} {$M 16384, 0, 655360} uses crt; const max = 100; fi = 'thanhpho.inp'; fo = 'thanhpho.out'; var c : array[1 max,1 max] of integer; dx,kq, lkq : array[1 max] ofinteger; cmin, cmax, ctg, ckq: word; n, x, y, dem, ldem : integer; ok : boolean; procedure docf; var f : text; i, j : integer; begin cmin:= 0; cmax:= 0; assign(f,fi); reset(f); readln(f,n,x,y); for i:=1 to n for j:=1 to n begin read (f, c[i,j]); if c[i,j]>cmax then cmax:=c[i,j]; end; close(f); end; procedure ghinhan; begin ckq:= ctg; ldem:= dem; lkq:= kq; ok:= true; end; procedure di(i: integer); var j: integer; begin if ok then exit; for j:=1 to n if (dx[j]=0) and (c[i,j]>=ctg) then begin dx[j]:=1; inc(dem); kq[dem]:=j; if j=y then ghinhan else di(j); if ok then exit; dec(dem); end; end; procedure lam; begin while cminCmax Chương trình thể thuật tốn {$A+, B-, D+, E+, F-, G-, I+, L+, N-, O-, P-, Q+, R+,S+, T-, V+, X+} {$M 16384, 0, 655360} uses crt; const max:= 100; fi:= 'canbacn.inp'; fo: = 'canbacn.out'; var s : string; n : integer; cmin, cmax, ctg: longint; procedure docf; var f : text; begin assign(f,fi); reset(f); readln(f,n); readln(f,s); close(f); end; function nhan(x:string; so: longint): string; var nho, tich : longint; k : integer; y : string; begin y:=''; nho:=0; for k:=length(x) downto begin tich:= so*(ord(x[k])-48)+nho; y:= chr(tich mod 10+48)+y; nho:= tich div 10; end; while nho>0 begin y:= chr(nho mod 10+48) + y; nho:= nho div 10; end; nhan:= y; end; function kiemtra: integer; var kq : string; k : integer; begin kq:= '1'; for k:=1 to n kq:= nhan(kq,ctg); if length(kq)=length(s) then begin if kq=s then kiemtra:=0 else if kq>s then kiemtra:=1 else kiemtra:=2; end; else if length(kq)>length(s) then kiemtra:=1 elsekiemtra:=2; end; procedure lam; var kt : integer; begin cmin:= 0; cmax:= 1000000; while cmin S tìm kiếm đoạn [Ctg+1 ,Cmax ] Nếu A < S tìm kiếm đoạn [ Cmin , C tg -1 ] Nếu A=S bậc N S Ctg Tiếp tục tìm kiếm Cmin >Cmax Chương trình thể thuật tốn {$A+,... đường ta tìm kiếm tiếp đoạn [Ctg +1,Cmax ],và lưu kết Nếu khơng tồn đường ta tìm kiếm tiếp trongđoạn [Cmin ,Ctg -1] Cứ tiếp tục tìm kiếm đoạn có điểm đầu lớnhơn điểm cuối Chương trình thể thuật. .. Cmin =0; Kết toán nằm đoạn [ Cmin , Cmax] Đặt Ctg = (Cmax+Cmin)div Ta thử xem xe có trọng tải Ctg tồntại đường từ x tới y hay khơng? Dùng thuật tốn tìm kiếm theo chiều sâu(hoặc tìm kiếm theo chiều