Thuật toán tìm kiếm và các phương pháp tìm kiếm cơ bản

14 6.4K 29
Thuật toán tìm kiếm và các phương pháp tìm kiếm cơ bản

Đ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

Thuật toán tìm kiếm và các phương pháp tìm kiếm cơ bản

Bài toán tìm kiếm các phương pháp tìm kiếm bảnThu HươngI. Bài toán:Tìm kiếm luôn là thao tác nền móng cho rất nhiều tác vụ tính toán. Tìm kiếm nghĩa là tìm một hay nhiều mẩu thông tin đã được lưu trữ. Thông thường, thông tin được chia thành các mẩu tin (record), mỗi mẩu tin đều một KHÓA (key) dùng cho việc tìm kiếm. Ta sẽ luôn một khoá cho trước giống như khoá của các mẩu tin mà ta cần tìm. Mỗi mẩu tin được tìm thấy sẽ chứa toàn bộ thông tin để cung cấp cho một quá trình xử lý nào đó.Việc tìm kiếm được áp dụng rất đa dạng rộng rãi. Một Ngân hàng nắm giữ tất cả thông tin của rất nhiều tài khoản khách hàng cần tìm kiếm để kiểm tra các biến động. Một hãng Bảo hiểm hay một hệ thống trợ giúp bán vé xe, vé máy bay….Việc tìm kiếm thông tin để đáp ứng việc xắp đặt ghế các yêu cầu tương tự như vậy là thực sự cần thiết.Thuật ngữ thường được dùng trong việc mô tả cấu trúc dữ liệu của việc tìm kiếm là TỪ ĐIỂN BẢNG KÝ HIỆU. Một ví dụ điển hình như ta muốn xây dựng hệ thống tra từ điển Tiếng Anh chẳng hạn. Ở đây, “khoá” là từ “mẩu tin” là diễn giải cho từ đó, mỗi mẩu tin chứa định nghĩa, cách phát âm các thông tin khác. BẢNG KÝ HIỆU chính là từ điển cho chương trình các mẩu tin chứa thông tin mô tả đối tượng được đặt tên.II. Hướng giải quyết bài toán tìm kiếm:Trong tìm kiếm chúng ta thấy rất nhiều trương trình được dùng thường xuyên rộng rãi. Vì vậy sẽ rất ích khi nghiên cứu chi tiết nhiều phương pháp khác nhau.Cách tốt nhất để suy nghĩ các thuật toán tìm kiếm là đưa ra các thao tác tổng quát được rút ra từ các cài đặt cụ thể, sao cho các cài đặt khác nhau thể được thay thế dễ dàng. Các thao tác đó gồm:- Khởi tạo cấu trúc dữ liệu (INITIALIZE)- Tìm kiếm một hay nhiều mẩu tin khoá đã cho (SEARCH)- Chèn thêm một mẩu tin mới ( INSERT)- Nối lại từ điển để tạo thành một từ điển lớn hơn.(JOIN)- Sắp xếp từ điển; xuất ra tất các mẩu tin theo thứ tự được sắp xếp (SORT)Trong một vài trường hợp, các thao tác này được tổ hợp thành một thao tác phức tạp hơn. Ví dụ như thao tác SEARCH_INSERT (tìm kiếm chèn). Thao tác này thường được dùng trong các trường hợp các mẩu tin với khoá bằng nhau không được phép lưu trữ trong cấu trúc dữ liệu. Trong nhiều phương pháp, mỗi lần xác định một khoá nào đó không trong cấu trúc dữ liệu thì trạng thái của thủ tục tìm kiếm sẽ chứa chính xác thông tin cần thiết để chèn thêm một mẩu tin mới với khoá đã cho.- Một trong 5 thao tác liệt kê trên đều những ứng dụng rất quan trọng một số lớn những tổ chức dữ liệu sở đã được đề nghị để dùng phối hợp các thao tác trên một cách hiệu quả. Chúng ta sẽ xét cụ thể cách cài đặt của hàm bản SEARCH INSERT…1. PHƯƠNG PHĂP TÌM KIẾM TUẤN TỰ a. Tìm kiếm tuần tự cài đặt mảng Đây là một trong những phương pháp tìm kiếm đơn giản dễ thực hiện nhất đặc biệt đối với các thông tin được lưu trữ kiểu mảng. Tìm kiếm tuần tự là tìm kiếm lưu trữ các mẩu tin trong một mảng, sau đó duyệt toàn bộ mảng một cách tuần tự. Mỗi lần tìm duyệt như vậy ta sẽ tìm thấy được một mẩu tin. Đoạn chương trình đơn giản mô tả thuật toán tìm kiếm tuần tự như sau: Type diem = record key, infor: integer; end; var A: array[1 maxN] of diem; N: integer; procedure intialze; begin N:=0; end; function seqsearch(v: integer; x : integer): integer; begin A[N+1].key:=v; If x then repeat x:= x+ 1 until v = A[x].key; seqsearch:= x; end; end; function seqinsert(v : integer): integer; begin N:= N + 1; A[N].key:= v; seqinsert := N; end end; Đoạn mã trên xử lý các mẩu tin các khoá (key) “thông tin đi kèm” giá trị nguyên (infor). Nhiều ứng dụng cần mở rộng các chương trình để làm việc các mẩu tin khoá phức tạp hơn, nhưng điều này sẽ không làm thay đổi nhiều các thuật toán. Ví dụ: trường Infor thể thay đổi thành con trỏ đến một cấu trúc mẩu tin phức tạp. Trường hợp như vậy, trường infor thể thể xem như một chỉ danh duy nhất của mẩu tin để phân biệt những mẩu tin khoá bằng nhau.Thủ tục seqsearch hai đối số: một là giá trị khoá (v), một là chỉ số của mảng (biến x). Chỉ số x này dùng để xử lý trường hợp nhiều mẩu tin cùng một giá trị khoá. Bằng cách thực hiện liên tục m:= seqsearch(v, m) khởi đầu với m:= 0; chúng ta thể cho m lần lượt chỉ số của các mẩu tin khoá bằng v. Một mẩu tin đặc biệt khoá là khoá đang tìm được thêm vào; nó bảo đảm rằng quá trình tìm kiếm sẽ kết thúc cũng làm đơn giản hơn phép kiểm tra trong vòng lặp. Sau khi vòng lặp dừng, nếu chỉ số trả về nhỏ hơn hay bằng N thì đó chính là chỉ số của mẩu tin tìm được. Nếu ngược lại thì trong bảng đã cho không mẩu tin giá trị khoá muốn tìm. Kỹ thuật này giống như kỹ thuật dùng một mẩu tin chứa giá trị khoá nhỏ nhất hay lớn nhất để làm đơn giản các vòng lặp của các thuật toán trong các chương trình sắp xếp. Ta thể rút ra một kết luận cho thuật toán tìm kiếm tuần tự như sau: Tìm kiếm tuần tự (cài đặt mảng) sử dụng đúng (N +1) phép so sánh cho một lần tìm kiếm không thành công trung bình khoảng N/2 phép toán so sánh cho một lần tìm kiếm thành công. Trường hợp tìm kiếm thành công, điều này là hiển nhiên được thấy ngay trong đoạn chương trình trên. Trường hợp tìm kiếm không thành công, chúng ta giả sử rằng mỗi mẩu tin khả năng tìm thấy là như nhau, thì số trung bình của số lần so sánh sẽ là: Con số này bằng đúng bằng đúng một nửa của trường hợp tìm kiếm không thành công. Ngoài phương pháp cài đặt bằng mảng như thuật toán trên, TÌM KIẾM TUẦN TỰ thể được cài đặt bằng một phương pháp sử dụng một xâu liên kết để biểu diễn cá mẩu tin như: b. Tìm kiếm tuần tự cài đặt bằng xâu thứ tự Một trong những thuận lợi của phương pháp này là giữ cho xâu được sắp xếp, nhờ đó thể tìm kiếm nhanh hơn. type lienket = ↑ diem; diem = record key, infor :integer; next : lienket; end; var dau , t , x : lienket; i: integer; procedure initialize; beginnew(z); z↑.next:= z; new(dau); dau↑.next:= z ; end; function listsearch(v : integer; t:lienket) : lienket; begin z↑.key:= v; repeat t:= t↑.next until v < = t↑.key; if (v= t↑.key) then listseach:= t; else listseach:= z; end; end; Với một xâu được sắp xếp, một lần tìm kiếm thể kết thúc không thành công khi một mẩu tin khoá lớn khoá đang tìm kiếm được tìm thấy. Do đó, về mặt trung bình, chỉ khoảng một nửa các mẩu tin (không phải là tất cả) cần được kiểm tra cho một lần tìm kiếm không thành công. Thứ tự sắp xếp được duy trì dễ dàng tại vị trí mà việc tìm kiếm kết thúc không thành công. Ta xét kỹ thuật sau:function listsearch(v : integer; t: lienket): lienket; begin z↑.key: = v; while (t↑.next↑.key < v) do new(x); x↑.next:= t↑.next; t↑.next:= x; x↑.key:= v; listsearch:= x; end;Như chúng ta đã biết, đối với các xâu liên kết, thể một nút dẫn đầu (dau) một nút kết thúc z để làm đơn giản chương trình. Vì vậy, lệnh listsearch(v, dau) sẽ đặt một nút mới với khoá v vào trong xâu được trỏ tới bởi trường (next) của (dau). Các lần gọi listsearch kế tiếp dùng các xâu trả về của lần trước đó để đưa ra các mẩu tin các khoá bằng nhau. Nút kết thúc (z) dùng cho trường hợp thành không công, nghĩa là nếu listsearch trả về z thì sự tìm kiếm không thành công. Vậy tìm kiếm tuần tự (cài đặt bằng xâu thứ tự) sử dụng trung bình khoảng N/2 phép so sánh cho cả hai trường hợp tìm kiếm thành công không thành công. Xét trường hợp ta tìm kiếm thành công với kỹ thuật trên: điều này ta thể thấy trực tiếp từ đoạn code trên Trường hợp không thành công khi tìm kiếm: Giả sử rằng khả năng tìm kết thúc ở mỗi phần tử trong xâu nút z là như nhau thì số trung bình của các phép so sánh sẽ là: 1+ 2+ 3+…+ N+ (N+ 1)= (N+ 1)(N+ 2)/2 Chúng ta thể cải tiến cải tiến thuật toán tìm kiếm bằng cách sắp xếp các mẩu tin một cách thông minh nếu như ta được biết thông tin về tần số truy xuất các mẩu tin. Một sắp xếp được gọi là “tối ưu” là một mẩu tin được truy xuất thường xuyên nhất ở vị trí đầu tiên, mẩu tin tần suất truy xuất thường xuyên thứ hai sẽ nằm ở vị trí thứ hai…Kỹ thuật này đặc biệt hiệu quả trong những trường hợp chỉ một tập hợp nhỏ các mẩu tin được truy xuất thường xuyên.Trường hợp ta không được thông tin về tần suất truy xuất ta vẫn thể thực hiện một kỹ thuật xấp xỉ đến sắp xếp tối ưu bằng cách tìm kiếm “tự tổ chức” như sau: Mỗi lần một mẩu tin được truy xuất, thì di chuyển chúng nên vị trí đầu tiên của xâu. Phương pháp này sẽ dễ dàng cài đặt nếu ta dùng xâu liên kết. Tất nhiên thời gian thực hiện của phương pháp phụ thuộc vào sự phân bố của các mẩu tin, rất khó thể tính trước được trong trường hợp tổng quát. Dù vậy, phương pháp này rất phù hợp trong trường hợp mỗi mẩu tin khuynh hướng gần những mẩu tin khác.2. PHƯƠNG PHĂP TÌM KIẾM NHỊ PHÂN a. Tìm kiếm nhị phân Chúng ta đã xét phương pháp tìm kiếm tuần tự, cách này đơn giản trong quá trình cài đặt. Song , hạn chế của phương pháp tuần tự là thời gian tìm kiếm sẽ lâu trong trường hợp tập hợp tổng số mẩu tin lớn. Để khắc phục hạn chế này, ta phương pháp tìm kiếm NHỊ PHÂN. Nếu tập hợp các mẩu tin lớn thì tổng số thời gian tìm kiếm sẽ được rút ngắn bằng cách dùng một thủ tục tìm kiếm dựa trên sự ứng dụng sơ đồ “chia - để - trị”. Điều này nghĩa là chúng ta sẽ chia những mẩu tin thành hai phần, xác định xem phần nào chứa khoá. Kế đến tiếp tục công việc cho phần chứa khoá ta vừa tìm được. Lý do mà chúng ta thể chia đôi chỉ tìm kiếm trên một nửa các mẩu tin lf do ta đã giả thiết các mẩu tin được sắp xếp theo thứ tự Khoá. Không mất tính tổng quát, ta giả thiết rằng các mẩu tin được sắp xếp theo thứ tự tăng dần(trường hợp sắp xếp giảm dần thể làm tương tự). Để tìm một khoá k trong một dãy số hay không, trước tiên ta so sánh nó với phần tử ở vị trí giữa dãy ký tự. Nếu k nhỏ hơn thì nó chỉ thể là ở trong một nửa đầu tiên của dãy số. Trường hợp k lớn hơn tức là k nằm trong nửa còn lại của dãy. Chúng ta sẽ tiếp tục áp dụng Đệ quy phương pháp này. Ta thể gọi Đệ quy một lần mà thể đưa ra thuật toán dùng phương pháp lặp. Ta hãy cùng xét hàm dưới đây để thấy được thuật toán Nhị Phân thể sẽ thực hiện như thế nào( giả sử rằng: mảng A đã được sắp xếp tăng theo thứ tự Khoá): function TKnhiphan(k: integer): integer; var x, l , r : integer; begin l:=1; r:= N; repeat x:= (l + r ) div 2; if (kA[x].key) then r:= x - 1; else r:= x + 1; until (k = A[x].k) or (l>r); if (k= A[x].key) then TKnhiphan:= x; else TKnhiphan:= N +1; end; Như chúng ta thấy trên hàm, thuật toán này đã sử dụng các con trỏ l r để đánh dấu tập tin con hiện đang làm việc. Mỗi khi vòng lặp thực hiện, biến x nhận giá trị điểm giữa của đoạn hiện hành. Sẽ ba khả năng sau xảy ra: - Vòng lặp kết thúc thành công - Con trỏ trái l thay đổi thành (x + 1) - Con trỏ phải r được đổi thành (x - 1) Ba khả năng trên xảy ra tương ứng với giá trị tìm kiếm k bằng, nhỏ hơn hay lớn hơn giá trị khoá của mẩu tin được lưu trữ trong mảng A[x]; Xét 1 ví dụ cụ thể: Cho 1 dãy ký tự: BBAACDEFFGHMPNHRX Tìm kiếm M trong dãy ký tự trên bằng phương pháp nhị phân. Mô phỏng cách thực hiện thuật toán: thấy rằng, khi tiềm kiếm M trong bảng được xây dựng từ các khoá B A C D E F G H M P N R X, khi đó kích thước đoạn giảm ít nhất một nửa ở mỗi bước. Như vậy, ta chỉ cần dùng tới 4 phép so sánh cho việc tìm được mẩu tin khóa là M trong ví dụ trên. Như vậy, số các mẩu tin giảm ít nhất một nửa ở mỗi bước: một cận trên của số các phép so sánh thoả mãn hệ qui nạp Cn = Cn/2 + 1 C1=1;Từ nhận xét trên ta rút ra một kết luận: Tìm kiếm nhị phân không bao giờ dùng nhiều hơn (log(N) + 1) phép so sánh. Chú ý: Điều quan trọng cần lưu ý trong thuật toán tìm kiếm nhị phân này là thao tác chèn thêm một mẩu tin mới chiếm rất nhiều thời gian. Điều này lý giải tại sao mảng luôn phải duy trì trong trạng thái được sắp xếp một số mẩu tin phải di chuyển đề nhường chỗ cho mẩu tin mới. Nếu một mẩu tin khóa nhỏ nhất so với tất cả các khoá của các mẩu tin khác trong bảng thì mỗi mẩu tin phải được di chuyển lên trên một vị trí. Một thao tác chèn ngẫu nhiên mất trung bình khoảng N/2 mẩu tin bị di chuyển. Đó là lý do tại sao chúng ta không nên dùng phương pháp này cho các ứng dụng đòi hỏi nhiều thao tác chèn thêm mẩu tin. Trường hợp các mẩu tin khoá bằng nhau khi sử dụng thuật toán Tìm kiếm nhị phân phải thật cẩn thận. Vi chỉ số trả về thể rơi vào giữa một khối các mẩu tin khoá bằng k, do vậy, phải quét theo cả hai hướng từ chỉ số trả về đó để thể nhặt ra tất cả các mẩu tin khóa bằng k. Trường hợp này, thời gian chạy cho việc tìm kiếm gần bằng lg(N) cộng với số mẩu tin được tìm thấy. Bài toán tìm kiếm các phương pháp tìm kiếm bảnThu Hương3. Tìm kiếm trên cây nhị phân a. Bài toán: Tìm kiếm trên cây nhị phân là một thuật toán đơn giản, một phương pháp tìm kiếm động hiệu quả. Phương pháp này là một trong các thuật toán nền móng của khoa học máy tính. Sở dĩ thuật tóan này được bàn ở đây được coi là bản bởi lẽ nó đơn giản; nhưng lại là phương pháp tìm kiếm được chọn lựa trong nhiều trường hợp ứng dụng. Như chúng ta đã biết trong một cây: mỗi nút chỉ được trỏ tới bởi duy nhất một nút khác gọi là cha của nó. Một cây nhị phân thì mỗi nút 2 liền kề trái phải. Với việc tìm kiếm, mỗi nút của cây một mẩu tin chứa giá trị khóa. Không mất tính tổng quát, ta giả thiết rằng: trong cây – tìmkiếm – nhị - phân tất cả các mẩu tin với các khóa nhỏ hơn thì ở trong cây – con – trái tất cả các mẩu tin trong cây con phải giá trị khóa lớn hơn hay bằng nhau. Chúng ta thấy rằng sẽ hoàn toàn đơn giản để đảm bảo cho cây tìm kiếm nhị phân thỏa mãn định nghĩa của nó khi chèn thêm vào một cây nút mới.Thủ tục tìm kiếm giống như thủ tục tìmkiếmnhiphân ta đã xét ở phần trước. Tất nhiên, chúng ta sẽ luôn bám sát với định nghĩa của cây nhị phân. b. Hướng giải quyết Để tìm một mẩu tin với khóa k đã cho, trước tiên ta so sánh nó với nút gốc nếu nó nhỏ hơn thì đi đến cây con trái. Nếu bằng thì dừng, nếu nó lớn hơn thì đi đến cây con phải. Ăp dụng đệ quy quá trình trên cho các cây con. Trong mỗi bước, chúng ta chắc chắn rằng không bộ phận nào của cây ngoài “cây con hiện hành” thể chứa các mẩu tin với khóa k, “cây con hiện hành” ngày càng nhỏ hơn. Thủ tục sẽ dừng khi một mẩu tin với khóa k được tìm thấy hoặc “cây con hiện hành” trở nên trống. Nghĩa là không một mẩu tin nào chứa khóa kTrong tìm kiếm nhị phân đã xét ở phần trước. Chúng ta dùng một cây nhị phân để mô tả dãy của các phép so sánh được tạo bởi một hàm tìm kiếm trong mảng. Ở phần tìm kiếm cây nhị phân này, chúng ta xây dựng một cấu trúc dữ liệu gồm các mẩu tin được liên kết với nhau dùng cấu trúc dữ liệu này cho việc tìm kiếm. Xét hàm tìm kiếm cây nhị phân sau: Type lienket = ↑ diem; diem = record khoa, thongtin: integer; l, r : lienket; end; var t, z, dau: lienket; function timkiemcaynhiphan(k : integer; x : lienket): lienket; begin z ↑.khoa:= k; repeat if (k< x ↑.khoa) then x:= x ↑.l else x: = x↑.r; until k = x↑.khoa; timkiemcaynhiphan:= x; end; end; Trong hàm trên ta quy ước: liên kết bên phải của nút dau trỏ tới nút gốc của cây khóa của nút dau nhỏ hơn tất cả các nút của các khóa khác (thường thì ta cho luôn khóa của nút dau bằng 0 giả sử tất cả các khóa khác đều nguyên). Như vậy liên kết trái của dau sẽ không được dùng. Bạn sẽ thấy được sự cần thiết của nút dau khi ta dùng nó để thao tác trong hàm chèn sau này.Như vậy theo thuật toán trên thì để tìm kiếm một mẩu tin khóa k, chúng ta cho x:= timkiemcaynhiphan (x, dau). Nếu một nút không cây con trái (hay phải) thì liên kết trái (hay phải ) của nó được trỏ tới nút đuôi z. Ta đã xét trong trường hợp tìm kiếm tuần tự, chúng ta đã đặt giá trị dạng muốn tìm ở trong z để dừng một quá trình tìm kiếm không thành công. Do đó “cây con hiện hành” trỏ tới x không bao giờ trở thành rỗng mọi quá trình tìm kiếm đều “thành công”. Trong chương trình gọi hàm tìm kiếm thể kiểm tra liên kết được trả về trỏ đến nút z hay không để xác định quá trình tìm kiếm thành công hay không. Không mất tính tổng quát, ta quy ước: - Các liên kết trỏ tới z như trỏ tới các nút ngoài. - Tất cả các quá trình tìm kiếm không thành công đều kết thúc ở nút ngoài- Các nút thông thường chứa các khóa gọi là các nút trong Chú ý: Khi ta đưa thêm khái niệm nút ngoài thì lẽ ra mỗi nút trong đều trỏ đến hai nút khác của cây. Song về mặt cài đặt chúng ta cho tất cả các nút biểu diễn chỉ bởi một nút z duy nhất. Trường hợp cây rỗng sẽ được biểu diễn bởi một liên kết phải của nút dau trỏ tới z được tạo lập bởi đoạn chương trình sau:procedure khoitaocay; begin new (z); z ↑.l := z ↑.r; z ↑.r := z; new(dau); dau ↑. khoa := 0; dau ↑.r := z; End. Khởi tạo này trỏ các liên kết của z đến chính nó. Chúng ta sẽ sử dụng thủ tục khởi tạo để đảm bảo an toàn trong các chương trình nâng cao sau này. Xét ví dụ áp dụng hàm tìm kiếm khóa I trong cây nhị phân sau: Trước tiên I được so sánh với A ở gốc. Vì I lớn hơn nên nó tiếp tục được so sánh với S. Cứ tiếp tục như thế nó sẽ được so sánh với E, R, cuối cùng là H. Các liên kết trong nút chứa H trỏ tới z quá trình tìm kiếm kết thúc: I được so sánh với chính nó ở trong z kết quả tìm kiếm kết thúc không thành công. Ta quy ước rằng các liên kết trỏ tới z như là trỏ tới các nút ngoài, tất cả các quá trình tìm kiếm không thành công đều kết thúc ở các nút ngoài. Các nút không thành công chứa các khoá được gọi là nút trong; khi đưa thêm khái niệm nút ngoài thì lẽ ra mỗi nút trong đều phải trỏ đến hai nút khác của cây nhưng về mặt cài đặt chúng ta cho tất cả các nút ngoài được biểu diễn chỉ bởi nút z duy nhất. Chúng ta sẽ cùng xét ví dụ sau để thấy các liên kết này các nút giả một cách rõ nhất: Chúng ta cùng xét một ví dụ cụ thể sau:Tìm khoá I trên cây trong hình trên bằng cách dùng thủ tục timkiemcaynhiphan. Trước tiên I được so sánh với khoá A ở gốc. Vì I lớn hơn nên nó tiếp tục được so sánh với S, cứ tiếp tục như thế I sẽ được so sánh với E, R, cuối cùng là H. Các liên kết trong nút chứa H trỏ tới z quá trình tìm kiếm kết thúc: I được so sánh với chính nó ở trong z tìm kiếm kết thúc không thành công. Chèn nút trong cây nhị phân Để chèn thêm một nút mới vào cây (giả sử chúng ta đã tìm kiếm nó không thành công, kế đến gặp nó trong nơi chứa z), chúng ta cần một thủ tục duy trì cha p của x trong khi duyệt cây từ gốc đến ngọn. Khi tiếp xúc với ngọn của cây (xảy ra khi x=z) p trỏ tới nút mà liên kết của nó phải được thay đổi để trỏ tới nút mới được chèn vào. function chentrongcay(k: integer; x: lienket): lienket; var p: lienket; begin Repeat p:=x; if (k = x↑.khoa) then x:= x↑.l else x:= x↑.r; until x = z; new(x); x↑.k:= v; x↑.l: = z; x↑.r := z; if (v= p↑.khoa) then p↑.l:= x; else p↑.r:= x; chentrongcay:=x; End; Một khóa k thể được thêm vào cây bằng cách gọi hàm chentrongcay(k, dau). Hàm này trả về một liên kết tới nút mới được tạo sao cho thủ tục gọi thể đặt các giá trị thích hợp vào trường infor. Khi chèn một nút mới khoá bằng với một khoá nào đó đã sẵn trong cây, nút mới sẽ được chèn vào bên phải của nút đã sẵn. Tất cả các mẩu tin khoá bằng với k thể được xử lý bằng cách đặt liên tục t vào thủ tục timkiem(k, t) như chúng ta đã làm trong tìm kiếm tuần tự. Ví dụ:Thấy rằng cây này được khi chèn các khoá ASEARCHI vào một cây trống đã được khởi động. Chú ý: Vị trí các khoá bằng nhau trong cây - dù một cây tới 3 khoá trùng nhau trải dài trong cây nhưng sẽ không khoá nào “xen giữa” chúng. Khi dùng các cây tìm kiếm nhị phân thì hàm sắp xếp (sapxep) sẽ tự động được nhờ vào cấu trúc của cây. Nếu quan sát kỹ, các bạn sẽ thấy các khoá được sắp xếp theo thứ tự từ trái qua phải (không kể chiều cao các liên kết). Vậy chúng ta thể suy ra một phương pháp sắp xếp từ các tính chất của cây tìm kiếm nhị phân nhờ quá trình duyệt cây theo một thứ tự xác định. procedure hiencay(x : lienket); begin if ( x<> z) then Begin hiencay(x↑.l); hiendiem(x); hiencay(x↑.r) end; [...]... Bài tốn tìm kiếm các phương pháp tìm kiếm bản Thu Hương I. Bài tốn: Tìm kiếm ln là thao tác nền móng cho rất nhiều tác vụ tính tốn. Tìm kiếm nghĩa là tìm một hay nhiều mẩu thơng tin đã được lưu trữ. Thông thường, thông tin được chia thành các mẩu tin (record), mỗi mẩu tin đều một KHĨA (key) dùng cho việc tìm kiếm. Ta sẽ ln có một khố cho trước giống như khố của các mẩu tin mà ta cần tìm. Mỗi... sự tìm kiếm khơng thành cơng. Vậy tìm kiếm tuần tự (cài đặt bằng xâu thứ tự) sử dụng trung bình khoảng N/2 phép so sánh cho cả hai trường hợp tìm kiếm thành công không thành công. Xét trường hợp ta tìm kiếm thành cơng với kỹ thuật trên: điều này ta thể thấy trực tiếp từ đoạn code trên Trường hợp khơng thành cơng khi tìm kiếm: Giả sử rằng khả năng tìm kết thúc ở mỗi phần tử trong xâu và. .. Hướng giải quyết bài tốn tìm kiếm: Trong tìm kiếm chúng ta thấy rất nhiều trương trình được dùng thường xun rộng rãi. Vì vậy sẽ rất ích khi nghiên cứu chi tiết nhiều phương pháp khác nhau. Cách tốt nhất để suy nghĩ các thuật tốn tìm kiếm là đưa ra các thao tác tổng quát được rút ra từ các cài đặt cụ thể, sao cho các cài đặt khác nhau thể được thay thế dễ dàng. Các thao tác đó gồm: - Khởi... được chèn vào thì địi hỏi cùng số lần so sánh trung bình nhưng linh động hơn đối với tìm kiếm nhị phân. Tuy nhiên, nếu các khố khơng được sắp xếp ngẫu nhiên thì thuật tốn sẽ thể hiện xấu hơn.* Trong trường hợp xấu nhất - một thao tác tìm kiếm trên cây tìm kiếm nhị phân N khố thể địi hỏi N lần so sánh. - Khi các khoá được chèn vào theo thứ tự (hay thứ tự ngược), phương pháp tìm kiếm trên... tự cho các cây con chúng ta thấy thuật toán thời gian tìm kiếm trung bình xấp xỉ logarit. Vậy Một thao tác tìm kiếm hay chèn trên một cây tìm kiếm nhị phân địi hỏi trung bình 2lnN phép so sánh, trong đó cây đang xét được xây dựng từ N khoá ngẫu nhiên. - Với mỗi nút trong cây, số các phép so sánh dùng cho thao tác tìm kiếm thành cơng là khoảng cách từ nút đó tới gốc. Tổng của khoảng cách này... một xâu được sắp xếp, một lần tìm kiếm thể kết thúc khơng thành cơng khi một mẩu tin khố lớn khố đang tìm kiếm được tìm thấy. Do đó, về mặt trung bình, chỉ khoảng một nửa các mẩu tin (không phải là tất cả) cần được kiểm tra cho một lần tìm kiếm khơng thành cơng. Thứ tự sắp xếp được duy trì dễ dàng tại vị trí mà việc tìm kiếm kết thúc khơng thành cơng. Ta xét kỹ thuật sau: function listsearch(v... hiencay(dau ↑.r) sẽ in ra các khóa của cây theo thứ tự. Q trình này đưa ra một phương pháp sắp xếp tương tự như phương pháp Quicksort, trong đó nút gốc của cây đóng vai trò là phần tử phân hoạch của Quicksort. - Dễ dàng thấy được sự khác nhau giữa hai phương pháp sắp xếp này là: phương pháp sắp xếp dựa vào cây tìm kiếm nhị phân phải dùng thêm nhiều bộ nhớ trợ giúp, trong phương pháp Quicksort dùng ít... so sánh với S, cứ tiếp tục như thế I sẽ được so sánh với E, R, cuối cùng là H. Các liên kết trong nút chứa H trỏ tới z quá trình tìm kiếm kết thúc: I được so sánh với chính nó ở trong z tìm kiếm kết thúc khơng thành cơng. Chèn nút trong cây nhị phân Để chèn thêm một nút mới vào cây (giả sử chúng ta đã tìm kiếm nó khơng thành cơng, kế đến gặp nó trong nơi chứa z), chúng ta cần một thủ tục... thực sự cần thiết. Thuật ngữ thường được dùng trong việc mô tả cấu trúc dữ liệu của việc tìm kiếm là TỪ ĐIỂN BẢNG KÝ HIỆU. Một ví dụ điển hình như ta muốn xây dựng hệ thống tra từ điển Tiếng Anh chẳng hạn. Ở đây, “khoá” là từ “mẩu tin” là diễn giải cho từ đó, mỗi mẩu tin chứa định nghĩa, cách phát âm các thông tin khác. BẢNG KÝ HIỆU chính là từ điển cho chương trình các mẩu tin chứa thông... Mỗi mẩu tin được tìm thấy sẽ chứa tồn bộ thơng tin để cung cấp cho một q trình xử lý nào đó. Việc tìm kiếm được áp dụng rất đa dạng rộng rãi. Một Ngân hàng nắm giữ tất cả thông tin của rất nhiều tài khoản khách hàng cần tìm kiếm để kiểm tra các biến động. Một hãng Bảo hiểm hay một hệ thống trợ giúp bán vé xe, vé máy bay….Việc tìm kiếm thơng tin để đáp ứng việc xắp đặt ghế các yêu cầu tương . Bài toán tìm kiếm và các phương pháp tìm kiếm cơ bảnThu HươngI. Bài toán: Tìm kiếm luôn là thao tác nền móng cho rất nhiều tác vụ tính toán. Tìm kiếm nghĩa. chạy cho việc tìm kiếm gần bằng lg(N) cộng với số mẩu tin được tìm thấy. Bài toán tìm kiếm và các phương pháp tìm kiếm cơ bảnThu Hương3. Tìm kiếm trên cây

Ngày đăng: 07/09/2012, 10:55

Hình ảnh liên quan

thấy rằng, khi tiềm kiếm M trong bảng được xây dựng từ các khoá BA CDEF GHMP N R X, khi đó kích thước đoạn giảm ít nhất một nửa ở mỗi bước - Thuật toán tìm kiếm và các phương pháp tìm kiếm cơ bản

th.

ấy rằng, khi tiềm kiếm M trong bảng được xây dựng từ các khoá BA CDEF GHMP N R X, khi đó kích thước đoạn giảm ít nhất một nửa ở mỗi bước Xem tại trang 6 của tài liệu.
Tìm khoá I trên cây trong hình trên bằng cách dùng thủ tục timkiemcaynhiphan. Trước tiên I được so sánh với khoá A ở gốc - Thuật toán tìm kiếm và các phương pháp tìm kiếm cơ bản

m.

khoá I trên cây trong hình trên bằng cách dùng thủ tục timkiemcaynhiphan. Trước tiên I được so sánh với khoá A ở gốc Xem tại trang 9 của tài liệu.

Từ khóa liên quan

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

Tài liệu liên quan