Cài đặt Thuật toỏn 3.4.5 tỡm kiếm dữ liệu trong cõy nhị phõn tỡm kiếm B.3.15 Cài đặt chương trỡnh tỡm cõy mó Hufman vớ

Một phần của tài liệu chuong-3 (Trang 44 - 48)

V. CÂY MÃ HUFFMAN

B.3.14. Cài đặt Thuật toỏn 3.4.5 tỡm kiếm dữ liệu trong cõy nhị phõn tỡm kiếm B.3.15 Cài đặt chương trỡnh tỡm cõy mó Hufman vớ

B.3.15. Cài đặt chương trỡnh tỡm cõy mó Hufman với

- file dữ liệu đầu vào

HUFFMAN.INP cú cấu trỳc n số ký hiệu x1 t1 ký hiệu và tần suất thứ 1 x2 t2 ký hiệu và tần suất thứ 2 ... xn tn ký hiệu và tần suất thứ n

- file dữ liệu đầu ra

HUFFMAN.OUT cú cấu trỳc

e hệ số mó húa tối ưu

x1 m1 ký hiệu và mó thứ 1

x2 m2 ký hiệu và mó thứ 2

...

xn mn ký hiệu và mó thứ n

Hướng dẫn

+ Khai bỏo cấu trỳc nỳt cõy như sau

pointer kiểu con trỏ trỏ đến nỳt cõy mó nodetype kiểu nỳt gồm cỏc trường

{ ký hiệu symbol, (char) tần suất frequency, (float)

Chương III. Cõy III.45

chỉ số nỳt trỏi left, (int) chỉ số nỳt phải right, (int) mó tiền tố code, (mảng ký tự)

nhón nỳt gốc isroot (isroot = 1 hoặc 0 đỏnh dấu nỳt là gốc hoặc khụng phải gốc)

nhón leftvisited (leftvisited = 1 hoặc 0 đỏnh dấu nhỏnh trỏi đó thăm hoặc chưa thăm)

nhón rightvisited (rightvisited = 1 hoặc 0 đỏnh dấu nhỏnh phải đó thăm hoặc chưa thăm)

}

node[i] kiểu con trỏ pointer, i=1,...,2n1 (cõy mó tiền tố cú 2n1 nỳt) + Khởi tạo:

Đọc file HUFFMAN.INP

Tạo cỏc nỳt node[i], i=1,...,n, nạp dữ liệu của n ký hiệu. + Xõy dựng cõy mó tối ưu:

Vũng lặp (m chạy từ n+1 đến 2n1 ) thực hiện:

{ - Tỡm hai nỳt gốc m1, m2 (1  m1  m2  m1) cú tần suất t nhỏ nhất: { min1:= ; min2 := ; m1 := 0; m2 := 0;

Vũng lặp (i chạy từ 1 đến m1 ) thực hiện: { nếu node[i]isroot =1 thỡ

{ nếu node[i]frequency < min1 thỡ

{ min2 := min1; min1:= node[i]frequency; m2 := m1; m1 := i

}

nếu min1  node[i] frequency < min2 thỡ

{ min2:= node[i]frequency; m2 := i } }

} }

- Tạo nỳt node[m]

{ node[m]frequency := min1+min2;

node[m]left := m1; node[m]right := m2; node[m]isroot := 1; node[m]leftvisited := 0; node[m]rightvisited := 0; node[m1]isroot := 0; node[m2]isroot := 0; } }

+ Tạo mó Huffman: duyệt cõy gốc node[2n1] tương tự phương phỏp tỡm cõy phủ theo chiều sõu.

Trong thuật giải này ta ký hiệu S là ngăn xếp (stack) cỏc chỉ số đỉnh, code là mảng cỏc bớt chứa mó, length là độ dài mó, m số ký hiệu được mó húa, e là hệ số mó húa tối ưu.

Chương III. Cõy III.46

Khởi tạo ngăn xếp S := [2n1], length := 0, m := 0. e := 0; (ii) while (m < n)

{Xột pS.

Nếu (p <= n) thỡ (ghi mó cho nỳt lỏ) { node[p]code := code[1..length]; e := e + node[p]frequency*length;

Đẩy p ra khỏi ngăn xếp S.

length := length 1;

m := m + 1; }

Ngược lại

Nếu (node[p]->leftvisited = 1) & (node[p]->rightvisited = 1) thỡ (quay lui) {

Đẩy p ra khỏi ngăn xếp S.

length := length 1; }

Ngược lại

Nếu (node[p]leftvisited = 0) thỡ (thăm nhỏnh trỏi) { node[p]leftvisited := 1;

Đẩy node[p]left vào ngăn xếp S.

length := length +1;

code[length] := ‘0’; }

Ngược lại thỡ (thăm nhỏnh phải) { node[p]rightvisited := 1;

Đẩy node[p]right vào ngăn xếp S.

length := length +1; code[length] := ‘1’; } } (kết thỳc while) + Kết xuất mó: Mở file kết quả; Kết xuất hệ số nộn e; Vũng lặp (m chạy từ 1 đến n ) thực hiện: { Xuống dũng;

Kết xuất node[m]symbol;

Kết xuất node[m]code;

} Đúng file kết quả; B.3.16. Cài đặt ch-ơng trình tìm rừng phủ nhỏ nhất. Đầu vào: Trọng đồ G. Đầu ra: Rừng phủ nhỏ nhất. Ph-ơng pháp:

- Giai đoạn 1: Tìm thành phần liên thông của đồ thị G.

Chương III. Cõy III.47

Hướng dẫn cài đặt chương trỡnh tỡm cỏc thành phần liờn thụng:

Khai bỏo:

n là số đỉnh; m là số cạnh;

dau[i], cuoi[i] là đỉnh đầu, đỉnh cuối cạnh thứ i, i=1,..., m.

tplt[i] : integer; số hiệu thành phần liờn thụng của đỉnh i trong T, i=1..n. SoTPLT:integer; số thành phần liờn thụng.

Procedure Input;

{nhập dữ liệu đầu vào từ bàn phớm hoặc file: n, m, dau[i], cuoi[i], i=1, …, m } Procedure Init;{khởi tạo}

begin

for v := 1 to n do tplt[v] := v; SoTPLT := n; end;

Procedure CapNhatTPLT(x, y:integer); var i:integer;

begin

for i := 1 to n do

if tplt[i] = y then tplt[i] := x; for i := 1 to n do

if tplt[i] = SoTPLT then tplt[i] := y; end;

Procedure TPLT; var i, x, y : integer; begin

for i := 1 to m do

if (tplt[dau[i]] <> tplt[cuoi[i]]) then begin x := min(tplt[dau[i]], tplt[cuoi[i]]); y := max(tplt[dau[i]], tplt[cuoi[i]]); CapNhatTPLT(x, y); SoTPLT := SoTPLT – 1; end; end; Function min(x,y:integer):integer; begin if x < y then min := x else min:= y; end; Function max(x,y:integer):integer; begin

Chương III. Cõy III.48 if x > y then max := x else max := y; end; Procedure Output; var i:integer; begin {mở file} <Ghi SoTPLT>; for i := 1 to SoTPLT do begin <xuống dũng> for j := 1 to n do if tplt[j] = i then <Ghi(j)>; end; {đúng file} end; {chương trỡnh chớnh} begin input; init; TPLT; output; end.

Một phần của tài liệu chuong-3 (Trang 44 - 48)