1= array[0 MN] of integer; MB1 = array[0 MN] of byte;

Một phần của tài liệu Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# Tập 1 - Chương 5 potx (Trang 31 - 34)

var

s,t,p: MI1;

{s[i] - so phan tu trong tep i} {t[i] - tro trai}

d: MB1; {danh dau tep da xu li} n: integer; {so luong tep ban dau} n: integer; {so luong tep ban dau} h: integer; {cay Huffman}

f,g: text; tt: longint; procedure Doc; var i: integer; begin

assign(f,fn); reset(f); read(f,n); for i := 1 to n do read(f,s[i]); close(f);

end;

{--- Tim trong so cac dinh chua xu li Tim trong so cac dinh chua xu li mot dinh dat trong so min

va danh dau dinh tim duoc.

---} function min1: integer; tự viết function min1: integer; tự viết

{--- Tim trong so cac dinh chua xu li Tim trong so cac dinh chua xu li hai dinh u va v dat

trong so min, U < v.

---} procedure min2(var u,v: integer); tự viết procedure min2(var u,v: integer); tự viết {---

Tao cay Huffman h = 2n-1 tu cac trong so s[1..n]

---} procedure Huffman; tự viết procedure Huffman; tự viết {--- Duyet cac dinh tu n+1 den 2n-1, ghi thong tin vao tep.

---} procedure Ghi; tự viết procedure Ghi; tự viết

BEGIN

Doc; Huffman; Ghi; END. // C# using System; using System.IO; namespace SangTao1 { /*--- * Cay Huffman

* Tron n file sap tang

class HuffmanTree {

static string fn = "MF.inp"; // file ket qua static string gn = "MF.out"; // file ket qua static int[] t; // tro trai

static int[] p; // tro phai static int[] v; // trong so dinh

static int[] d; // danh dau dinh da xu ly static int n = 0; // so phan tu

static int n2; // n2 = 2*n

static int h = 0; // Goc cua cay Huffman static int tt = 0; // tong trong so

static void Main() {

Doc(); Huffman();Ghi(); Test(); Console.WriteLine("\n Fini"); Console.ReadLine();

} // Main

static void Ghi() {

StreamWriter f = File.CreateText(gn); for (int i = n + 1; i <= h; ++i) f.WriteLine(t[i] + " " + p[i] + " " + i); f.WriteLine(tt);

f.Close(); }

static void Huffman() {

h = n; // goc cay Huffman tt = 0; // tong trong so int m1 = 0, m2 = 0; int x;

for (int i = 1; i < n; ++i) {

m1 = MinV(); m2 = MinV(); if (m1 > m2) if (m1 > m2)

{x = m1; m1 = m2; m2 = x;} // m1 < m2

++h; // them dinh moi v[h] = v[m1] + v[m2]; t[h] = m1; // tro trai p[h] = m2; // tro phai tt += v[h]; } }

// Tim dinh chua xu ly co trong so min static int MinV()

{

int imin = 0;

for (int i = 1; i <= h; ++i)

if (d[i] == 0) // dinh i chua x li if (v[i] < v[imin]) imin = i;

d[imin] = 1; // danh dau dinh i return imin;

}

static void Doc() {

char[] cc = new char[] {'\n',' ','\t','\0','\r'}; int [] a = Array.ConvertAll((File.ReadAllText(fn)).Split(cc, StringSplitOptions.RemoveEmptyEntries), new Converter<string,int>(int.Parse)); n = a[0]; n2 = 2*n; v = new int[n2]; t = new int[n2]; p = new int[n2]; d = new int[n2];

v[0] = int.MaxValue; // linh canh // Khoi tri cac nut cua cay for (int i = 0; i < n2; ++i) t[i] = p[i] = d[i] = 0; for (int i = 1; i <= n; ++i) v[i] = a[i];

}

static void Print(int[] a, int n) tự viết static void Test() tự viết

} // Huffmantree } // SangTao1

Chú ý

Thuật ngữ tham lam không có nghĩa là lấy nhiều nhất mà chỉ là xác định một chiến lược xử lí dữ liệu sao cho có hiệu quả nhất.

Một phần của tài liệu Sáng tạo trong thuật toán và lập trình với ngôn ngữ Pascal và C# Tập 1 - Chương 5 potx (Trang 31 - 34)

Tải bản đầy đủ (PDF)

(34 trang)