Tìm kiếm trong Pascal

Thứ tư - 05/08/2020 09:34
1. TỐNG QUÁTMột trong các nhiệm vụ cơ bản của máy tính là tìm kiếm. Từ một cơ sở dữ liệu cho trước và một đối tượng cho trước ta phải trả lời hai câu hỏi:- Đối tượng có mặt trong cơ sở dữ liệu đó hay không ?- Nếu có thì cho biết vị trí của nó.
Để đơn giản hóa vấn đề ở đây chúng ta chỉ giới hạn vấn đề trong việc tìm một giá trị X (nguyên) xem có nằm trong một dãy các số nguyên hay không ?
Phương pháp tổng quát là đi so sánh X với các phần tử của dãy, nếu việc so sánh cho kết quả TRUE thì việc tìm kiếm thành công.
Có nhiều thuật toán để tìm kiếm, ỏ đây chúng ta chỉ xét 2 thuật toán cơ bản đó là:
- Tìm tuần tự (Sequential Search).
- Tìm nhị phân (Binary Search).

2. TÌM KIẾM TUẦN TỰ TRÊN MỘT DÃY CHƯA CÓ THỨ TỰ
a) Thuật toán
- So sánh từng phần tử của dãy A[1..n] với giá trị x.
- Trong khi đi từ phần tử đầu đến phần tử cuối của dãy:
+ Nếu tìm thấy giá trị x thì thoát ra và thông báo thứ tự của thành phần thứ i thỏa A[i] = x.
+ Nếu sau khi đi hết mà không tìm thấy thì việc tìm kiếm xem như kết thúc với kết quả là 0.
b) Lập trình Pascal
Function Tim (x: integer; A: Array[1..n] of integer);Word; Var i : word;
Begin
     i:= 1;
     While (i <= n) and not (x = A[i]) do
           inc (i);
      If i > n then Tim := 0
      Else Tim:= i;
End.

3. TÌM KIÊM TUẦN TỰ TRÊN MỘT DÃY ĐÃ CÓ THỨ TỰ
a) Thuật toán
- Thuật toán tìm tuần tự trong trường hợp xấu nhất là tìm không thấy do đó sẽ thực hiện n lần so sánh.
- Giả sử dãy A đã được sắp thứ tự tăng dần ta có thể cải tiến lại thuật toán trên để chạy nhanh hơn như sau:
+ Bắt đầu từ i = 1.
+ Trong khi (i <= n) và (A[i] < x) tăng i.
+ Nếu (i < n và A[i] > x) hay (i > n) thì:
• Không tìm thấy.
Ngược lại thì:
• Giá trị cần tìm ở thành phần thứ i.
b) Lập trình Pascal
Function Tim (x: integer; A: Array[1..n] of Integer): word;
Var i: word;
Begin
     i:= 1;
        While (i <= n) and (x > A[iJ) do
              Inc (i);
         If ((i <= n) and (A[i] > x)) or (i > n) then
             Tim:= 0
         Else
            Tim:= i;
End;
• Chú ý:
Nếu dãy được sắp xếp theo thứ tự giảm dần thì ta phải đảo điều kiện trong các biểu thức điều kiện như sau:
While (i <= n) and. (x < A[i])
If ((i <= n) and (A[i] < x)) or (i > n).

4. TÌM KIẾM TUẦN TỰ VỚI LÍNH CANH
a) Thuật toán
- Dùng một lính canh cụ thể là phần tử A[n + 1] có thể đơn giản hóa quá trình tự kiếm tuần tự.
- Trước khi tìm kiếm phần tử có giá trị bằng X trong đoạn dãy A[1..n] ta đặt giá trị đó tại trạm canh bằng lệnh gán:
                                                      a[n + 1]:= X;
- Nhờ có lính canh nên câu lệnh lặp:
REPEAT
     i:= i + 1
UNTIL
A[i] := x;
luôn luôn được kết thúc một cách tự nhiên, bởi vì trong trường hợp tìm được ta sẽ có A[i] = x với (1 < i < n), còn trong trường hợp giá trị x không có mặt trong mảng A[1..n] thì ta vẫn có:
A[i] := x với i = t + 1
- Việc dùng lính canh đòi hỏi mảng a phải chứa ít ra là n + 1 phần tử.
b) Lập trình Pascal
A[n + 1]:= x; {Đặt lính canh}
I := 0;
Repeat
    I := i + 1;
Until A[i]:= x;
If i <= n then writeln(i)
else Writein ('không tìm được');

5. TÌM KIẾM NHỊ PHÂN TRÊN MỘT MẢNG ĐƯỢC SẮP
a) Thuật toán
- Giả sử mảng A[1..n] đã được sắp thứ tự tăng dần.
- Ta chia đôi mảng A xem thành phần ở giữa có giá trị lớn hơn hay nhỏ hơn giá trị x để từ đó xác định nên tiếp tục tìm kiếm trên dãy trên hay dãy dưới. Giả sử chọn được dãy trên, tiếp tục chia đôi dãy trên để tìm kiếm cho đến khi gặp hoặc không thể chia đôi được nữa (nghĩa là không tìm thấy).
Ta dùng 3 biến Low, High, Mid để lưu giữ chỉ số của đầu, cuối, giữa của dãy đang tìm kiếm.
- Ban đầu cho Low:= 1; High:= n.
- Chừng nào High > Low thì thực hiện:
• Mid + (Low + Ligh) Div 2
• Nếu x > A[Mid] thì
  Low:= Mid + 1
  Ngược lại (x <= A[Mid]
• Nếu x < A[Mid] thì
  High:= Mid - 1
  Ngược lại (a = A[Mid])
  High:= -1
• Nếu High = -1 thì đã tìm thấy x tại thành phần thứ Mid.
Ngược lại không tìm thấy.
b) Lập trình Pascal
Function Tim (x: integer; A: Array[1..n] of integer): word;
Var
Low, High, Mid: integer;
Begin
    Low:= 1; High:= n;
    While High >= Low do
Begin
     Mid:= (High + Low) div 2;
     If (A[Mid] < x) then
         Low := Mid + 1
     else
         If (x < x[Mid] then
             High := Mid - 1
        Else
             High:= -1
      end;
  If high = -1 then Tim:= Mid; else Tim:= 0
Bản quyền bài viết thuộc về Sachgiai.com. Ghi nguồn Sách giải.com khi đăng lại bài viết này.

  Ý kiến bạn đọc

THÀNH VIÊN

Hãy đăng nhập thành viên để trải nghiệm đầy đủ các tiện ích trên site
Kênh Bóng đá trực tiếp hôm nay miễn phí
Kênh
90Phut TV full HD ⇔ 32win
RR88 ⇔ YO88 ⇔ bk8 ⇔ 123b

Vmax ⇔ SV388 ⇔ cakhiatv ⇔ bet88
789f ⇔ Cakhia TV ⇔ rikvip ⇔ 8x bet
https://qq887p.com/ ⇔ v9bet ⇔ okvip
b52club ⇔ Kkwin ⇔ new88 ⇔ Link MB66
https://88betcom.pro/ ⇔ 8x bet ⇔ 33win
789BET ⇔ shbet ⇔ 32 win ⇔ RR88
MB66 ⇔ Nổ Hũ ⇔ BL555 ⇔ b52 club
https://789betcom0.com/ ⇔ https://hi88.baby/
HZ88 ⇔ đá gà ⇔ sunwin ⇔ SHBET
hi88.biz ⇔ qq88 ⇔ i9 Bet ⇔ go88
f168 ⇔ 789F ⇔ j88 ⇔ 789win ⇔ 98win
88clb ⇔ 789win ⇔ HUBET ⇔ GK88
F168 ⇔ bet88 ⇔ QQ88 ⇔ bk8 ⇔ bk8
ee88 ⇔ iwinclub ⇔ MBET ⇔ net88
KING88 ⇔ soc88 ⇔ https://j88t3.com/
https://hi88.gives/ ⇔ 23win ⇔ 8kbet
78win ⇔ hi88 ⇔ https://fun88.social/
https://qq88z.net/ ⇔ I9BET ⇔ 7Club
https://qq88.fun/ ⇔ f168 ⇔ HUBET
daga ⇔ SHBET ⇔ keo nha cai ⇔ bl-555.site
https://bshbet.com/ ⇔ https://uk88.rocks
MM88 ⇔ Au88 ⇔ 88AA ⇔ 8kbet
https://luongson117.tv/ ⇔ https://hello8880.net/
xin 88 ⇔ https://78win01.locker/ ⇔ uu88
NOHU ⇔ bj88 live ⇔ 32win ⇔ Kuwin
Bay789 ⇔ w388 ⇔ sv388 ⇔ 23win
WW88 ⇔ https://f168.com.co/
7m ⇔ kuwin ⇔ https://789club24.com/
https://33win103.com/ ⇔ https://f168.group/
https://33win102.com/ ⇔ https://789p.co.com/
https://33win100.com/ ⇔ https://hi88.tours/
https://myeat.net/ ⇔ https://hi88.report/
https://58win1.info/ ⇔ https://f168.giving/
https://new88c.co/ ⇔ https://hello880.net/
https://789club60.com/ ⇔ 
F168 ⇔ E2BET ⇔ f168 ⇔ f168
88Vv ⇔ https://789club24.com/ ⇔ hi88com
win68 ⇔ 8xbet ⇔ Kubet ⇔ j88 ⇔ EV88
XX88 ⇔ KUBET ⇔ 99OK ⇔ RR88
88i ⇔ 33win ⇔ http://hi88.uno/
https://33win101.com/ ⇔ SHBET ⇔ Min88
hi88 ⇔ https://shbet.gg/ ⇔ SHBET
https://33winpro.me/ ⇔ bluphim ⇔
alo789 ⇔ hubet ⇔ UU88 ⇔ TG88
https://shbet.solar/ ⇔ https://daga.help/
https://pg88.ca/ ⇔ https://ok9599.com/
lương sơn tv ⇔ https://ww88i.club/
https://hi88.voyage/ ⇔ https://bk8co.net/
cakhiatv ⇔ https://23wincom.info
https://hi88o.com/ ⇔ https://f168.law/
https://88bett.vip/ ⇔ https://j88.ventures/
https://rcc.eu.com/ ⇔ https://j88com.limited/
New88 ⇔ https://j88.now/ ⇔ 79king
kubet ⇔ Okking ⇔ https://33win.software/
https://ww88star.com/ ⇔ vankhanhtv ⇔ ww88
https://88vvcom.net/ ⇔ https://okwin.technology/
bong88 ⇔ j88 ⇔ j88 ⇔ sunwin ⇔ sunwin
No hu ⇔ 888b ⇔ MM88 ⇔ go 88
kuwin ⇔ nhà cái uy tín ⇔ rwin ⇔ dt68
MM88 ⇔ Nh88 ⇔ RR88 ⇔ game sunwin
789win ⇔ https://ok365.fitness/
https://xx88.ink/ ⇔ https://79king.is/
S666 ⇔ xocdia88 ⇔ Sun Win ⇔ Vmax
tỷ lệ kèo nhà cái hôm nay ⇔ Link vào Kingfun
https://j88ss.com ⇔ https://qq88.studio/
https://mm88.blue/ ⇔ https://qq88.gives/
SUNCITYVivu88 ⇔ https://cakhiatv88.net/
https://shbet.is/ ⇔ https://13win.london/
https://789win.fund/ ⇔ https://nhacaiuytinso1.net/
nohu ⇔ https://abcvip.ru.com/ ⇔ RR88
https://king88.international/ ⇔ 33win ⇔ 98WIN
https://qq88.racing/ ⇔ https://j88uk.com
https://hubest.co/ ⇔ https://ww88.engineer/
https://muranoglass-shop.cn.com/ ⇔ J88
soi kèo nhà cái ⇔ https://king88.giving/
https://bet88.ventures/ ⇔ trực tiếp bóng đá
https://king88clb.com ⇔ E2bet ⇔ KUBET
https://sh-bet.com/ ⇔ 8xbet app ⇔ King 88
https://32win.vc/ ⇔ 88bet ⇔ PG88 ⇔ PG88
EE88 ⇔ B52Club ⇔ B52 Club ⇔ HB88
HB88 ⇔ Vin777 ⇔ SV388 ⇔ QQ88 ⇔ 32win
https://vankhanhtvv.com/ ⇔ https://luck8.world/
23WIN ⇔ bubet ⇔ https://u888lm.com/
tỷ lệ kèo nhà cái ⇔ 78win ⇔ https://789win01.club/
https://32win.domains/ ⇔ https://sv388.engineering/
https://8kbetbh.com/ ⇔ http://ta88club.kim/
https://orangeblossomjamboree.com
Bạn đã không sử dụng Site, Bấm vào đây để duy trì trạng thái đăng nhập. Thời gian chờ: 60 giây