1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc

27 422 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 27
Dung lượng 374,14 KB

Nội dung

Luận văn tốt 56 Chương 5 MỘT SỐ VẤN ĐỀ VỀ CÂY I. CÁC KHÁI NIỆM VÀ TÍNH CHẤT CƠ BẢN 1. Định nghĩa Cho đồ thị G = <X, U> , G được gọi là một cây nếu G liên thông và không có chu trình, ở đây n =  X  > 1. Khi đó sáu tính chất sau là tương đương 1) G là đồ thị liên thông và không có chu trình 2) G không có chu trình và có n - 1 cạnh 3) G liên thông và có n - 1 cạnh 4) G không có chu trình và nếu thêm vào một cạnh nối 2 đỉnh không kề nhau thì G xuất hiện duy nhất một chu trình. 5) G liên thông và nếu bỏ đi một cạnh tuỳ ý thì đồ thị nhận được sẽ không liên thông. 6) Mỗi cặp đỉnh trong G được nối với nhau bằng một đường duy nhất. Chứng minh: Ta chứng minh theo trình tự sau: 1)  2)  3)  4)  5)  6)  1). Ta sử dụng đẳng thức v(G) = m - n + p là số chu trình độc lập của đồ thị G = <X, U> , ở đây  X  = n,  U  = m và p là số thành phần liên thông của G. 1)  2): Vì G không có chu trình nên v(G) = m - n + p = 0. Do G liên thông nên p =1 khi đó m - n + 1 = 0 hay số cạnh m = n - 1. 2)  3): Giả sử G không có chu trình và n - 1 cạnh ta chứng minh 3) Thật vậy, giả sử ngược lại G không liên thông, khi đó p  2 . Từ 2) ta có v(G) = m - n + p = 0 và m = n -1, kết hợp ta có (n - 1) - n + p = 0 hay p = 1, trái với giả thiết p  2. Vậy G liên thông và số cạnh là n -1. 3)  4): Giả sử G là liên thông và có n - 1 cạnh, ta chứng minh 4). Thật vậy vì G liên thông nên p = 1, mặt khác m = n - 1 nên v(G) = m - n + 1 = 0 hay G không có chu trình . Nếu thêm vào G một cạnh thì ta được đồ thị G' với số cạnh là n, hay v(G') = n - n + 1 = 1 hay G' có một chu trình. 4)  5): Giả sử ngược lại G không liên thông, tức là tồn tại cặp đỉnh x, y trong G mà không có đường nào nối x với y. Khi đó nối x và y bởi 1 cạnh, đồ thị nhận được vẫn không có chu trình điều này mâu thuẫn với 4). Hay G là liên thông. Luận văn tốt 57 Nếu bỏ đi 1 cạnh trong G mà đồ thị vẫn liên thông thì nếu khôi phục lại cạnh này đồ thị sẽ có chu trình. Điều này mâu thuẫn với 4). Vậy ta có 5). 5)  6): Giả sử ngược lại, nếu trong G có tồn tại cặp đỉnh x, y không nối với nhau bằng đường nào cả, chứng tỏ G không liên thông mâu thuẫn với 5). Vậy mỗi cặp đỉnh đều có đường đi nối với nhau, đường đó là duy nhất vì nếu có nhiều hơn thì sau khi bỏ đi 1 đường đồ thị vẫn liên thông, trái với 5).  6)  1) Với mỗi cặp đỉnh nối với nhau bởi một đường thì G là liên thông. Giả sử G có chu trình thì xét cặp đỉnh x, y trên chu trình đó. Khi đó x, y có 2 cặp đường nối với nhau, mâu thuẫn với 6). 2. Một số khái niệm cơ bản - Gốc: Đối với một cây T bất kỳ có thể chọn 1 đỉnh nào đó làm gốc, một cây đã được chọn 1 đỉnh làm gốc thì được gọi là cây có gốc. Vậy m ột cây có thể tạo thành nhiều cây có gốc khác nhau. - Quan hệ cha con: Giả sử a là gốc nếu có b, c kề với a thì b, c được gọi là con của a (hoặc gọi a là cha của b, c) tương tự nếu có d, e kề với b thì b là cha của chúng còn d, e là con của b (Xem cây T' hình 1.1). - Trong một cây tất cả các đỉnh là cha được gọi là các đỉnh trong. Các đỉnh không phải là đỉnh trong được gọi là lá (hay lá là đỉnh con không có con), trong cây chỉ có gốc là đỉnh duy nhất không phải là con. - Bậc của đỉnh là số các con của nó, bậc của cây là bậc lớn nhất của đỉnh. - Mức của cây: Mỗi 1 đỉnh đều được gán bằng một mức, mức của gốc là 0, con của gốc có mức là 1. Nếu mức của cha là i thì mức của con là i + 1. Một đỉnh x nào đó có mức bằng độ dài đường đi từ gốc đến x, mức cao nhất trong số các đỉnh được gọi là chiều cao của cây. Khi cây chưa có gốc, chưa phân chia thành các các mỗi quan hệ cha con, bậc, mức . thì câycây tự do còn khi được phân chia gọi là cây phân cấp. T T' Hình 1.1 a b d i j e h k c g f h a d i j b e k g c f Luận văn tốt 58 Ví dụ như hình 1.1 cây T là một cây tự do, nếu chọn a làm gốc thì nó trở thành cây phân cấp T' có gốc. Với cây T' gốc a có bậc 2 và mức 0, đỉnh c có bậc là 3 và mức 1 . Mức cao nhất là 3 ở các đỉnh là lá như i, j, k nên chiều cao của cây h(T') = 3. 3. Cây m - phân - Định nghĩa: Xét cây phân cấp T nếu mỗi đỉnh trong của nó có không quá m con thì T được gọi là cây m phân. Đặc biệt nếu m = 2 thì cây được gọi là cây nhị phân, cây nhị phân rất quan trọng và có nhiều ứng dụng r ộng rãi. - Cây đầy đủ: Cây m - phân T được gọi là cây m - phân đầy đủ nếu mỗi đỉnh trong đều có đúng m con. - Cây cân đối: Xét cây m - phân có chiều cao h. Nêu các lá của cây có mức h - 1 hoặc h thì cây được gọi là cây cân đối. 4. Các ứng dụng 4.1 Mã tiền tố Kỹ thuật nén và mã hoá là 1 trong những lĩnh vực thường hay được sử dụng trong Tin học, cây nhị phân có nhiều ứng dụng trong việc nghiên cứu áp dụng các giải thuật trong lĩnh v ực vực này. Một trong những ứng dụng của cây nhị phân đó là mã tiền tố. Ví dụ mã tiền tố như là dùng các xâu nhị phân có độ dài khác nhau để mã các ký tự để không có xâu nhị phân nào ứng với hơn một chữ cái. Trên cây nhị phân mã hoá, các lá là các ký tự cần mã hoá và đường đi từ cha đến con trái là 1 (hoặc 0), còn đi tới con phải là 0 (hoặc 1). Quá trình mã hoá sẽ duyệt cây đó từ gốc tới lá, khi tới nút con sẽ tạo ra một bít 0 ho ặc 1 và tới nút lá sẽ tạo ra một xâu bít. Do vậy, mã sinh ra cho một ký tự sẽ không là phần đầu của ký tự khác. Hình 1.2 Ví dụ như hình 1.2 cây nhị phân biểu diễn mã tiền tố của các ký tự a, e, i, k, o, p, u trong đó: a : 000 k : 1100 u : 11111 e : 001 o : 1101 i : 01 p : 11110 0 0 0 0 0 0 1 1 1 1 1 1 1 1 a e i k o p u Luận văn tốt 59 Thuật toán mã hoá Huffman: Một số thuật toán về mã tiền tố đã ra đời đã được sử dụng rộng rãi và đem lại hiệu quả cao trong vấn đề nén và mã hoá thông tin. Một trong những thuật toán đó là Huffman xuất hiện từ năm 1952, thuật toán này mã hoá theo phương pháp kiểu thống kê, tạo ra mã có độ dài thay đổi khác nhau khi đã có bảng tần số xuất hiện của các ký tự. Quá trình mã hoá và giải mã phụ thuộc vào việc xây dựng cây nhị phân mã hoá. Thuật toán Huffman tạo cây nhị phân từ nút lá đến nút gốc, ký tự nào có tần số càng cao thì nút lá tương ứng càng gần gốc hơn. Thuật toán: Vào: Bảng tần số xuất hiện các ký tự sắp xếp giảm dần Ra : Cây nhị phân biểu diễn mã, nhánh phải là 1, trái là 0. Bước 1: Lấy hai phần tử cuối bảng tần số xuất hiện ra khỏi bảng Bước 2: Nếu phần t ử nào chưa nằm trong cây nhị phân thì tạo ra một nút lá chứa phần tử đó, phần tử này chính là ký tự. Nối hai nút tương ứng với hai phần tử này với nhau thông qua việc tạo nút cha của chúng. Phần tử có tần số xuất hiện lớn hơn là nút trái, nhỏ hơn là nút phải. Bước 3: Tính tổng tần số xuất hiện của 2 phần tử này chèn vào bảng sao cho phù hợp với nguyên tắc giả m dần của bảng. Phần tử mới của bảng sẽ tương ứng với nút vừa được tạo ra ở bước 2. Bước 4: Quay trở lại bước 1 đến khi bảng chỉ còn lại 1 phần tử. Phần tử cuối cùng tương ứng với nút gốc của cây nhị phân. Ví dụ: Ta có kết quả mã Huffman cho các ký tự ở bảng sau: Ký tự Tần suất Mã nhị phân Chiều dài mã a 0.3 00 2 b 0.2 10 2 c 0.2 11 2 d 0.1 011 3 e 0.1 0100 4 f 0.1 0101 4 Cây nhị phân biểu diễn như hình 1.3 Luận văn tốt 60 Hình 1.3 Với thuật toán Huffman trường hợp xấu nhất là thời gian hình thành cây nhị phân là O(n) với n là số ký tự cần mã hoá. Chương trình viết bằng ngôn ngữ Pascal minh hoạ thuật toán tạo mã Huffman: Const n = 6; {Số ký tự cần mã hoá a, b, c, .} Type Nod = record S:integer; {tần suất} Code:String; {mã nhị phân} Name:char; {tên ký tự} end; Var a:array[1 n] of Nod; i,m:integer; Procedure InputData; {Khởi tạo bảng tần suất các ký tự} Var i:integer; begin for i:=1 to n do with A[i] do begin S:=Round(exp(n/5)/exp(i/5))+1;Name:=Char(64+i);Code:=''; end; end; Procedure FindCode(m:integer); {Sinh mã huffman} Var y,z:nod; k:integer; Begin if m=1 then exit; y:=a[m-1]; a[m-1].s:=a[m-1].s+a[m].s; k:=m-1; While (k>1) and (a[k].s>a[k-1].s) do Begin a,e,f,d,b,c a,e,f,d b,c e,f,da e,f d e f b c 0 0 0 0 0 1 1 1 1 1 0,3 0,6 0,2 0,1 0,1 0,1 0,3 0,4 0,2 0,2 Luận văn tốt 61 z:=a[k]; a[k]:=a[k-1]; a[k-1]:=z; k:=k-1; End; FindCode(m-1); z:=a[k]; for i:=k to m-2 do a[i]:=a[i+1]; a[m-1]:=y; a[m-1].code:=z.code+'1'; a[m].code:=z.code+'0'; End; BEGIN InputData; FindCode(n); For i:=1 to n do writeln(a[i].code); END. 4.2 Cây biểu diễn biểu thức Một biểu thức toán học có thể biểu diễn bằng cây, đây cũng là vấn đề hữu ích trong việc xử lý và lưu trữ biểu thức toán học trong máy tính Xét biểu thức đại số sau: Có thể vẽ 1 cây nhị phân như hình 1.4 biểu diễn biểu thức A, trong đó mỗi đỉnh trong mang dấu của một phép tính, gốc của cây mang phép tính sau cùng của A, ở đ ây là dấu nhân ký hiệu: *, mỗi lá mang 1 số hoặc một chữ đại diện cho số. Hình 1.4 Một phép duyệt cây là tiền thứ tự nếu thăm gốc trước rồi sau đó thăm con trái như là một cây con với phương pháp thăm gốc trước và cuối cùng thăm con phải như là một cây con với phương pháp thăm gốc trước. Duyệt cây như vậy mang tính đệ quy. Khi duyệt cây trên theo ti ền thứ tự ta có: * + a b - c / d 2 Cách viết biểu thức theo tiền thứ tự là ký pháp Balan. () ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ −×+= 2 d cbaA a * + - / b c d 2 Luận văn tốt 62 Bằng duyệt cây ta có thể tính được giá trị biểu thức, ngoài phương pháp tiền thứ tự còn có thể duyệt cây theo phương pháp pháp khác để tính giá trị biểu thức tùy vào yêu cầu và đặc điểm của từng bài toán. 4.3 Cây quyết định Có những bài toán phụ thuộc vào các quyết định. Mỗi quyết định thì có thể có nhiều kết cục và những kết cục cuối cùng chính là lời giải của bài toán. Để giải nh ững bài toán như vậy, người ta biểu diễn mỗi quyết định bằng một đỉnh của đồ thị và mỗi kết cục là 1 lá của quyết định. Một cây được xây dựng như trên gọi là cây quyết định. Trong nhiều bài toán Tin gặp phải, có thể dùng cây quyết định để mô hình hoá từ đó việc cài đặt sẽ dễ dàng thuận tiện hơn. Ví dụ: hình 1.5 là cây quyết định biểu di ễn việc sắp xếp 3 số khác nhau a, b, c Hình 1.5 Đoạn chương trình sau thể hiện cho cây trên: Var a, b, c: Integer; Function Can(x,y: Integer): Boolean; Begin if x > y then Can:=True Else Can:=False; End; Begin Readln(a,b,c); a ? b a ? c b ? c b ? c a ? c c<a<b c<b<a b<c<a b<a<c a<c<b a<b<c b<a a<b c<a a<c c<b b<c c<b b<c c<a a<c Luận văn tốt 63 If Can(a,b) then Begin If Can(a,c) then Begin if Can(b,c) then Writeln(c,' ',b,' ',a) Else Writeln(b,' ',c,' ',a); End Else Writeln(b,' ',a,' ',c); End Else Begin If Can(b,c) then Begin if Can(a,c) then Writeln(c,' ',a,' ',b) Else Writeln(a,' ',c,' ',b); End Else Writeln(a,' ',b,' ',c); End; End. 4.4 Cây sắp xếp và tìm kiếm Sắp xếp và tìm kiếm là một trong những vấn đề cơ bản trong kỹ thuật lập trình, cây nhị phân cũng có khá nhiều ứng dụng quan trọng trong vấn đề này. Ta có thể mô hình hoá việc sắp xếp và tìm kiếm bằng cây từ đó ta có thể đánh giá các kỹ thuật này từ góc độ về cây. 4.4.1 Sắp xếp chèn với tìm kiếm nhị phân Ý tưởng được bắ t đầu như sau, cho 1 danh sách chưa sắp xếp hãy tìm 1 phần tử x bất kỳ nào đó trong danh sách, rõ ràng để tìm ta phải lần lượt xét từng phần tử cho tới khi nào bắt gặp phần tử cần tìm, nếu danh sách lớn thì thời gian tìm rất lâu. Bây giờ với một danh sách đã sắp xếp, chia đôi danh sách và lấy phần tử là t ở vị trí chia đôi để so sánh. Nếu t = x thì dừng, nếu t < x vì danh sách đã sắp xếp nên x chỉ có thể nằm bên nửa phải danh sách nên ta chỉ việc tìm kiếm trong 1 nửa danh sách bên phải và giảm đi khá nhiều công việc tìm kiếm. Nếu x < t thì tương tự, ta chỉ việc tìm bên nửa trái, đối với việc tìm kiếm cho lần sau với các danh sách con nửa trái hoặc nửa phải ta thực hiện tương tự như vậy một cách đệ quy. a) Từ những ý tưởng thuật toán ta xây dựng cây nhị phân tìm kiếm cho một danh sách như sau: - Chọn 1 phần tử bất kỳ làm gốc - Tất cả các phần tử có giá trị  gốc thì thuộc cây con trái Luận văn tốt 64 - Tất cả các phần tử có giá trị > gốc thì thuộc cây con phải - Đối với các cây con thì cũng có tính chất tương tự như vậy Ví dụ cây nhị phân tìm kiếm cho danh sách 12, 10, 6, 11, 15, 13, 16, 19, 18 như hình 1.6: Hình 1.6 b) Sắp xếp chèn bằng việc tìm nhị phân vị trí đúng. Có thể tạm gọi là phương pháp sắp xếp chèn nhị phân. Ý tưởng như sau: cho trước một danh sách đã sắp xếp A, cần chèn 1 phần tử m ới x vào A sao cho danh sách luôn được sắp xếp. Đầu tiên ta tìm vị trí đúng của x trong A sau đó chèn x vào đúng vị trí này trong A, ta có danh sách A = A  {x} luôn được sắp xếp. Để tìm được ví trí đúng cần chèn của x trong A ta sử dụng phương pháp tìm kiếm nhị phân, chèn theo cách này gọi là chèn nhị phân. Ví dụ để sắp xếp B = x 1 , x 2 , x 3 , . x n ta thực hiện như sau: A :=  For i:=1 to n do Begin - Tìm vị trí đúng của x i trong A theo phương pháp tìm nhị phân - Chèn x i vào A theo đúng vị trí vừa tìm được (A := A  {x i }) End; Kết quả A là danh sách sắp xếp của B. Chương trình Pascal sau sắp xếp tăng dần theo phương pháp chèn nhị phân Const n = 9; Ds : Array[1 n] of Integer = (1,9,1,6,3,10,10,8,7); {Ham tra lai vi tri dung cua Pt trong danh sach} Function FindNp(l,r,Pt: Integer): Integer; Var t: Integer; Begin If Pt<=Ds[l] then FindNp:=l Else If Pt>=Ds[r] then FindNp:= r + 1 Else Begin 12 15 18 10 6 11 13 16 19 Luận văn tốt 65 Repeat t:= (l + r) div 2; If Pt = ds[t] then Begin FindNp:=t+1; Exit End Else If Pt<ds[t] then r:=t Else l:=t; Until r=l+1; FindNp:=l+1; End; End; Var i, j, vt, s: Integer; Begin For i:=2 to n do Begin vt:= FindNp(1,i-1,ds[i]); {Chen dung vi tri sao cho ds luon duoc sap xep} s:=ds[i]; For j:=i-1 Downto vt do ds[j+1]:=ds[j]; ds[vt]:=s; End; For i:=1 to n do Write(ds[i]:3); End. 4.4.2 Thuật toán sắp xếp hoà nhập Giả sử ta có danh sách chưa được sắp 8, 2, 4, 6, 9, 7, 10, 1, 5 ,3 có thể dùng cây nhị phân mô tả quá trình sắp xếp danh sách theo thứ tự tăng dần như sau: Cây nhị phân với gốc được gán là chính là danh sách đó. Các con của gốc được gán theo nguyên tắc: Con bên trái gán nửa danh sách đầu, con bên phải gán nửa danh sách còn lại (danh sách gán ở gốc cây con trái và cây con phải hoặc bằng nhau về số lượng hoặc chênh lệch nhau 1 phần tử). Cứ ti ếp tục cho tới khi cây nhị phân có mỗi lá được gán 1 phần tử trong dãy. Đó là cây như hình 1.7 [...]... O(nlog2n) II CÂY BAO TRÙM 1 Định nghĩa và các tính chất Định nghĩa: Cho đồ thị G = với số đỉnh n lớn hơn 1 Giả sử G' là đồ thị bộ phận của G (G' nhận được từ G bằng cách bỏ đi một số cạnh nhưng vẫn giữ nguyên đỉnh) Nếu G' = . Luận văn tốt 56 Chương 5 MỘT SỐ VẤN ĐỀ VỀ CÂY I. CÁC KHÁI NIỆM VÀ TÍNH CHẤT CƠ BẢN 1. Định nghĩa Cho đồ thị G = <X, U> , G được gọi là một cây. 0,2 0,2 Luận văn tốt 61 z:=a[k]; a[k]:=a[k-1]; a[k-1]:=z; k:=k-1; End; FindCode(m-1); z:=a[k]; for i:=k to m-2 do a[i]:=a[i+1]; a[m-1]:=y; a[m-1].code:=z.code+'1';

Ngày đăng: 12/12/2013, 19:15

HÌNH ẢNH LIÊN QUAN

Hình 1.1 - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
Hình 1.1 (Trang 2)
Ví dụ như hình 1.1 câ yT làm ột cây tự do, nếu chọ na làm gốc thì nó trở thành cây phân cấp T' có gốc - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
d ụ như hình 1.1 câ yT làm ột cây tự do, nếu chọ na làm gốc thì nó trở thành cây phân cấp T' có gốc (Trang 3)
Vào: Bảng tần số xuất hiện các ký tự sắp xếp giảm dần - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
o Bảng tần số xuất hiện các ký tự sắp xếp giảm dần (Trang 4)
Hình 1.3 - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
Hình 1.3 (Trang 5)
hình 1.5 là cây quyết định biểu diễn việc sắp xếp 3 số khác nhau a,b,c - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
hình 1.5 là cây quyết định biểu diễn việc sắp xếp 3 số khác nhau a,b,c (Trang 7)
Hình 1.7 - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
Hình 1.7 (Trang 11)
Hình 1.8 - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
Hình 1.8 (Trang 11)
Hình 1.9 - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
Hình 1.9 (Trang 14)
Hình 2.2 - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
Hình 2.2 (Trang 17)
Hình 2.3 - Tài liệu Luận văn tốt nghiệp - Một số vấn đề về cây doc
Hình 2.3 (Trang 26)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w