1. Trang chủ
  2. » Cao đẳng - Đại học

Chương 8 tìm kiếm searching

34 77 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 34
Dung lượng 212 KB

Nội dung

53 Chương Tìm kiếm - Searching 8.1 - Phát biểu tổng qt Bài tốn tìm kiếm Tìm kiếm đòi hỏi thường xuyên đời sống hàng ngày xử lý tin học Ngay chương trước ta thấy xuất yêu cầu tìm kiếm Tuy nhiên, lúc vấn đề xét giải mối quan hệ mật thiết với phép xử lý chính, phép xếp Còn bây giờ, chương này, tốn tìm kiếm đặt cách độc lập tổng qt, khơng có liên quan đến mục đích xử lý cụ thể khác Ta phát biểu toán sau [ , ] : “Cho bảng gồm n ghi R1, R2, , Rn Mỗi ghi R1 (1 ≤ i ≤ n) tương ứng với khoá k i Hãy tìm ghi có giá trị khố tương ứng X cho trước” X gọi khố tìm kiếm hay đối trị tìm kiếm (argument) Cơng việc tìm kiếm hồn thành có hai tình sau xảy 1- Tìm ghi có giá trị khố tương ứng X, lúc ta nói: phép tìm kiếm thoả mãn (successful) - Khơng tìm ghi có giá trị khố X cả: phép tìm kiếm khơng thoả (unsuccessful) Sau phép tìm kiếm khơng thoả có xuất u cầu bổ sung thêm ghi có khố X vào bảng Giải thuật thể yêu cầu gọi giải thuật “ tìm kiếm có bổ sung” Tương tự xếp, khố ghi đặc điểm nhận biết ghi tìm kiếm, ta coi đại diện cho ghi giải thuật, ví dụ ta nói tới khoá Để cho tiện, ta xét tới 53 54 phương pháp tìm kiếm phổ dụng, liệu chứa nhớ - Tìm kiếm ( sequential searching) Tìm kiếm kỹ thuật tìm kiếm đơn giản cổ điển Nội dung tóm tắt sau: “Bắt đầu từ ghi thứ nhất, so sánh khố tìm kiếm với khố tương ứng ghi bảng , tìm ghi mong muốn hết bảng mà chưa thấy” Cho dãy khoá k gồm n phần tử Thủ tục thực tìm kiếm dãy có khố X khơng Nếu có đưa số khố ấy, khơng đưa giá trị Trong thủ tục có sử dụng khố phụ kn+1 mà giá trị X Sau giải thuật: Function SeqChearching(k: Vector; Var n :integer) : real; Var i: integer; x: real; Begin i : = 1; k[n+1] : = x; (*Dùng khố phụ k(n+1) có giá trị x*) if k[i] < > x then I : = I+1; If I = n+1 then SeqChearching : = 0; Else SeqChearching : = I; End; 54 55 Ta thấy giải thuật số lượng lần so sánh nằm khoảng [ Cmin = 1; Cmax = n+1] khố cần tìm trùng với khố Ctb = (n+1)/2 [8] Phân tích giải thuật tìm kiếm [8] đây, để đánh giá hiệu lực phép tìm kiếm ta dựa vào số lượng phép so sánh Ta thấy với giải thuật thuận lợi cần phép so sánh: Cmin = ; xấu Cmax = n +1 Nếu giả sử tượng khoá tìm kiếm trùng với khố bảng đồng khả Ctb = n+ Tóm lại trường hợp xấu trung bình, cấp độ lớn thời gian thực giải thuật O (n) Nhưng xác suất để xuất k i = X pi mà pi ≠ sao? n Lúc ta có Ctb = *p1+2*p2+ + n* pn n Với ∑ pi = i =1 Rõ ràng p1 ≥ p2 ≥ ≥ pn thời gian trung bình nhỏ Nhưng muốn phải xếp trước - Tìm kiếm nhị phân (Binary searching) Tìm kiếm nhị phân phương pháp tìm kiếm thơng dụng Nó tương tự cách thức ta làm tra tìm số điện thoại quan, bảng danh mục điện thoại hay tìm từ từ điển Chỉ có điều khác công việc để so sánh với khố tìm kiếm ta chọn hú hoạ 55 56 phần tử, với phép tìm kiếm nhị phân ln ln chọn khố “ở giữa” dãy khoá xét để thực so sánh với khố tìm kiếm Giả sử dãy khố xét k1, , kr khố dãy 1 + r  ki với i =   Tìm kiếm kết thúc X = ki Nếu X <   ki tìm kiếm thực tiếp với k1, , ki-1; X > ki tìm kiếm lại làm với k i+1, , kr Với dãy khoá sau, kỹ thuật tương tự lại sử dụng Quá trình tìm kiếm tiếp tục tìm thấy khố mong muốn dãy khố sét trở nên rỗng ( khơng thấy) Ta trình bày tổng quát tư tưởng giải thuật tìm kiếm nhị phân sau : Giả sử dãy khoá K 1, K2, Kn Xác định khoá dãy theo công thức k [ (1+n) mod 2] - Nếu X = Ki trình kết thúc - Nếu X < Ki trình tìm kiếm thực với dãy số K1,K2, Ki-1 - Nếu X > Ki trình tìm kiếm thực với dãy Ki+1, kn Với dãy khố sau, kỹ thuật tìm kiếm lại lặp lại tương tự: Ta xét ví dụ sau đây: Cho số hiệu hoá đơn xuất kho sau: 10 45 41 63 21 98 18 91 34 73 72 101 14 25 100 102 125 97 105 26 19 69 87 46 Tìm hố đơn có số hiệu 73 Để thực giải thuật tìm kiếm nhị phân trước hết ta phải xếp lại dãy hố đơn theo trình tự tăng dần số hiệu hoá đơn 56 57 Ta dãy sau đây: 10 14 18 26 34 41 69 72 73 98 100 101 19 45 87 102 21 46 91 105 25 63 97 125 87 102 91 105 97 125 87 91 97 K[(1+24) mod 2] = K[12] K[12] = 63 X = 73 > K[12] Dãy hố đơn tìm kiếm là: 69 98 72 100 73 101 K[(1+24) mod 2] = K[6] K[6] = 97 X = 73 < K[6] Dãy hố đơn tìm kiếm là: 69 72 73 K[(1+6) mod 2] = K[3] K[3] = 73 = X Quá trình tìm kiếm kết thúc Sau giải thuật: Function BynarySearching (k : Vector; var n :integer) :real; Var 57 58 m, i,r:integer; x: real; begin I : =1; r : = n; While I< = r Begin m : = (I +r) mod 2; If x < k[m] then r : = m-1 Else If x > k[m] then I : = m+1 Else BynarySearching : = m; end; BynarySearching : = 0; end; Phân tích đánh giá giải thuật tìm kiếm nhị phân [ ] Ta thấy số lượng phép so sánh phụ thuộc vào X Với giải thuật đệ quy nêu trên, trường hợp thuận lợi dãy khoá k1, ,kn ( mà lời gọi là: POS: = BynarySearching (1,n,k,X)) X = k [[ (n+1)/2]], nghĩa cần phép so sánh, lúc T1(n) = O (1) Trường hợ xấu xét có phức tạp Giải sử ta gọi w (r – l +1) hàm biểu thị số lượng phép so sánh trường hợp xấu ứng với phép gọi BynarySearching (l,r,k,X) đặt n = r-l +1 (ứng với dãy khố mà l = 1, r= n) trường hợp xấu ta phải gọi đệ quy ta có: W(n) = + w ([n/2]) Với phương pháp truy hồi, viết 58 59 W(n) = +1 + w ([n/22]) = + 1+ + ([n/23]) Như w(n) có dạng w(n) = k + w ([n/2k]) Khi [n/2k] = ta có w ([n/2k]) = w(1) mà w(1) = tìm kiếm phải kết thúc Song [n/2k] = suy 2k ≤ n < 2k+1, k ≤ log2n < k +1, nghĩa viết k = [log2n] Vì cuối ta có W(n) = [ log2n]+1 Hay Tx(n) = O (log2n) Người ta chứng minh độ phức tạp giải thuật tìm kiếm nhị phân Ttb (n) = O (log2n) Rõ ràng so với tìm kiếm tuần tự, chi phí tìm kiếm nhị phân nhiều Sau ta thấy khơng có phương pháp tìm kiếm dựa so sánh giá trị khố lại đạt kết tốt Tuy nhiên ta không nên quên trước sử dụng tìm kiếm nhị phân dãy khố phải xếp rồi, nghĩa thời gian chi phí cho xếp phải kể đến Nếu dãy khố ln biến động ( bổ sung thêm loại bớt đi) lúc chi phí cho xếp lại lên rõ điều bộc lộ nhược điểm phương pháp tìm kiếm 8.4 - Tìm kiếm dựa vào giá trị khoá [2,8] 4.1 Giới thiệu phương pháp Đây phương pháp tìm kiếm khác hẳn phương pháp nêu Nó khơng dựa sở phép so sánh giá trị khoá ghi mà dựa vào thân giá trị khố Bằng qui tắc biến đổi đó, từ giá trị khố ta tính địa (địa tương đối) Địa dùng để lưu trữ ghi tương ứng, đồng thời để tìm kiếm ghi Như nghĩa ta thiết lập hàm địa (addrees function) h (k) 59 60 thực phép ánh xạ tập giá trị k lên tập địa tương đối nghĩa số nguyên từ đến m-1 mà ta gọi bảng địa (addrees table), m gọi độ dài kích thước bảng Như ta ln có: ≤ h(k) < m Giá trị h(k) sử dụng lưu trữ tìm kiếm ghi ứng với k Có thể hình dung sơ phương pháp qua ví dụ đơn giản sau đây: Xét ghi có khố tương ứng số ngun gồm không chữ số thập phân, chẳng hạn 5420, 0367, 1246,2983, Giả sử kích thước bảng địa m = 1000 nghĩa địa tính phải nằm khoảng từ đến 999 Ta chọn qui tắc tính địa sau: “Lấy ba chữ số cuối khoá làm địa chỉ” Như ứng với khố nêu ta có kết quả: Giá trị khoá 5402 0367 1246 2983 Địa 402 367 246 983 Khi lưu trữ, ghi ứng với khoá chẳng hạn 5402 đưa vào hay số byte nhớ có địa thực A + 402 Đến kiếm địa A0 + 402 lại xác định để sử dụng Để tiện trình bày, từ ta qui ước A = nghĩa tạm coi địa tương đối địa thực Rõ ràng với phương pháp này, khố có giá trị khác ứng với địa : ví dụ 5402, 7402, 0402 địa 402 Lúc ta nói có hiệu tượng đụng độ (collision) 60 61 Lẽ dĩ nhiên hàm h(k) gọi tốt phân bố địa tính bảng địa cho phép tượng đụng độ không xẩy Về mặt lý thuyết, ta khơng có cách để xây dựng hàm địa "hoàn hảo" Nhưng thực tế người ta xác định số phương pháp có hiệu lực cho phép tạo địa gần ngẫu nhiên (near random) khiến cho tượng đụng độ xẩy Do tượng đụng độ có khả xuất nên phải tìm cách khắc phục Một biện pháp khắc phục đụng độ đơn giản nhanh chóng ảnh hưởng tới hiệu lực toàn phương pháp Cho nên xét tới địa phương cần ý đến cách xây dựng hàm địa h(k) mà phải xét tới phương pháp khắc phục đụng độ Do cách thực phương pháp phần có hình ảnh giống việc rải hạt cách ngẫu nhiên vào ô, người ta gọi tên khác kỹ thuật lưu trữ rải (scatter storage technique) tương ứng với thuật ngữ khái niệm có liên quan có tên gọi tương tự hàm rải (Scatter function), địa rải (scatter addrees), băng rải (scatter table) 8.4.2 hàm rải Ngoài yêu cầu rải địa bảng địa cho phép, hàm rải phải ý thêm đặc điểm nữa, không phần quan trọng tính tốn đơn giản Vì phương pháp xây dựng hàm rải dựa phép tính số học quen thuộc - Phương pháp chia 61 62 Nguyên tắc đơn giản: “lấy số dư phép chia giá trị khố cho kích thước m bảng rải để làm địa rải” Nghĩa là: H(k) =k mod (m) Như ví dụ trên, ta lấy ba chữ số cuối giá trị khoá làm địa rải tức lấy phần dư phép chia giá trị khoá cho 1000, chẳng hạn 246= 1246 mod (1000) Tất nhiên với phương pháp này, có số giá trị m tạo h (k) tốt giá trị khác Ví dụ: m số chẵn h(k) chẵn k chẵn lẻ k lẻ, với giá trị m h(k) không “ngẫu nhiên” Trường hợp m luỹ thừa số hệ đêm dùng, ví dụ hệ đếm thập phân mà m = 100 trên, khơng tốt lúc h (k) số bao gồm chữ số bên phải khố chữ số bên trái khố khơng có ảnh hưởng tới h(k) cả, giá trị khoá mà khác chữ số nằm bên trái xẩy tượng đụng độ Thông thường người ta chọn m * số nguyên tố nhỏ gần m thay cho m, nghĩa lúc h(k) = k mod (m*) Như ví dụ trên, m* = 997 ta có kết quả: Giá trị khóa 5402 0367 1246 2983 Địa 402 367 246 983 62 72 móc nối phải thực tìm kiếm Nhưng thực tế thường độ dài danh sách không lớn Để tiết kiệm không gian nhớ người ta tới cách làm khác dựa kỹ thuật móc nối (internal linking) nghĩa không dùng thêm khơng gian nhớ ngồi m nút V i với i = 1,2, , m cho ( trừ để khắc phục tượng tràn) Cụ thể là: khố đưa vào địa rải xác địnhn nút tương ứng thử Nếu nút tr lưu trữ đấy, phần tử danh sách móc nối Nếu nút chật , có hai khả xảy : - Địa rải khố đưa vào trùng vơí địa rải khoá cũ ( ta tạm gọi khóa diện) khố ưnày thuộc danh sách với khoá diện Phép tìm kiếm danh sách tương ứng thực Nếu danh sách có khố khố đưa vào: phép tìm kiếm thoả Nếu khơng có phải chọn nút trống miền V làm nút chứa khoá bổ sung nút v danh sách xét: việc lưu trữ khố xong Địa rải khoá đưa vào khơng trùng với địa rải khố diện Như khoá diện phanà tử danh sách móc nối ứng với điạ rải khác Ta phải tìm chỗ trống khác để chuyển sang lấy lại chỗ cho khố Cơng việc rõ ràng khơng phải đơn giản Ta phải chép nội dung trường nút cũ sang nút mà phải sửa mối nối nút nút trước trỏ tới nút cũ thành mối nối trỏ tới nút chuyển Dĩ nhiên phải tìm nút trỏ tới nũt cũ Để tìm ngược vòng Còn nối thẳng phải tính lại địa rải khố diện theo lần qua nút danh sách mà tìm đến nút cần thiết 72 73 Hình vẽ ( Hình ) minh hoạ kỹ thuật móc nối trong, ứng với dãy khoá 221, 634, 512, 326, 495, 108, 069 thứ tự đưa vào thay đổi chút sau: 221 643 512 326 069 495 108 đây, giả sử tìm chỗ trống miền V ta lần ngược từ lên Nhưng khó khăn xuất việc chuyển khoá cũ để lấy chỗ cho khoá cần xem xét để khắc phục, ta không tiếp tục sâu thêm 73 74 V0 V1 V2 V3 V4 V5 V6 V7 512 512 221 221 643 643 326 a -Khi khoá đầu đưa vào b - Khi thêm khoá 326 512 221 069 643 326 c - Khi thêm khố 069 74 75 512 Chun 069 lªn 512 069 108 221 495 643 326 221 069 643 326 d - Khi thêm khoá 495 e - Khi thêm khố 108 Hình 8.2 8.4.4 Phân tích dánh giá phương pháp [2,8 ] Trở lại ví dụ minh hoạ phương pháp thử tuyến tính nêu 10.7.3 a) ta thấy: để thực lưu trữ tìm kiếm khoá dãy 10.7 ta phải tiến hành tổng cộng 12 phép thử Có trường hợp đưa khoá vào, chẳng hạn khoá 495 ta phải thực tới phép thử liên tiếp xảy đụng độ Có vấn đề đặt ra: khoá đưa vào ( để lưu trữ tìm kiếm) số phép thử phải thực có nhiều khơng? (vì ảnh hưởng tới thời gian thực phương pháp) Nó phụ thuộc vào điều kiện gì? Thực điều ta mong muốn là: tính trung bình , số phép thử phải nhỏ Lập luận xác suất sau xác nhận thật nhỏ Ta xét vào phương pháp thử ngẫu nhiên Ta giả thiết khoá xuất đồng khả hàm rải H(k) phân bố chúng (ngẫu nhiên) bảng rải 75 76 Nếu thêm khố vào bảng có kích thước m chứa sẵn k đối tượng xác suất tìm thấy vị trí trống lần − k m− k = m m Đó xác suất p1: cần phép thử ( phép so sánh) Xác suất để cần phép thử thứ hai xác suất đụng lần thứ nhân với xác suất gặp vị trí trống lần tiếp theo, nghĩa P2 = k m− k m m− tương tự ta có p3 = k k − m− k m m− m− P(i)= k k −1 k − k − i + m− k m m− m− m− i + m− i + Vậy kỳ vọng số phép thử cần thiết đưa thêm vào khoá thứ k +1 m− k k m− k + + m m m− i =1  k k−1 k−   ….+ (k+1)   m m− m− m− k +  m+ = m− k + k+1 Ek+1 = ∑ ip = i Vì số phép thử cần thiết đưa khoá vào lữu trữ đồng với số phép thử cần thiết tìm kiếm nó, nên kết dùng để tính số trung bình E phép thử cần thiết để truy nhập vào khoá ngẫu nhiên bảng rải 76 77 Vẫn ký hiệu m kích thước bảng n số khố có bảng Ta có n m+ n E = E= ∑ k ∑ n k=1 n k=1 m− k + m+ = (Hm+1 – Hm-n+1) n 1 Hm = + + + hàm điều hoà m Hm tính xấp xỉ: Hm ≈ ln (m) + γ với γ số Euler (γ = 0,577216) Nếu ta thay α= n , ta m+ 1 ( ln(m+ 1) − ln(m− n + 1)) α m+ 1 = − (1 − α ) = ln α (m+ − n) α n Như coi xấp xỉ (thương số vị trí bị chiếm m E= giữ vị trí vốn có) α gọi hệ số tải ( load factor) Như kỳ vọng số ghép thử phụ thuộc vào hệ số tải Bảng liệt kê sau cho thấy giá trị E tương ứng với giá trị α (bảng A) α E 0.10 1.05 0.25 1.15 0.50 1.39 0.75 1.39 0.90 2.56 77 78 0.95 0.99 3.15 4.66 Bảng A Ta thấy bảng đầy tới 90%, tính trung bình cần 2.56 phép thử để đưa khoá vào lưu trữ vị trí trống tìm khố cho Sự phân tích tương tự cho biết kết sau ( bảng B) phép thủ tuyến tính: α 0.10 0.25 0.50 0.75 0.90 0.95 E 1.06 1.17 1.50 2.50 5.50 10.50 Bảng B α E= 1−α Còn phương pháp móc nối ngồi thì: E có giá trị bảng C α E = 1+ 1− α 0.10 0.25 0.50 0.75 E 1.05 1.12 1.25 1.37 78 79 0.90 0.95 1.45 1.47 Bảng C Các kết chứng tỏ tìm kiếm phương pháp biến đổi khố tốt Điều khiến ta yên tâm sử dụng phương pháp 8.5 Phương pháp tìm kiếm sở Dùng bảng băm ( Hash tables) Trong giải thuật xét việc định vị phần tử xác định sỏ dãy so sánh.Trong trường hợp ,phần tử cần tìm so sánh nhiều lần với phần tử vị trí khác cấu trúc liệu tốc độ thực giải thuật chậm Một cấu trúc liệu giúp cho việc tìm kiếm nhanh ,đó bảng băm(Hash Tables) Trong cấu trúc vị trí phần tử xác định trực tiếp hàm khơng phải dãy so sánh Thời gian cần thiết để định vị mục bảng băm trường hợp tốt O(1) nghĩa số khơng phụ thuộc vào số lượng phần tử lưu trữ Nội dung phương pháp sau: Bằng qui tắc biến đổi từ giá trị khố ta tính địa tương đối Địa dùng để lưu trữ ghi tương ứng đồng thời để tìm kiếm ghi Có nghĩa thiết lập ánh xạ tập giá trị khố tìm kiếm lên tập địa tương đối Để minh hoạ ta xét ví dụ sau Giả sử ta cần lưu trữ 25 số nguyên đoạn 999 bảng băm Có thể cài đặt bảng băm mảng Table số nguyên đánh số đoạn 999 phần tử mảng khởi động 79 80 giá trị đó, chẳng hạn Khi ta dùng số nguyên I tập hợp làm số nghĩa ta lưu trữ I Table[i] ta định vị số nguyên Number cho trước cách kiểm tra Table[Number] = Number hay không.Hàm H định nghĩa H(i) = I xác định vị trí phần tử I bảng băm gọi hàm băm ( Hash Function) ( Có thể dùng hàm H(i) = I mod 25 ví dụ đây, trường hợp mảng Table đánh số đoạn 24) Dưới xét ứng dụng bảng băm Ta xét tốn kiểm tra tính hợp lệ định danh người dùng mật mạng máy tính.Các số liệu lưu trữ bảng băm Các định danh người dùng mã hoá số nguyên cách cộng mã số ASCII ký tự tạo nên chúng Chương trình sau [1]: Program ValidateUser2 ; Const StringLength = ; TableSize = 13; MaxIndex =12; Type String = Packed array[ StringLength] Of char; UserRecord = Record Id, Password : String; End; ElementType = UserRecord; UserNode = Record; Data : ElementType; Next : Chain; end; IndexRange =0 MaxIndex; 80 81 HashTable = Array[ IndexRange]Of chain; Var UsersFile : text; UserRec : UserRecord; UserTable : HashTable; Found, Done : boolean; Loc : IndexRange; LocPtr : Chain; Procedure Initialize ( Var Table : HashTable ); (* Khởi động bảng băm : đặt tất phần tử Nil*) Var I : IndexRange; Begin (* Initialize * ) For I : = to MaxIndex Table[i] : = nil ; End(* Initialize* ); Function Hash ( Str : String; StrLength, TableSize : integer ): IndexRange; (* Hàm băm -xâu ký tự Str mã hoá số nguyên cách cộng mã ASCII ký tự nó*) Var Sum :integer; I : StringLength; Begin (* Hash*) Sum : = 0; For I : =1 to StrLength Sum : = Sum + ord ( Str[i] ); Hash : = Sum mod TableSize ; 81 82 End ( *Hash* ); Procedure Search ( Table : HashTable; Item : ElementType; Var Loc : IndexRange; AR Found : boolean; Var LocPtr : Chain ); (* Thủ tục tìm ghi người dùng Bảng băm*) Begin (* Search* ) Loc : = Hash( Item.Id, StringLength , TableSize ); LocPtr : = Table[Loc]; Found : = false; While Not Found And ( LocPtr < > NIL ) If LocPtr ^ Data.Id = Item.Id then Found : = true Else LocPtr : = LocPtr ^ Next; End (* Search * ); Procedure Insert ( Var Table : HashTable; Item : ElementType ); (* Thủ tục chèn ghi người dùng vào bảng băm*) Var Loc : IndexRange; LocPtr : Chain; Found : boolean; Begin (* Insert* ) Search ( Table, Item , Loc , Found, LocPtr ); If Found then writeln Else Begin new ( LocPtr ); LocPtr ^.Data : = Item; LocPtr ^ Next : = Table[Loc]; 82 83 Table[Loc] : = LocPtr ; End (* ELSE* ); End (* Insert* ); Procedure ReadString ( Var TextFile : text; Var Str : String; MaxString : integer); (* Thủ tục đọc ký tự vào biến Str từ TextFile *) Var I : integer; Begin (* ReadString* ) For I : = to MaxString If Not eoln ( TextFile ) then read ( TextFile, Str[i] ) Else Str [I]: = ‘ ‘; readln ( TextFile ) ; End (* ReadString* ); Procedure Login ( Var UserRec : UserRecord; StringLength : integer; Var Done : boolean); (* Thủ tục đọc định danh người dùng mật khẩu*) Const QuitSignal = ‘ Quit ‘; Begin (* Login* ) write (‘ Định danh người dùng’); ReadString ( input, UserRec.Id, StringLength ); If UserRec.Id = QuitSignal Then Done : = true Else 83 84 Begin Done : = false; write (‘ Mật*khẩu’); ReadString ( input, UserRec Password, StringLength) ; End (* Else * ); End ( *Login* ); Begin (* Chương trình chính*) assign ( UserFile, ‘UsersFiler ‘); reset ( UsersFile ); Initialize ( UserTable ); While Not eof ( UsersFile ) Begin ReadString ( UsersFile, UserRec.Id, StringLength ); ReadString ( UsersFile, UserRec Password, StringLength ); Insert ( UserTable, UserRec); End (* While* ); Login ( UserRec, Loc, StringLength, Done); While Not Done Begin Search ( UserTable, UserRec, Found, LocPtr ); If Found then If LocPtr ^ Data.Password = UserRec Password then writeln (‘ Người dùng hơpl lệ’) Else writeln (‘ Mật*khẩu không hợp lệ’) Else writeln (‘Định danh không hợp lệ’) writeln; Login ( UserRec, StringLength, Done); End (* While* ); End 84 85 Trên xem xét số giải thuật tìm kiếm xếp theo khoá Đây vấn đề thường gặp việc giải toán thực tiễn, lĩnh vực kinh tế.Vì lĩnh vực kinh tế thường phải xử lý khối lượng thơng tin lớn, việc xếp tìm kiếm có vai trò to lớn giúp cho việc giải toán cách hiệu _ Câu hỏi ơn tập chương - Trình bày khái niệm tìm kiếm theo khố ? - Cho dãy số sau : 22 34 11 56 67 90 13 92 94 18 Minh hoạ bước tìm kiếm phần tử 67 sử dụng phương pháp : a - Tìm kiếm b - Tìm kiếm nhị phân c - Tìm kiếm theo khố - Trình bày phương pháp chia để xác định địa hàm rải - Trình bày phương pháp nhân để xác định địa hàm rải - Trình bày phương pháp phân đoạn để xác định địa hàm rải - Trình bày nội dụng phương pháp địa mở để khắc phục đụng độ ? Cho ví dụ minh hoạ ? - Trình bày nội dụng phương pháp móc nối dây chuyền ? Cho ví dụ minh hoạ ? - Phân tích đánh giá phương pháp tìm kiếm ? 85 86 86 ... phương pháp tìm kiếm phổ dụng, liệu chứa nhớ - Tìm kiếm ( sequential searching) Tìm kiếm kỹ thuật tìm kiếm đơn giản cổ điển Nội dung tóm tắt sau: “Bắt đầu từ ghi thứ nhất, so sánh khố tìm kiếm với... 525 189 3 088 982 89 89 8 982 Rõ ràng chữ số “ở giữa” kết phụ thuộc vào chữ số có mặt khố khố có khác chút địa rải tạo thường khác nhau, chẳng hạn: k k 7402 5401 5301 k2 54 789 604 2917 080 1 281 00601... (1+n) mod 2] - Nếu X = Ki trình kết thúc - Nếu X < Ki trình tìm kiếm thực với dãy số K1,K2, Ki-1 - Nếu X > Ki trình tìm kiếm thực với dãy Ki+1, kn Với dãy khố sau, kỹ thuật tìm kiếm lại lặp lại

Ngày đăng: 28/06/2018, 20:38

w