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.