HĂNG ƯU TIÍN

Một phần của tài liệu Tài liệu cấu trúc dữ liệu cơ bản (Trang 67)

1. Khâi niệm về hăng ưu tiín TOP

Ðđy lă một kiểu dữ liệu trừu tượng dựa trín mô hình nền lă tập hợp cùng với câc phĩp toân xen (Isnert) vă xóa phần tử bĩ nhất (DeleteMin). Ta cũng bổ sung thím phĩp toân MakeNull để khởi tạo cấu trúc rỗng. Ðể xâc định phĩp toân mới DeleteMin ta giả thiết rằng câc phần tử trong tập hợp đang xĩt tương ứng với câc phần tử của một tập hợp có thứ tự tuyến tính. Nói câch khâc lă có một hăm P cho tương ứng một phần tử a trong tập hợp đang xĩt với một phần tử P(a) thuộc tập hợp có thứ tự tuyến tính. P(a) được gọi lă độ ưu tiín của ạ Phĩp toân DeleteMin sẽ cho ra kết quả lă phần tử có độ ưu tiín bĩ nhất trong tập hợp vă xóa nó ra khỏi tập hợp năỵ

2. Căi đặt hăng ưu tiín TOP

Ta có thể căi đặt hăng ưu tiín bằng danh sâch liín kết, danh sâch liín kết có thể có hoặc không có thứ tự. Ta không thể căi đặt hăng ưu tiín bằng bảng băm vì bảng băm không thuận tiện cho việc tìm kiếm phần tử bĩ nhất. Một câch căi đặt hăng ưu tiín thuận lợi lă căi đặt bằng cđy có thứ tự từng phần.

3. Căi đặt hăng ưu tiín bằng cđy có thứ tự từng phần

TOP

Ý tưởng cơ bản lă tổ chức câc phần tử của hăng ưu tiín dưới dạng một cđy nhị phđn vă cố gắng lă cđy nhị phđn cđn bằng có thể được. Tại mức thấp nhất của cđy có thể có một số lâ rỗng, nhưng ta quy ước rằng câc lâ rỗng phải xuất hiện bín phải câc lâ thật sự.

Ðiều quan trọng nhất lă cđy phải có thứ tự từng phần theo nghĩa độ ưu tiín của một nút nhỏ hơn hoặc bằng độ ưu tiín của nút con của nó. Ví dụ như cđy sau:

Thực hiện DeleteMin

Ðể thực hiện DeleteMin ta chỉ cần trả ra nút gốc của cđy vă loại bỏ nút năỵ Tuy nhiín, nếu loại bỏ nút năy ta cần xđy dựng lại cđy với yíu cầu lă cđy phải có thứ tự từng phần vă cđn bằng. Chiến lược xđy dựng lại cđy như sau :

+ Lấy nút lâ thật sự tại mức cao nhất vă lă nút lâ bín phải nhất lín thay thế nút gốc. Như thế có thể cđy không bảo đảm thứ tự từng phần.

+ Tiếp đó, ta sẽ đẩy nút năy xuống dưới tức lă đổi chỗ nút với nút con bĩ nhất của nó nếu nút con năy có độ ưu tiín nhỏ hơn nó. Hơn nữa quâ trình năy diễn ra không quâ log2n + 1 bước.

Ví dụ : Xóa nút gốc có khóa 3 trong cđy có ví dụ trín

Thực hiện Insert: Xen nút x = 4 văo thay thế lâ rỗng bín trâi nhất thì ta được cđy như sau :

4. Căi đặt cđy có thứ tự toăn phần bằng mảng TOP

Trong thực tế, cđy có thứ tự từng phần thường được căi đặt bằng mảng (gọi lă Heap). Nếu cđy có n nút, ta chứa n nút năy văo n ô đầu của một mảng A năo đó. A[1] chứa nút gốc của cđỵ Nút A[i] sẽ có con trâi lă A[2*i] vă con phải lă A[2*i +1]

Ví dụ : Heap có 11 phần tử như cđy sau :

Nói một câch khâc, nút cha của nút A[i] lă A[i div 2] với i > 1. Như vậy cđy được xđy dựng lớn dần lín từ mức năy đến mức khâc bắt đầu từ đỉnh (gốc) vă tại mỗi mức cđy phât triển từ trâi sang phảị

Khai bâo :

Const Maxlenght = ... ; { số phần tử của mảng } Type ElementType = ... ; { Kiểu phần tử }

Elements = array [ 1 .. Maxlenght] of ElementType ; Last : Integer ;

End ; Thủ tục khởi tạo hăng ưu tiín rỗng :

Procedure MakeNullPriorityQueue (Var A : PriorityQueue);

Begin ẠLast := 0; End;

Thủ tục xen một phần tử văo cđy có thứ tự từng phần :

Procedure InsertPriorityQueue (x: ElementType; Var A : PriorityQueue);

Var i : Integer ;

Temp : ElementType ; Begin

If ẠLast > Maxlenght then Writeln (‘ Mang day ‘) Else

Begin

ẠLast := ẠLast + 1; ẠElements [ẠLast] := x; i := Ạ Last ; { Cho phần tử mới nổi dần lín } (adsbygoogle = window.adsbygoogle || []).push({});

While (i > 1) and (p(ẠElements[i]) < p(ẠElements[i div 2]) do Begin { Ðổi chỗ với nút cha }

Temp := ẠElements[i] ; ẠElements[i] : = ẠElements[i div 2] ; ẠElements[i div 2] := Temp ; i := i div 2 ;

End ; { While } End ; { Else }

End;

Thủ tục xóa một phần tử có độ ưu tiín bĩ nhất :

Function DeletePriorityQueue ( Var A : PriorityQueue) : ElementType ;

Var i: Integer ;

Temp, min : ElementType ; Done : Boolean ;

Begin

If ẠLast = 0 then

Writeln (‘ Cay rong ‘) Else

Begin

Min := ẠElements[1] ; { Nút gốc }

ẠElements[1] : = ẠElements[ẠLast] ; ẠLast := ẠLast - 1 ; i := 1 ; { Nút đang xĩt } Done := False ;

While (i< = ẠLast div 2 ) and ( Not Done ) do Begin

If (p(ẠElements[2*i]) < p(ẠElements[2*i + 1])) or (2*i = ẠLast) then j := 2 * I Else j := 2 * i + 1 ;

If p(ẠElements[i]) > p(ẠElements[j ]) then Begin

Temp := ẠElements[i] ; ẠElements[i] : = ẠElements[j] ; ẠElements[j] := Temp ; i := j ;

End { If } Else Done := True ; End ; {While }

End ; { Else } DeleteMin := Min ; End ;

BĂI TẬP CUỐI CHƯƠNG 4

Băi 1 : Một bảng băm có 07 Bucket, hăm băm lă h(x) = x mod 7. Hêy vẽ hình biểu diễn bảng băm khi ta lần lượt đưa văo bảng băm rỗng câc khóa1, 8, 27, 64, 125, 216, 343 trong câc trường hợp sau :

ạ Dùng bảng băm mở.

b. Dùng bảng băm đóng với chiến lược giải quyết đụng độ lă băm lại tuyến tính.

Băi 2 : Căi đặt bảng băm đóng, với chiến lược băm lại lă phĩp thử cầu phương. Tức lă hăm băm lại lần thứ i có dạng hi = (h(x) + i2) Mod B.

Băi 3 : Vẽ cđy có thứ tự từng phần được thiết lập bằng câch lần lượt đưa văo cđy rỗng câc khóa : 5, 9, 6, 4, 3, 1, 7.

Băi 4 : Giả sử trong một tập tin văn bản có câc ký tự đặc biệt sau :

+ BLANK = 32 lă mê ASCII của ký tự trống. + CR = 13 lă mê ASCII của ký tự kết thúc dòng. + LR = 10 lă mê ASCII của ký tự xuống dòng. + EOF = 26 lă mê ASCII của ký tự kết thúc tập tin.

Một từ (Word) trong văn bản được định nghĩa lă một chỗi câc ký tự không chứa ký tự đặc biệt năọ Hơn nữa ký tự trước chuỗi trong văn bản hoặc không có hoặc lă ký tự đặc biệt vă ký tự sau chuỗi lă ký tự đặc biệt. (adsbygoogle = window.adsbygoogle || []).push({});

Viết chương trình thănh lập một tự điền gồm câc từ trong văn bản bằng một bảng băm mở. Bằng câch đọc từng ký tự trong tập tin văn bản cho đến khi hết văn bản, khi đọc phải thiết lập từ để khi gặp ký tự đặc biệt (hết từ) thì đưa từ đó văo bảng băm nếu nó chưa có trong bảng băm. Hăm băm có thể chọn lă hăm đê được trình băy trong băi học.

Băi 5 : Ta thấy rằng nếu ta lần lượt thực hiện DeleteMin trín cđy có thứ tự từng phần thì ta sẽ được một dêy câc khóa có thứ tự tăng. Hêy dùng ý tưởng năy để sắp xếp một dêy số nguyín.

Băi 6 : Viết chương trình dùng cấu trúc bảng băm mở để căi đặt một tự điển Anh- Việt đơn giản. Sử dụng mỗi mục từ trong tự điển chỉ gồm câc từ bằng tiếng Anh vă phần giải nghĩa cho từ năy bằng tiếng Việt. Cấu trúc mỗi mục của từ đó như sau :

Type Item = Record

Words : String [20]; Explaination : String [50]; End;

CHƯƠNG 5 : ĐỒ THỊ

Ị CÂC ĐỊNH NGHĨA

IỊ KIỂU DỮ LIỆU TRỪU TƯỢNG ĐỒ THỊ IIỊ BIỂU DIỄN ĐỒ THỊ TRÍN MÂY TÍNH

1. Biểu diễn đồ thị bằng ma trận kề

2. Biểu diễn đồ thị bằng danh sâch câc đỉnh kề IV. CÂC PHĨP DUYỆT ĐỒ THỊ

1. Duyệt theo chiều sđu 2. Duyệt theo chiều rộng

Một phần của tài liệu Tài liệu cấu trúc dữ liệu cơ bản (Trang 67)