1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Cây tổng quát doc

77 1,4K 6
Tài liệu đã được kiểm tra trùng lặp

Đ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

Tiêu đề Cây tổng quát
Trường học Trường ĐHSPKT Hưng Yên
Chuyên ngành Công Nghệ Thông Tin
Thể loại Giáo trình
Thành phố Hưng Yên
Định dạng
Số trang 77
Dung lượng 1,96 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Cây cân bằng hoàn toàn CCBHT Định nghĩa: Cây cân bằng hoàn toàn là câynhị phân tìm kiếm mà tại mỗi nút của nó, số nút của cây con trái và cây con phải không chênh lệch nhau qúa một..

Trang 1

Bài 21: CÂY TỔNG QUÁT

Trong chương này chúng ta sẽ nghiên cứu mô hình dữ liệu cây (tree) Cây là một cấu trúc phân cấp trên một tập hợp nào đó các đối tượng Một ví dụ quen thuộc về cây, đó

là cây thư mục hoặc mục lục của cuốn sách cũng là một cây Cây được sử dụng rộng rãi trong rất nhiều vấn đề khác nhau Chẳng hạn nó được áp dụng để tổ chức thông tin trong các hệ cơ sở dữ liệu, để mô tả cấu trúc cú pháp của các chương trình nguồn khi xây dựng các chương trình dịch Rất nhiều bài toán mà ta gặp trong các lĩnh vực khác nhau được quy về việc thực hiện các phép toán trên cây Trong chương này chúng ta sẽ trình bày định nghĩa, các khái niệm cơ bản về cây Chúng ta cũng sẽ xét các phương pháp cài đặt cây và thực hiện các phép toán cơ bản trên cây Sau đó ta nghiên cứu kỹ một số dạng cây đặc biệt đó là cây nhị phân tìm kiếm và cây cân bằng

21.1 Định nghĩa

Định nghĩa 1: Một cây là tập hợp hữu hạn các nút trong đó có một nút đặc biệt gọi là

gốc (root) Giữa các nút có một quan hệ phân cấp gọi là "quan hệ cha con"

Định nghĩa 2: Cây được định nghĩa đệ qui như sau

1 Một nút là một cây và nút này cũng là gỗc của cây

2 Giả sử T1, T2, …,Tn (n 1) là các cây có gốc tương ứng r1, r2,…, rn Khi đó cây T với gốc r được hình thành bằng cách cho r trở thành nút cha của các nút r1, r2,…, rn

21.2 Các khái niệm về cây

Bậc của một nút: là số con của nút đó

Bậc của một cây: là bậc lớn nhất của các nút có trên cây đó (số cây con tối đa của một

nút thuộc cây) Cây có bậc n thì gọi là cây n - phân

Chiều cao của cây: là số mức lớn nhất có trên cây đó

Đường đi: Dãy các đỉnh n1, n2, ,nk được gọi là đường đi nếu ni là cha của ni+1 (1 ≤ i ≤

k-1

Độ dài của đường đi: là số nút trên đường đi -1

Cây được sắp : Trong một cây, nếu các cây con của mỗi đỉnh được sắp theo một thứ

nhất định, thì cây được gọi là cây được sắp (cây có thứ tự) Chẳng hạn, hình minh hoạ hai cây được sắp khác nhau

Trang 2

Rừng: là tập hợp hữu hạn các cây phân biệt

hình 5.2 Rừng gồm ba cây

21.3 Phép duyệt cây tổng quát

Trong khoa học máy tính , duyệt cây là việc lần lượt viếng thăm các đỉnh của cây theo một thứ tự nào đó Các cây nói trong bài này là cây có gốc

Định nghĩa phép duyệt cây như sau:

1) Sự nhất quán về thứ tự các nút được thăm giữa phép duyệt cây tổng quát và phép duyệt cây nhị phân tương đương của nó

2) Sự nhất quán giữa định nghĩa phép định nghĩa phép duyệt cây tổng quát với định nghĩa phép duyệt cây nhị phân Vì cây nhị phân cũng có thể coi là cây tổng quát và ta có thể áp dụng định nghĩa phép duyệt cây tổng quát cho cây nhị phân

Ta có thể xây dựng được định nghĩa của phép duyệt cây tổng quát T như sau

Duyệt theo thứ tự trước

a) nếu T rỗng thì không làm gì

b) Nếu T khác rỗng thì

Thăm gốc của T

Duyệtcác cây con thứ nhất T1 của gốc của cây T theo thứ tự trước

Duyệt các cây con còn lại T2, T3, ,Tn của gốc T theo thứ tự trước

Duyệt theo thứ tự giữa

a) Nếu T rỗng thì không làm gì

b) Nếu T khác rỗng thì

Duyệtcác cây con thứ nhất T1 của gốc của cây T theo thứ tự giữa

Thăm gốc của T

Duyệt các cây con còn lại T2, T3, ,Tn của gốc T theo thứ tự giữa

Tuy nhiên người ta ít xem xét việc duyệt trung thứ tự của cây tổng quát

Duyệt theo thứ tự sau

a) Nếu T rỗng thì không làm gì

b) Nếu T khác rỗng thì

Duyệtcác cây con thứ nhất T1 của gốc của cây T theo thứ tự sau

Duyệt các cây con còn lại T2, T3, ,Tn của gốc T theo thứ tự sau

Trang 3

Hình 5.17 Thì dãy tên các nút được thăm sẽ là

Thứ tự trước: A B C E H I F J D g

Thứ tự giữa : B A h E I C J F G D

Thứ tự sau : B H I E J F C G D a

Bây giờ ta dựng cây nhị phân tương đương với cây tổng quát ở hình 5.17

Hình 5.18 Cây nhị phân tương đương Dãy các nút được thăm khi duyệt nó theo phép duyệt của cây nhị phân:

21.4 Cài đặt cây tổng quát

Có nhiều phương pháp biểu diễn cây Cách thường dùng nhất là biểu diễn mỗi nút như một dữ liệu kiểu bản ghi, mỗi nút chứa các con trỏ tới các con hoặc cha của nó, hoặc cả hai Cây cũng có thể biểu diễn bằng các mảng cùng với quan hệ giữa các vị trí trong mảng

Trang 4

Khi biểu diễn cấu trúc cây tổng quát, vì mỗi nút có thể có nhiều con, số con có thể khác nhau, nên ta không dùng cho mỗi nút con một liên kết đến nút cha mà với mỗi nút vẫn chỉ

dành hai liên kết, một liên kết (trường Child) trỏ đến nút con đầu bên trái của nó, một liên kết (trường Next)trỏ đến nút cùng cha kề bên phải nó Nếu coi liên kết trường Child như liên kết Left, liên kết Next như liên kết Right ta có một cây nhị phân tương đương với cây

Trang 5

Bài 22: CÂY NHỊ PHÂN

22.1 Định nghĩa, tính chất

Định nghĩa: Cây nhị phân là cây mà mỗi nút có tối đa hai cây con Đối với cây con của

một nút người ta cũng phân biệt cây con trái và cây con phải

Như vậy cây nhị phân là cây có thứ tự

Hình 5.3 Một số cây nhị phân

Tính chất: Đối với cây nhị phân cần chú ý tới một số tính chất sau

i) Số lượng tối đa các nút có ở mức i trên cây nhị phân là 2i -1 (i 1)

ii) Số lượng nút tối đa trên một cây nhị phân có chiều cao h là 2h-1(h 1 )

Chứng minh

i) Sẽ được chứng minh bằng qui nạp

Bước cơ sở: với i = 1, cây nhị phân có tối đa 1 = 20 nút.Vậy mệnh đề đúng với i = 1

Bước qui nạp: Giả sử kết quả đúng với mức i, nghĩa là ở mức này cây nhị phân có tối đa

2i - 1 nút, ta chứng minh mệnh đề đúng với mức i + 1

Theo định nghĩa cây nhị phân thì tại mỗi nút có tối đa hai cây con nên mỗi nút ở mức i có tối đa hai con Do đó theo giả thiết qui nạp ta suy ra tại mức i+ 1 ta có

2i - 1x 2 = 2i nút

ii) Ta đã biết rằng chiều cao của cây là số mức lớn nhất có trên cây đó Theo i) ta suy ra

số nút tối đa có trên cây nhị phân với chiều cao h là :

20 + 21 + + 2h-1 = 2h -1

Từ kết quả này có thể suy ra:

Nếu cây nhị phân có n nút thì chiều cao của no là h = ⎡log2(n + 1)⎤

(Ta qui ước : ⎡x⎤ là số nguyên trên của x

⎣x⎦ là số nguyên dưới của x )

22.2 Phép duyệt cây nhị phân

Khi xét một cây nhị phân, mỗi đỉnh cùng với các đỉnh đứng sau nó là gốc của một cây con Ta xét một đỉnh A là đỉnh trong của cây nhị phân Theo thứ tự người ta xem xét thứ

tự thăm đỉnh A so với việc thăm hai con của nó là thăm A trước rồi 2 con sau, thăm A xen giữa việc thăm hai con, thăm A sau thi thăm hai con:

• A, con trái, con phải

• Con trái, A, con phải

Trang 6

Tất nhiên nếu không có con nào thì việc thăm con ấy không diễn ra Còn nếu con L hoặc con R của A lại là gốc của một cây con, thì việc thăm thay bằng việc duyệt cây con có gốc tại đó

Từ đó có các phương pháp duyệt tiền thứ tự, trung thứ tự, hậu thứ tự đối với cây nhị phân

có gốc tại đỉnh A như sau

Duyệt tiền thứ tự cây con gốc A

• Nếu Cây là rỗng Return

• Thăm A

• Duyệt tiền thứ tự cây con gốc L

• Duyệt tiền thứ tự cây con gốc R

Duyệt trung thứ tự cây con gốc A

• Nếu Cây là rỗng Return

• Duyệt trung thứ tự cây con gốc L

• Thăm A

• Duyệt trung thứ tự cây con gốc R

Duyệt hậu thứ tự cây con gốc A

• Nếu Cây là rỗng Return

• Duyệt hậu thứ tự cây con gốc L

• Duyệt hậu thứ tự cây con gốc R

• Duyệt tiền thứ tự với cây này diễn ra tuần tự như sau

1 Thăm A, Duyệt cây gốc B, Duyệt cây gốc C

2 Thăm A, Thăm B, Thăm D, Thăm E, Thăm C, Thăm F, Thăm G

• Duyệt trung thứ tự với cây này diễn ra tuần tự như sau

1 Duyệt cây gốc B, Thăm A, Duyệt cây gốc C

2 Thăm D, Thăm B, Thăm E, Thăm A, Thăm F, Thăm C, Thăm G

• Duyệt hậu thứ tự với cây này diễn ra tuần tự như sau

1 Duyệt cây gốc B, Duyệt cây gốc C, Thăm A

Trang 7

if node.left != null then visit(node.left)

if node.right != null then visit(node.right)

Duyệt hậu thứ tự

(post-order (postfix) traversal)

visit(node)

if node.left != null then visit(node.left)

if node.right != null then visit(node.right)

if node.right != null then visit(node.right)

22.3 Cài đặt cây nhị phân

Cây nhị phân là một cấu trúc bao gồm các phần tử (nút) được kết nối với nhau theo quan

hệ “cha-con” với mỗi cha có tối đa 2 con Để biểu diễn cây nhị phân ta chọn phương pháp cấp phát liên kết Ứng với một nút, ta dùng một biến động lưu trữ các thông tin:

- Thông tin lưu trữ tại nút

- Địa chỉ nút gốc của cây con trái trong bộ nhớ

- Địa chỉ nút gốc của cây con phải trong bộ nhớ

Khai báo tương ứng trong ngôn ngữ C có thể như sau:

typedef struct tagTNODE

Trang 8

{

Data Key;//Data là kiểu dữ liệu ứng với thông tin lưu tại nút

struct tagNODE *pLeft, *pRight;

}TNODE;

typedef TNODE *TREE;

Do tính chất mềm dẻo của cách biểu diễn bằng cấp phát liên kết, phương pháp này được dùng chủ yếu trong biểu diễn cây nhị phân Từ đây trở đi, khi nói về cây nhị phân, chúng

ta sẽ dùng phương pháp biểu diễn này

Trang 9

g với n khó

i mỗi mỗi nú trên cây co trên cây co

ví dụ về câ

ị phân là m tượng hơn n chứa các g bất đẳng th

Bài 23 gặp

các giá trị gi

y loại này sử nhỏ hơn khó

ằng nhau và giá trị bằng

3: Thảo luận

là cây nhị p

nhỏ hơn khó lớn hơn kh tìm kiếm:

dữ liệu cơ b

p hợp, đa tập

g nhau thì nó nghiêm ngặt

bản được sử

p hợp, các d

ó biểu diễn

t Mọi nút tr hải có nút lớ

hì nó biểu d bất đẳng th cha, mọi nút

n một đa tập rong cây co

ớn hơn hoặ

diễn một tập hức nghiêm

t trên cây co

ái) là tùy th , nhưng khi

a của

trị như nút nút lớn

ười

m kiếm

Trang 10

Nhờ ràng buộc về khóa trên BST, việc tìm kiếm trở nên có định hướng Hơn nữa, do cấu trúc cây việc tìm kiếm trở nên nhanh đáng kể Nếu số nút trên cây là N thì chi phí tìm kiếm trung bình chỉ khoảng log2N

Trong thực tế, khi xét đến cây nhị phân chủ yếu người ta xét BST Chúng ta sẽ trở lại vấn

đề này trong phần tìm kiếm

23.1.2 Cây cân bằng hoàn toàn (CCBHT)

Định nghĩa: Cây cân bằng hoàn toàn là câynhị phân tìm kiếm mà tại mỗi nút của nó, số

nút của cây con trái và cây con phải không chênh lệch nhau qúa một

Một cây rất khó đạt được trạng thái cân bằng hoàn toàn và cũng rất dễ mất cân bằng vì khi thêm hay huỷ các nút trên cây có thể làm mất cân bằng (xác suất rất lớn), chi phí cân bằnglại cây là rất lớn vì phải thao tác trên toàn bộ cây

Tuy nhiên nếu cây cân đối thì việc tìm kiếm sẽ rất nhanh Đối với CCBHT, trong trường hợp xấu nhất ta cũng chỉ phải tìm qua log2n phần tử (n là số nút trên cây)

Sau đây là ví dụ về một CCBHT

Hình 5.25 Cây cân bằng hoàn toàn CCBHT có n nút, có chiều cao h = log2n Đây chínhlà lý do cho phép đảm bảo khả năng tìm kiếm nhanh trên cấu trúc dữ liệu này

Do CCBHT là một cấu trúc kém ổn định nên trong thực tế không thể sử dụng Nhưng

ưu điểm của nó lại rất quan trọng V ì vậy, cần đưa ra một cấu trúc dữ liệu khác có đặc tính giống CCBHT nhưng ổn định hơn

Như vậy, cần tìm cách tổ chức một cây đạt trạng thái cân bằng yếu hơn và việc cân bằng lại chỉ xảy ra ở phạm vi cục bộ nhưng vẫn đảm bảo chi phí cho thao tác tìm kiếm đạt ở mức O(log2n)

23.1.3 Cây cân bằng

Năm 1962, P.M ADELSON - VELSKI và E.LANDIS đã mở đầu phương hướng giải quyết này bằng cách đưa ra dạng cây cân đối mới mà sau này mang tên của họ, đó là cây nhị phân cân đối AVL Từ nay về sau, chúng ta sẽ dùng thuật ngữ cây AVL thay cho cây cân bằng

Từ khi được giới thiệu, cây AVL đã nhanh chóng tìm thấy ứng dụng trong nhiều bài toán khác nhau Vì vậy, nó mau chóng trở nên thịnh hành và thu hút nhiều nghiên cứu

Từ câyAVL, người ta đã phát triển thêm nhiều loại cấu trúc dữ liệu hữu dụng khác như cây đỏ - đen, B - Tree,

Định nghĩa: cây AVL là cây nhị phân tìm kiếm mà tại mỗi nút của nó độ cao của cây con

Trang 11

Dưới đây là ví dụ cây cân bằng

Hình 5.26 Cây AVL

Dễ dàng thấy CCBHT là cây cân bằng Điều này ngược lại không đúng Tuy nhiên cây AVL là cấu trúc dữ liệu ổn định hơn hẳn CCBHT

Chiều cao của cây AVL

Một vấn đề quan trọng, như đã đề cập đến ở phần trước, là ta phải khẳng định cây AVL n nút phải có chiều cao khoảng log2n

Để đánh giá chính xác về chiều cao của cây AVL, ta xét bài toán: cây AVL có chiều cao h sẽ có tối thiểu bao nhiêu nút ?

Gọi N(h) số nút tối thiểu của cây AVL có chiều cao h

Ta có N(0) = 0, N(1) = 1và N(2) = 2

Cây AVL tối thiểu có chiều cao h sẽ có một cây con AVL tối thiểu chiều cao h - 1

và cây con AVL tối thiểu chiều cao h - 2 Như vậy:

Như vậy, cây AVL có chiều cao O(log2n)

Ví dụ cây AVL tối thiểu có chiều cao h = 4

Trang 12

Khoa CNTT- Trường ĐHSPKT Hưng Yờn 12

0: độ cao cõy con trỏi bằng độ cao cõy con phải

-1: cõy con phải cú độ cao lớn hơn độ cao cõy con trỏi là 1 (lệch phải)

1: cõy con trỏi cú độ cao lớn hơn độ cao cõy con phải là 1 (lệch trỏi)

Khi bổ sung nút mới với khoá x cho tr-ớc đ-ợc thực hiện bằng cách sau:

• áp dụng thuật toán bổ sung vào cây nhị phân tìm kiếm

• Cân bằng lại các đỉnh mà tại đó tính cân bằngbị phá vỡ (độ cao của hai cây con khác nhau 2)

Xét các tr-ờng hợp sau

TH1: Cây lệch trái (lệch phải ) sau khi bổ sung vào cây con phải (trái) cây cân bằng TH2: Hai cây con có độ cao bằng nhau sau khi bổ sung thì cây lệch trái hoặc lệch phải

TH3: Cây con trái (phải) cao hơn cây con phải (trái)1, sau khi bổ sung vào cây con trái (phải) thì hai cây này có độ cao chênh nhau là 2 Nh- vậy, tính cân bằng bị phá vỡ

Đối với các tr-ờng hợp TH1 và TH2 khi bổ sung nút mới thì tính cân bằng không bị phá

vỡ nên ta chỉ cần chỉnh lại các hệ số cân bằng ở nút đang xét và ở các nút tiền bối của

α(h) chỉ cây con α có chiều cao h

• TH3.1: Nút bổ sung làm tăng chiều cao cây con trái của nút con trái nút nút bất th-ờng

2

2 1

1

γ 2

Trang 13

Khoa CNTT- Trường ĐHSPKT Hưng Yờn 13

Hình 5.28

Đối với tr-ờng hợp này để tái cân đối ta phải thực hiện phép quay từ trái sang phải để

đ-a nút (1) lên vị trí gốc cây con, nút (2) sẽ trở thành con phải của nó và β đ-ợc gắn

vào thành con trái của (2) Ng-ời ta gọi phép quay này là phép quay đơn (single

rotation) hay ta còn gọi là phép quay phải

Hình 5.29 Quay phải cây P

Ví dụ: Cho CNPTK sau

a) Cây ban đầu

Hình 5.30 TH3.2: Nút mới bổ sung làm tăng chiều cao cây con phải của nút con trái nút bất th-ờng

3 1

δ 2

3 1

δ (h) h + 2 2

90 25

b) Bổ sung thêm

út (10)

c) Tái cân đối bằng phép quay đơn 10

25 12

10

90 25

10

90 25

10

90 25

γ (h) h + 2

P

Q

γ (h)

β (h)

2 1

α (h+1)

h + 2

P

Q

Trang 14

45 25

c)Sau phép quay đơn

th h i

3 2

α (h)

δ (h)

1

γ (h-1)

β (h)

a)Sau phép quay đơn

thứ nhất

quay tr i

3 2

δ (h)

1

γ (h-1)

α (h) β

(h)

b)Sau phép quay đơn thứ hai

quay phải

Trang 15

Đối với các tr-ờng hợp khi bổ sung thêm nút mới làm tăng chiều cao cây con phải của nút con phải và nút mới bổ sung làm chiều cao cây con trái của nút con phải nút bất th-ờng, thì ta lần l-ợt thực hiện theo thứ tự ng-ợc lại t-ơng ứng với tr-ờng hợp TH3.1 và TH3 2

Ví dụ sau đây minh hoạ cụ thể và các phép xử lý t-ơng ứng

Hình 5.34

3

7 2

Sau phép đơn thứ 1

7 4

2 3

5

1

4 2

nút (1): mất cân

đối tr-ờng hợp TH3.1

c) Tái cân đối bằng phép quay đơn 1

5 2 4 7

10

90 25

12 10

90 25

12 1

7 4

4

7

5 2

i) Sau phép quay

đơn thứ hai (quay trái)

2

4 6 5

Trang 16

Cũng giống nh- thao tác thêm một nút, việc huỷ nút x ra khỏi cây AVL thực hiện giống nh- trên CNPTK Chỉ sau khi huỷ, nếu tính cân bằng bị phá vỡ thì ta sẽ thực hiện việc cân bằng lại

Tuy nhiên việc cân bằng lại trong thao tác huỷ sẽ phức tạp hơn nhiều so với việc cân bằng khi thêm một nút do có thể xảy ra phản ứng dây chuyền

Nhận xét

• Thao tác thêm một nút có độ phức tạp O(1)

• Thao tác huỷ một nút có độ phức tạp O(h)

• Với cây cân bằng trung bình hai lần thêm vào cây thì cần một lần cân bằng lại; 5 lần huỷ thì cần một lần cân bằng lại

• Việc huỷ một nút có thể phải cân bằng dây chuyền các nút từ gốc cho đến phần tử bị huỷ trong khi thêm vào chỉ cần một lần cân bằng cục bộ

• Độ dài đ-ờng tìm kiếm trung bình trong cây cân bằng gần bằng cây cân bằng hoàn toàn, nh-ng việc cân bằng lại đơn giản hơn nhiều

• Một cây cân bằngkhông bao giờ cao hơn 45% cây cân bằng hoàn toàn t-ơng ứng dù số nút trên cây là bao nhiêu

23.1.4 Cõy đỏ đen

Cõy đỏ đen ( tiếng Anh : red-black tree) là một dạng cõy tỡm kiếm nhị phõn tự cõn bằng,

được đưa ra vào năm 1972 bởi Rudolf Bayer ễng gọi chỳng là cỏc " B-cõy cõn bằng" cũn tờn hiện nay được đưa ra từ 1978 bởi Leo J Guibas và Robert Sedgewick Nú là cấu trỳc phức tạp nhưng cho kết quả tốt vế thời gian trong trường hợp xấu nhất Cỏc phộp toỏn trờn chỳng như tỡm kiếm (search), chốn (insert), và xúa (delete) trong thời gian O (log n), trong đú n là số cỏc phần tử của cõy

Định nghĩa

Một cõy đỏ-đen là một cõy nhị phõn , là một cấu trỳc dữ liệu trong khoa học mỏy tớnh để

tổ chức cỏc thành phần dữ liệu cú thể so sỏnh, chẳng hạn cỏc số Trong cõy nhị phõn cỏc thành phần dữ liệu được đưa vào cỏc nỳt (node) Trong cỏc nỳt cú một nỳt nằm ở vị trớ

khởi đầu khụng là con của nỳt nào được gọi là gốc Cỏc nỳt khỏc đều là con của một nỳt

nào đú và cú khụng quỏ hai con Từ nỳt gốc cú một đường đi duy nhất đến mỗi nỳt khỏc trờn cõy

Cỏc nỳt khụng cú con được gọi là lỏ (leaf node) Trong cõy đỏ đen, cỏc lỏ được gỏn giả là

null; nghĩa là chỳng khụng chưa bất kỳ dữ liệu nào

Trang 17

ác tính chấ

đi dài nhất

Vì các thu của cây nên

m kiếm nhị

mạnh này, ta (theo tính

đi ngắn nh giữa các nú

ều chứa dữ hân đầy dủ.

ộ dài đen củ

ọi tắt các đư

ất trên Từ c không vượ uật toán chè

n cây đỏ đen

phân thông

a chú ý rằng chất 4) Do hất là đườn

út đỏ và đe ường đi dài

dữ liệu cây

ó thể biểu d bản của cây

ll vào làm

y không chứ ình vẽ ở tr lieụu và có Khi đó số

ụ một cây đ

"màu" nhận

n (và suy r

đã cho tới c cân bằng đe

ủa đường đ ường đi như các tính chấ

y và độ phứ con phải h

ứa dữ liệu m rên Việc th

ó hai con, h các "lá null

đỏ-đen

n một trong

a mọi nút đ các lá chứa m en" Số các

đường đi n mỗi đường s

ó nút đen,

nh chất 5, s

g vượt quá các nút ch đen ta có

ức tạp của c hoặc con trá

mà chỉ làm hêm các nú hay khác đi l" nhiều hơ

g hai giá trị

đỏ có nút ch một số như nút đen trê

g bài này ch

ờng đi Sức

ra trong cá ngắn nhất.

g trường hợ

ác trường hợ

nào từ gôc t

ố nút đỏ kh đường đi d

ố các nút đ hai lần đườ

hỉ có một co một chút th các thuật to

ái hoặc cả h nhiệm vụ t

on và có cá hay đổi mà oán Với mụ hai của nhữ thông báo r cho tất cả c

a cây đỏ

i từ gốc

đỏ đen

t đều tỷ t,không

hứa hai hơn số

i các lá liệu của

Trang 18

Một số người định nghĩa cây đỏ đen bằng cách gán màu đỏ đen cho các cạnh chứ không phải các nút Tuy nhiên điều đó không tạo nên sự khác biệt Khi ấy màu của mỗi nút tương ứng với màu của cạnh nối nó với nút cha

ể thấy rõ sức mạnh này, ta chú ý rằng không có đường đi nào từ gôc tới một lá chứa hai nút đỏ liền nhau (theo tính chất 4) Do đó trên mỗi đường số nút đỏ không nhiều hơn số nút đen Đường đi ngắn nhất là đường đi chỉ có nút đen, đường đi dài nhất có thể là

đường đi xen kẽ giữa các nút đỏ và đen Theo tính chất 5, số các nút đen trên hai đường

đi đó bằng nhau, và do đó đường đi dài nhất không vượt quá hai lần đường đi ngắn nhất Trong nhiều biểu diễn của dữ liệu cây, có thể có các nút chỉ có một con và có các lá có chứa dữ liệu Tuy nhiên có thể biểu diễn cây đỏ đen ta có một chút thay đổi mà không làm thay đổi tính chất cơ bản của cây và độ phức tạp của các thuật toán Với mục đích

này, ta đưa thêm các lá null vào làm con phải hoặc con trái hoặc cả hai của những nút

không có chúng, các lá này không chứa dữ liệu mà chỉ làm nhiệm vụ thông báo rằng tại đây cây đã kết thúc, như hình vẽ ở trên Việc thêm các nút này làm cho tất cả các nút trong của cây đều chứa dữ lieụu và có hai con, hay khác đi cây đỏ đen cùng với các lá null là cây nhị phân đầy dủ Khi đó số các "lá null" nhiều hơn số các nút chứa dữ liệu của cây một lá

Một số người định nghĩa cây đỏ đen bằng cách gán màu đỏ đen cho các cạnh chứ không phải các nút Tuy nhiên điều đó không tạo nên sự khác biệt Khi ấy màu của mỗi nút tương ứng với màu của cạnh nối nó với nút cha

Các phép toán trên cây đỏ đen

Có thể áp dụng ngay các phép chèn, xóa trong cây tìm kiếm nhị phân vào cây đỏ đen mà không cần sửa chữa gì vì cây đỏ đen là trường hợp riêng của cây tìm kiếm nhị phân Tuy nhiên, khi đó có thể có một số tính chất trong định nghĩa của cây đỏ đen sẽ bị vi phạm

Việc khôi phục các tính chất đỏ đen sẽ cần một số nhỏ cỡ O(log n) hoặc trung bình chỉ

O(1) các phép đổi màu (tốn rất ít thời gian) và không quá ba phép quay cho phép xóa, hai

cho phép chèn Toàn bộ các giải thuật chèn và xóa có độ phức tạp thời gian cỡ O(log n)

Phép chèn

Phép chèn bắt đầu bằng việc bổ sung một nút như trong cây tìm kiếm nhị phân bình thường và gán cho nó màu đỏ Ta xem xét để bảo toàn tính chất đỏ đen từ các nút lân cận

với nút mới bổ sung Thuật ngữ nút chú bác sẽ dùng để chỉ nút anh (hoặc em) với nút cha

của nút đó như trong cây phả hệ Chú ý rằng:

Tính chất 3 (Tất cả các lá -là các nút null là đen) giữ nguyên

• Tính chất 4 (Cả hai con của nút đỏ là đen) nếu bị thay đổi chỉ bởi việc thêm một nút đỏ có thể sửa bằng cách gán màu đen cho một nút đỏ hoặc một phép quay

• Tính chất 5 (Tất các các đường đi từ gôc tới các lá có cùng một số nút đen) nếu bị thay đổi chỉ bởi việc thêm một nút đỏ có thể sửa bằng cách gán màu đen cho một nút đỏ hoặc một phép quay

Trang 19

Chú ý: Nhãn N sẽ dùng để chỉ nút đang chèn vào, P chỉ nút cha của N', G chỉ ông

của N', và U chỉ chú bác của N' Nhớ rằng,giữa các trường hợp, vai trò và nhãn

của các nút có thể thay đổi còn trong cùng một trường hợp thì không

Mỗi trường hợp được giới thiệu bằng một đoạn mã C Nút chú bác và nút ông dế dàng

Trường hợp 1: Nút mới thêm N ở tại gốc Trong trường hợp này, gán lại màu đen cho N,

để bảo toàn tính chất 2 (Gốc là đen) Vid mới chỉ bổ sung một nút, Tính chất 5 được bảo đảm vì mọi đường đi chỉ có một nút

void insert_case1(struct node *n) {

Trường hợp 2: Nút cha P của nút mới thêm là đen, khi đó Tính chất 4 (Cả hai nút con

của nút đỏ là đen) không bị vi phạm vì nút mới thêm có hai con là "null' là đen Tính chất

5 cũng không vi phạm vì nút mới thêm là đỏ không ẩnh hưởng tới số nút đen trên tất cả đường đi

void insert_case2(struct node *n) {

Chú ý: Trong trường hợp tiếp theo nếu N có ông là nút G, vì nếu cha P là đỏ và P

không ở gốc thì G là đen Như vậy, N cũng có chú bác là U, although it may be a

leaf in cases 4 and 5

Trang 20

Trường hợp 3: Cả cha P và bác U là đỏ, thì thể đổi cả hai thành đen còn G thành đỏ (để bảo toàn tính chất 5 Khi đó nút mới N có cha đen Vì đường đi bất kỳ đi qua cha và bác

của "N" phải đi qua ông của N nên số các nút đen trên đường đi này không thay đổi Tuy

thế nút ông G có thể vi phạm tính chất 2 (Gốc là đen) hoặc 4 (Cả hai con của nút đỏ là nút đen) (tính chất 4 bị vi phạm khi cha của G là đỏ) Để sửa chữa trường hợp này gọi một thủ tục đệ quy trên G từ trường hợp 1 Note that this is the only recursive call, and it

occurs prior to any rotations, which proves that a constant number of rotations occur void insert_case3(struct node *n) {

if (uncle(n) != NULL && uncle(n)->color == RED) {

Chú ý: Trong các trường hợp tiếp theo, giả sử rằng nút cha P là con trái của cha

của nó Nếu nó là con phải, left và right đổi chỗ cho nhau trong cases 4 and 5

Trường hợp 4: Nút cha P là đỏ nhưng nút chú bác U là đen, nút mới N là con phải của nút P, và P là con trái của nút G Trong trường hợp này, thực hiện quay trái chuyển đổi

vai trò của nút mới N và nút cha P do đó định dạng lại nút P bằng Trường hợp 5 (đổi vai trò N và P) vì tính chất 4 bị vi phạm (Cả hai con của nút đỏ là đen) Phép quay cũng làm

thay đổi một vài đường đi (các đường đi qua cây con nhãn "1") phải đi qua thêm nút mới

N, nhưng vì N là đỏ nên không làm chúng vi pham tính chất 5

void insert_case4(struct node *n) {

if (n = = n->parent->right && n->parent = = grandparent(n)->left) {

Trang 21

Trường hợp 5:' Nút cha P là đỏ nhưng nút bác U là đen, nút mới N là con trái của nút P,

và P là con trái của nút ông G Trong trường hợp này, một phép quay phải trên nút ông G được thực hiện; kết quả của phep quay là trong cây mới nút P trở thành cha của cả hai nít

N và nút G Đã biết G là đen, vì bây giờ nó là con của P Đổi màu của P và G thì cây

thỏa mãn tính chất 4 Tính chất 5 không bị vi phạm vì các đường đi qua G trươc đây bây

giờ đi qua P

void insert_case5(struct node *n) {

chuyển giá trị của nó vào nút đang muốn xóa (xem Cây tìm kiếm nhị phân ) Khi đó chúng

ta xóa đi nút đã được copy giá trị, nút này có ít hơn hai con (không là lá null) Vì việc

copy giá trị không làm mất tính chất đỏ đen nên không cần phải sưa chữa gì cho thao tác

này Việc này chỉ đặt ra khi xóa các nút có nhiều nhất một con (không là lá null)

Chúng ta sẽ thảo luận về việc xóa một nút có nhiều nhất một con (không là lá null) Nếu ta xóa một nút đỏ, ta có thể chắc chắn rằng con của nó là nút đen Tất cả các đường

đi đi qua nút bị xóa chỉ đơn giản bớt đi một nút đỏ do đó tính chất 5 không thay đổi Ngoài ra, cả nút cha và nút con của nút bị xóa đều là nút đen, do đó tính chất 3 và 4 vẫn giữa nguyên Một trường hợp đơn giản khác là khi xóa một nút đen chỉ có có một con là nút đỏ Khi xóa nút đó các tính chất 4 và 5 bị phá vỡ, nhưng nếu gán lại màu cho nút con

là đen thì chúng lại được khôi phục

Trang 22

Trường hợp phức tạp xảy ra khi cả nút bị xóa và nút con của nó đều là đen Chúng ta sẽ bắt đầu bằng việc thay nút bị xóa bằng nút con của nó Chúng ta sẽ gọi nút con này (trong

vị trí mới của nó là N, và anh em với nó (con khác của nút cha mới) là S Tiếp theo ta vẫn dùng P chỉ cha mới của N, SL chỉ con trái của S, và SR chỉ con phải của S (chúng tồn tại

vì S không thể là lá)

Chú ý: Giữa các trường hợp khác nhau, vai trò và nhãn của các nút có thể thay đổi,

nhưng trong một trường hợp mọi nhãn giữ vai trò không thay đổi Trong hình vẽ các màu đỏ đen được thể hiện khi màu của nút đã rõ ràng, màu trắng biểu thị một màu chưa rõ (hoặc đỏ hoặc đen)

Chúng ta sẽ sử dụng hàm sau tìm người anh em của N':

struct node *sibling(struct node *n) {

Chú ý: Tất nhiên, chúng ta cần hoàn chỉnh các lá null sau mọi phép thay đổi Nếu

nút bị xóa không có con N khác "lá null", dễ dàng thấy rằng các tính chất được thỏa mãn Còn nếu N là một "lá nulll", có thể sửa chữa lược đồ (hoặc code) để

trong tất cảc các trường hợp các tính chất được thỏa mãn

Trươc mỗi bước ta có thể dùng hàm (function) replace_node thay thế nút con child vào vị trí của nút bị xóa trên cây Để thuận tiện các đoạn code trong mục này quy ước rằng các

"lá null" được biểu diễn bằng các đối tượng nút thực sự khác biệt một chút với NULL

(code trong phép chèn có biểu diễn không nư vậy)

void delete_one_child(struct node *n) {

/* Giả thiết : n có ít nhất một nút con null */

struct node *child = is_leaf(n->right) ? n->left : n->right;

Ghi chú: Nếu N là "lá nul" và ta khong muốn biểu diễn các "lá null" bằng các đối

tượng nút thực, ta có thể sửa giải thuật bằng cách trước hết gọi delete_case1() trên cha của nó (nghĩa là nút bị xóa n trong đoạn code trên) rồi sau đó mới xóa nó Ta

có thể làm như vậy vì cha của nó là đen, do đó có diễn biến như với "lá null" (một

số người gọi là "lá ảo", "lá ma") Ta cũng có thể xóa nó khỏi cuối của n và sẽ khôi phục lạ sau tất cả các phép toán

Trang 23

Nếu cả N và gốc ban đầu của nó là đen thì sau khi xóa các đường qua "N" giảm bớt một

nút đen Do đó vi phạm Tính chất 5, cây cần phải cân bằng lại Có các trường hợp sau:

Trường hợp 1: N là gốc mới Trong trường hợp này chúng ta dừng lại Ta đã giải phóng

một nút đen khỏi mọi đường đi và gôc mới lại là đen Không tính chất nào bị vi phạm void delete_case1(struct node *n) {

Chú ý: Trong các trường hợp 2, 5, và 6, ta quy ước N là con trái của cha P Nếu no

là con phải, left và right sẽ tráo đổi cho nhau Tuy nhiên code ví dụ làm cho cả hai

trường hợp

Trường hợp 2: S là đỏ Trong trường hợp này tráo đổi màu của P và S, và sau đó quay trái tai P, nó sẽ làm cho S trở thành nút ông của N Chú ý rằng P có màu đen và có một con màu đỏ Tất cả các đường đi có số các nút đen giống nhau, bây giờ N có một anh em

màu đen và cha màu đỏ, chúng ta có thể tiếp tục với các trường hợp 4, 5, hoặc 6 (anh em

mới của nó là đen ví chỉ có một con của nút đỏ S.) Trong các trường hợp sau la sẽ gọi anh

Trang 24

Trường hợp 3: P, S, và các con của S' là đen Trong trường hợp này, chúng ta gán lại cho S màu đỏ Kết quả là mọi đường đi qua S, (tất nhiên chúng không qua N,có ít hơn một nút đen Vì việc xóa đi cha trước đây của N' làm tất cả các đương đi qua N bớt đi một nút đen, nên chúng bằng nhau Tuy nhiên tất cả các đường đi qua P bây giờ có ít hơn một nút đen so với các đường không qua P, do đó Tính chất 5 (Tất cả các đường đi từ gốc

tới các nút lá có cùng số nút đen) sẽ bị vi phạm Để sửa chữa nó chúng ta lại tái cân bằng

tại P, bắt đầu từ trường hợp 1

void delete_case3(struct node *n) {

if (n->parent->color == BLACK &&

sibling(n)->color == BLACK &&

sibling(n)->left->color == BLACK &&

Trường hợp 4: S và các con của S' là đen nhưng P là đỏ Trong trường hợp này, chúng

ta đổi ngược màu của S và P Điều này không ảnh hưởng tới số nút đen trên các đường đi không qua N, nhưng thêm một nút đen trên các đường đi qua N, thay cho nút đen đã bị

xóa trên các đường này

void delete_case4(struct node *n) {

if (n->parent->color == RED &&

Trang 25

sibling(n)->left->color == BLACK &&

hoặc cha của nó bị tác động bởi việc dịch chuyên này

(Lưu ý trong trường hợp 6, ta đặt lại nút anh em mới của N' là S.)

void delete_case5(struct node *n) {

if (n == n->parent->left &&

sibling(n)->color == BLACK &&

sibling(n)->left->color == RED &&

else if (n == n->parent->right &&

sibling(n)->color == BLACK &&

sibling(n)->right->color == RED &&

Trang 26

}

Trường hợp 6: S là đen, con phải của S là đỏ và N là con trái của nút cha P Trong trường hợp này chúng ta quay trái tại P, khi đó S trở thành cha của P và con phải của S Chúng ta hoán đổi màu của P và S, và gán cho con phải của S màu đen Cây con giữ

nguyên màu của gốc do đó Tính chất 4 (Cả hai con của nút đỏ là đen) và Tính chất 5

không bị vi phạm trong cây con này Tuy nhiên, N bây giờ có thêm một nút đen tiền nhiệm: hoặc P mới bị tô đen, nó đã là đen và S là nút ông của nó trở thành đen Như cậy các đương đi qua N có thêm một nút đen

Trong lúc đó, với một đường đi không đi qua N, có hai khả năng:

đi qua nút anh em của N Khi đó cả trước và sau khi quay nó phải đi qua S và P,

khi thay đổi màu sắc hai nút này đã tráo đổi màu cho nhau Như vây đường đi này không bị thay đổi số nút đen

đi qua nút bác của N', là con phải của S Khi đó trước khi quay nó đi qua S, cha của S, và con phải của S, nhưng sau khi quay nó chỉ đi qua nút S và con phải của

S, khi này S đã nhận màu cũ của cha P còn con phải của S's đã đổi màu từ đỏ

thành đen Kết quả là số các nút đen trên đường đi này không thay đổi

Như vậy, số các nút đen trên các đường đi là không thay đổi Do đó các tính chất 4 và 5

đã được khôi phục Nút trắng trong hình vẽ có thể là đỏ hoặc đen, nhưng phải ghi lại trước và sau khi thay đổi

void delete_case6(struct node *n) {

Trang 27

Nhắc lại rằng các hàm này có lời gọi đệ quy Thêm nữa lời gọi không đệ quy sẽ được goi sau một phép quay, do đó số lần thực hiện các phép quay là không đổi (không quá 3)

Các số 2, 3, 4 trong cụm từ 2-3-4 có ý nghĩa là khả năng có bao nhiêu liên kết đến các

node con có thể có được trong một node cho trước Đối với các node không phải là lá, có

3 cách sắp xếp như sau:

• Một node với một mục dữ liệu thì luôn luôn có 2 node con

• Một node với hai mục dữ liệu thì luôn luôn có 3 node con

• Một node với ba mục dữ liệu thì luôn luôn có 4 node con

Như vậy, một node không phải là lá phải luôn luôn có số node con nhiều hơn 1, so với số mục dự liệu của nó Nói cách khác, đối với mọi node với số con là l và số mục dữ liệu là

d, thì: l = d + 1

Với mọi node lá thì không có node con, nhưng có thể chứa 1, 2 hoặc 3 mục dữ liệu, không có node rỗng Một cây 2-3-4 có thể có đến bốn cây con , nên được gọi là cây nhiều nhánh bậc 4

Trong cây 2-3-4 mỗi node có ít nhất là hai liên kết, trừ lnode lá (node không có liên kết nào)

• Tất cả các node con của cây con có gốc tại node con thứ 0 thì có các giá trị khoá nhỏ hơn khoá 0

• Tất cả các node con của cây con có gốc tại node con thứ 1 thì có tất cả các giá trị khoá lớn hơn khoá 0 và nhỏ hơn khoá 1

• Tất cả các node con của cây con có gốc tại node con thứ 2 thì có các giá trị khoá lớn hơn khoá 1 và nhỏ hơn khoá 2

Trang 28

• Tất cả các node con của cây con có gốc tại node con thứ 3 thì có các giá trị khoá lớn hơn khoá 2

Trong tất cả cây 2-3-4, các lá đều nằm trên cùng một mức Các node ở mức trên thường không đầy đủ, nghĩa là chúng có thể chứa chỉ 1 hoặc 2 mục dữ liệu thay vì 3 mục

Lưu ý rằng: cây 2-3-4 là cây cân bằng Nó vẫn giữ được sự cân bằng khi thêm vào các

phần tử có thứ tự (tăng dần hoặc giảm dần)

(1)

Hình 5.11 Đối với phép toán một ngôi như "phủ định" hoặc "lấy giá trị đối", hoặc các hàm chuẩn như exp() hoặc cos() thì cây con bên trái rỗng Còn với các phép toán một toán hạng như phép "lấy đạo hàm" ()' hoặc hàm "giai thừa" ()! thì cây con bên phải rỗng

Hình 5.12.Một số cây biểu thức

Nhận xét

Nếu ta đuyệt cây biểu thức theo thứ tự trước thì ta được biểu thức Balan dạng tiền tố (prefix) Nếu duyệt cây nhị phân theo thứ tự sau thì ta có biểu thức Balan dạng hậu tố (postfix); còn theo thứ giữa thì ta nhận được cách viết thông thường của biểu thức (dạng

a

+ b

a + b

! n n!

x exp

Trang 29

Ví dụ

Để minh cho nhận xét này ta lấy ví dụ sau:

Cho biểu thức P = a*(b - c) + d/e

a) Hãy dựng cây biểu thức biểu diễn biểu thức trên

b) Đưa ra biểu thức ở dạng tiền tố và hậu tố

nên ta có ngay cây biểu thức

Cũng tương tự như vậy đối với

toán hạng TH2, cây biểu thức

tương ứng với toán hạng này là

Hình 5.13

Tổng hợp cây biểu thức của các toán hạng ta được cây biểu thức sau

Hình 5.14 Cây biểu thức b) Bây giờ ta duyệt cây biểu thức ở hình 5.14

Duyệt theo thứ tự trước : + * a - b c / d e

Duyệt theo thứ sau: a b c - * d e / +

Trang 30

Trong lý thuyết quyết định (chẳng hạn quản lí rủi ro ), một cây quyết định ( tiếng Anh :

decision tree) là một đồ thị của các quyết định và các hậu quả có thể của nó (bao gồm rủi

ro và hao phí tài nguyên) Cây quyết định được sử dụng để xây dựng một kế hoạch nhằm đạt được mục tiêu mong muốn Các cây quyết định được dùng để hỗ trợ quá trình ra quyết định Cây quyết định là một dạng đặc biệt của cấu trúc cây

Trong lĩnh vực học máy , cây quyết định là một kiểu mô hình dự báo (predictive model),

nghĩa là một ánh xạ từ các quan sát về một sự vật/hiện tượng tới các kết luận về giá trị

mục tiêu của sự vật/hiện tượng Mỗi một nút trong (internal node) tương ứng với một

biến; đường nối giữa nó với nút con của nó thể hiện một giá trị cụ thể cho biến đó Mỗi nút lá đại diện cho giá trị dự đoán của biến mục tiêu, cho trước các giá trị của các biến được biểu diễn bởi đường đi từ nút gốc tới nút lá đó Kỹ thuật học máy dùng trong cây

quyết định được gọi là học bằng cây quyết định, hay chỉ gọi với cái tên ngắn gọn là cây quyết định

Học bằng cây quyết định cũng là một phương pháp thông dụng trong khai phá dữ liệu Khi đó, cây quyết định mô tả một cấu trúc cây, trong đó, các lá đại diện cho các phân loại còn cành đại diện cho các kết hợp của các thuộc tính dẫn tới phân loại đó[1] Một cây quyết định có thể được học bằng cách chia tập hợp nguồn thành các tập con dựa theo một kiểm tra giá trị thuộc tính [1] Quá trình này được lặp lại một cách đệ qui cho mỗi tập con dẫn xuất Quá trình đệ qui hoàn thành khi không thể tiếp tục thực hiện việc chia tách được nữa, hay khi một phân loại đơn có thể áp dụng cho từng phần tử của tập con dẫn xuất Một bộ phân loại rừng ngẫu nhiên (random forest) sử dụng một số cây quyết định

để có thể cải thiện tỉ lệ phân loại

Cây quyết định cũng là một phương tiện có tính mô tả dành cho việc tính toán các xác suất có điều kiện

Cây quyết định có thể được mô tả như là sự kết hợp của các kỹ thuật toán học và tính toán nhằm hỗ trợ việc mô tả, phân loại và tổng quát hóa một tập dữ liệu cho trước

Dữ liệu được cho dưới dạng các bản ghi có dạng:

(x, y) = (x1, x2, x3 , xk, y)

Biến phụ thuộc (dependant variable) y là biến mà chúng ta cần tìm hiểu, phân loại hay tổng quát hóa x1, x2, x3 là các biến sẽ giúp ta thực hiện công việc đó

Các kiểu cây quyết định

Cây quyết định còn có hai tên khác:

Cây hồi quy (Regression tree) ước lượng các hàm giá có giá trị là số thực thay vì được

sử dụng cho các nhiệm vụ phân loại (ví dụ: ước tính giá một ngôi nhà hoặc khoảng thời gian một bệnh nhân nằm viện)

Cây phân loại (Classification tree), nếu y là một biến phân loại như: giới tính (nam hay

nữ), kết quả của một trận đấu (thắng hay thua)

Trang 31

a sẽ dùng một ví dụ để giải thích về cây quyết định:

David là quản lý của một câu lạc bộ đánh golf nổi tiếng Anh ta đang có rắc rối chuyện các thành viên đến hay không đến Có ngày ai cũng muốn chơi golf nhưng số nhân viên câu lạc bộ lại không đủ phục vụ Có hôm, không hiểu vì lý do gì mà chẳng ai đến chơi, và câu lạc bộ lại thừa nhân viên

Mục tiêu của David là tối ưu hóa số nhân viên phục vụ mỗi ngày bằng cách dựa theo thông tin dự báo thời tiết để đoán xem khi nào người ta sẽ đến chơi golf Để thực hiện điều đó, anh cần hiểu được tại sao khách hàng quyết định chơi và tìm hiểu xem có cách giải thích nào cho việc đó hay không

Vậy là trong hai tuần, anh ta thu thập thông tin về:

Trời (outlook) (nắng (sunny), nhiều mây (clouded) hoặc mưa (raining)) Nhiệt độ

(temperature) bằng độ F Độ ẩm (humidity) Có gió mạnh (windy) hay không

Và tất nhiên là số người đến chơi golf vào hôm đó David thu được một bộ dữ liệu gồm

14 dòng và 5 cột

Sau đó, để giải quyết bài toán của David, người ta đã đưa ra một mô hình cây quyết định

Trang 32

Cây quyết định là một mô hình dữ liệu mã hóa phân bố của nhãn lớp (cũng là y) theo các

thuộc tính dùng để dự đoán Đây là một đồ thị có hướng phi chu trình dưới dạng một cây Nút gốc (nút nằm trên đỉnh) đại diện cho toàn bộ dữ liệu Thuật toán cây phân loại phát

hiện ra rằng cách tốt nhất để giải thích biến phụ thuộc, play (chơi), là sử dụng biến

Outlook Phân loại theo các giá trị của biến Outlook, ta có ba nhóm khác nhau: Nhóm người chơi golf khi trời nắng, nhóm chơi khi trời nhiều mây, và nhóm chơi khi trời mưa Kết luận thứ nhất: nếu trời nhiều mây, người ta luôn luôn chơi golf Và có một số người ham mê đến mức chơi golf cả khi trời mưa

Tiếp theo, ta lại chia nhóm trời nắng thành hai nhóm con Ta thấy rằng khách hàng không muốn chơi golf nếu độ ẩm lên quá 70%

Cuối cùng, ta chia nhóm trời mưa thành hai và thấy rằng khách hàng sẽ không chơi golf nếu trời nhiều gió

Và đây là lời giải ngắn gọn cho bài toán mô tả bởi cây phân loại David cho phần lớn nhân viên nghỉ vào những ngày trời nắng và ẩm, hoặc những ngày mưa gió Vì hầu như

sẽ chẳng có ai chơi golf trong những ngày đó Vào những hôm khác, khi nhiều người sẽ đến chơi golf, anh ta có thể thuê thêm nhân viên thời vụ để phụ giúp công việc

Kết luận là cây quyết định giúp ta biến một biểu diễn dữ liệu phức tạp thành một cấu trúc đơn giản hơn rất nhiều

Trang 33

a một công

yển sách mục trong

ủa duyệt th

h sau:

heo thứ tự saau là việc x xác định

Trang 34

ây tìm kiếm

y tìm kiếm

rường hợp m

ả nhất quả nhất hướng tổ c

ục như vậy ách các nút cây theo m

u diễn cho b

tố của biểu

ị phân tạo ra , 29, 65, 10

theo thứ tự mức

+b)+c*(d+e

ch lần lượt t ượt xen thê

t xoá các nú

quả cao về

au :

nút nằm trên hai theo thứ

Trang 35

Bài 6 Xét thuật giải tạo cây nhị phân tìm kiếm Nếu thứ tự các khóa nhập vào là như sau:

8 3 5 2 20 11 30 9 18 4

thì hình ảnh cây tạo được như thế nào ?

Sau đó, nếu hủy lần lượt các nút theo thứ tự như sau :

15, 20

thì cây sẽ thay đổi như thế nào trong từng bước hủy, vẽ sơ đồ (nêu rõ phương pháp hủy khi nút có cả 2 cây con trái và phải)

Bài 7 Duyệt cây theo mức là duyệt bắt đầu từ gốc, rồi duyệt các nút nằm trên mức 1 theo

thứ tự từ trái sang phải, rồi đến các nút nằm trên mức 2 theo thứ tự từ trái sang phải Và

cứ như vậy

a Hãy liệt kê các nút theo thứ tự duyệt theo mức của cây trong bài 1

b Viết thủ tục duyệt cây theo mức (Gợi ý: dùng hàng đợi)

Bài 8 Chứng minh rằng: nếu biết biểu thức duyệt tiền tự và trung tự của một cây nhị

phân thì ta dựng được cây này

Ðiều đó đúng nữa không? Khi biết biểu thức duyệt:

a Tiền tự và hậu tự

b Trung tự và hậu tự

Bài 9 Hãy dựng cây tìm kiếm nhị phân ứng với dãy khóa (thứ tự tính theo qui tắc so sánh

chuỗi (string)): HAIPHONG, CANTHO, NHATRANG, DALAT, HANOI, ANGIANG, MINHHAI, HUE, SAIGON, VINHLONG Ðánh dấu đường đi trên cây khi tìm kiếm khóa DONGTHAP

Bài 10 Xây dựng cấu trúc dữ liệu biễu diễn cây N-phân (2<N< 20)

a Viết chương trình con duyệt cây N-phân và tạo sinh cây nhị phân tương ứng với các khoá của cây N-phân

b Giả sử khóa được lưu trữ chiếm k byte, mỗi con trỏ chiếm 4 byte, vậy dùng cây nhị phân thay cây N-phân thì có lợi gì trong việc lưu trữ các khoá ?

Bài 11 Viết hàm chuyển một cây N-phân thành cây nhị phân

Bài 24: THỰC HÀNH CÀI ĐẶT CÂY

Bài 1 : Cài đặt cây nhị phân tìm kiếm Mỗi node trên cây có info là một số nguyên và liên

kết chỉ đến cây con trái và cây con phải Bổ sung thêm các thủ tục cần thiết đề có 1

chương trình hoàn chỉnh, cung cấp giao diện để người dùng có thể

a Thêm một nút có khoá x trên cây bằng giải thuật đệ quy

b Thêm một nút có khoá x trên cây bằng giải thuật khử đệ quy

Trang 36

d Xóa một nút có khoá x trên cây bằng giải thuật khử đệ quy

e Hiển thị cây theo cách của bạn

f Duyệt cây nhị phân theo thứ tự trước

g Duyệt cây nhị phân theo thứ tự giữa

h Duyệt cây nhị phân theo thứ tự sau

i Tính số node, số node lá, số node nhánh trên cây

j Tính chiều cao của cây

k Tính độ dài của cây

l Tính tổng giá trị của các node trên cây

m Nhập vào một số nguyên x Viết thủ tục tìm x trên cây Nếu tìm thấy hãy in ra màn hình giá trị của các node lớn hơn x

n Tìm mức có nhiều nút lá nhất

o Xoá các nút bậc một

p Tìm đường đi đến một nút x

q Xét xem cây T1 có phải là cây con của cây T hay không

r Đảo nhánh (nhánh trái của một nút trên cây trở thành nhánh phải của nút đó và ngược lại )

s Giả sử A là một mảng các số thực đã có thứ tự tăng Hãy viết hàm tạo một cây nhị phân tìm kiếm có chiều cao thấp nhất từ các phần tử của A

Bài 2 Cho cây nhị phân

a Hãy trình bày các duyệt: tiền tự (node-left-right), trung tự (left-node-right), hậu tự (left-right-node)

b Minh hoạ sự lưu trữ kế tiếp các nút cây này trong mảng

Bài 3 Ðể mở rộng khả năng xử lí các khoá trùng nhau trên cây tìm kiếm nhị phân, ta có

thể tổ chức cây tìm kiếm nhị phân như sau: tại mỗi nút của cây ta tổ chức một danh sách liên kết chứa các khoá trùng nhau đó Chẳng hạn cây được thiết lập từ dãy khoá số nguyên 10, 15, 5, 10, 20, 4, 5, 10, 15, 15, 4, 15 như sau

Trong đó các mũi tên nằm ngang chỉ các con trỏ của danh sách liên kết

Hãy viết khai báo cấu trúc dữ liệu và các thủ tục/hàm để cài đặt cây TKNP mở rộng như vậy

Trang 37

Bài 25: Các phương pháp sắp xếp cơ bản

25.1 Bài toán sắp xếp

Sắp xếp là quá trình xử lý một danh sách các phần tử (hoặc các mẫu tin) để đặt chúng theo một thứ tự thỏa mãn một tiêu chuẩn nào đó dựa trên nội dung thông tin lưu giữ tại mỗi phần tử

Tại sao cần phải sắp xếp các phần tử thay vì để nó ở dạng tự nhiên (chưa có thứ tự) vốn

có ? Ví dụ của bài toán tìm kiếm với phương pháp tìm kiếm nhị phân và tuần tự đủ để trả lời câu hỏi này

Khi khảo sát bài toán sắp xếp, ta sẽ phải làm việc nhiều với một khái niệm gọi là nghịch

Cho trước một dãy số a1 , a2 , , aN được lưu trữ trong cấu trúc dữ liệu mảng

int a[N];

Sắp xếp dãy số a1 , a2 , ,aN là thực hiện việc bố trí lại các phần tử sao cho hình thành được dãy mới ak1 , ak2 , ,akN có thứ tự ( giả sử xét thứ tự tăng) nghĩa là aki ? aki-1 Mà để quyết định được những tình huống cần thay đổi vị trí các phần tử trong dãy, cần dựa vào kết quả của một loạt phép so sánh Chính vì vậy, hai thao tác so sánh và gán là các thao tác cơ bản của hầu hết các thuật toán sắp xếp

Khi xây dựng một thuật toán sắp xếp cần chú ý tìm cách giảm thiểu những phép so sánh

và đổi chỗ không cần thiết để tăng hiệu quả của thuật toán Ðối với các dãy số được lưu trữ trong bộ nhớ chính, nhu cầu tiết kiệm bộ nhớ được đặt nặng, do vậy những thuật toán sắp xếp đòi hỏi cấp phát thêm vùng nhớ để lưu trữ dãy kết quả ngoài vùng nhớ lưu trữ dãy số ban đầu thường ít được quan tâm Thay vào đó, các thuật toán sắp xếp trực tiếp trên dãy số ban đầu - gọi là các thuật toán sắp xếp tại chỗ - lại được đầu tư phát triển Phần này giới thiệu một số giải thuật sắp xếp từ đơn giản đến phức tạp có thể áp dụng thích hợp cho việc sắp xếp nội

25.2 Phương pháp sắp xếp lựa chọn (Selection Sort)

• Giải thuật

Trang 38

Ta thấy rằng, nếu mảng có thứ tự, phần tử ai luôn là min(ai, ai+1, , an-1) Ý tưởng của thtật toàn chọn trực tiếp mô phỏng một trong những cách sắp xếp tự nhiên nhất trong thực tế: chọn phần tử nhỏ nhất trong N phần tử ban đầu, đưa phần tử này về vị trí đúng là đầu dãy hiện hành; sau đó không quan tâm đến nó nữa, xem dãy hiện hành chỉ còn N-1 phần tử của dãy ban đầu, bắt đầu từ vị trí thứ 2; lặp lại quá trình trên cho dãy hiện hành đến khi dãy hiện hành chỉ còn 1 phần tử Dãy ban đầu có N phần tử, vậy tóm tắt ý tưởng thuật toán là thực hiện N-1 lượt việc đưa phần tử nhỏ nhất trong dãy hiện hành về vị trí đúng ở đầu dãy Các bước tiến hành như sau :

• Bước 1: i = 1;

• Bước 2: Tìm phần tử a[min] nhỏ nhất trong dãy hiện hành từ a[i] đến a[N]

• Bước 3 : Hoán vị a[min] và a[i]

Ngược lại: Dừng //N-1 phần tử đã nằm đúng vị trí

• Ví dụ

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

HÌNH ẢNH LIÊN QUAN

Hình 5.2. Rừng gồm ba cây - Tài liệu Cây tổng quát doc
Hình 5.2. Rừng gồm ba cây (Trang 2)
Hình 5.18. Cây nhị phân tương đương - Tài liệu Cây tổng quát doc
Hình 5.18. Cây nhị phân tương đương (Trang 3)
Hình 5.26. Cây AVL - Tài liệu Cây tổng quát doc
Hình 5.26. Cây AVL (Trang 11)
Hình 5.29. Quay phải cây P - Tài liệu Cây tổng quát doc
Hình 5.29. Quay phải cây P (Trang 13)
Hình 5.11     Đối với phép toán một ngôi như &#34;phủ định&#34; hoặc &#34;lấy giá trị đối&#34;, hoặc các hàm chuẩn  như exp() hoặc cos()...thì cây con bên trái rỗng - Tài liệu Cây tổng quát doc
Hình 5.11 Đối với phép toán một ngôi như &#34;phủ định&#34; hoặc &#34;lấy giá trị đối&#34;, hoặc các hàm chuẩn như exp() hoặc cos()...thì cây con bên trái rỗng (Trang 28)
Hình 5.14. Cây biểu thức - Tài liệu Cây tổng quát doc
Hình 5.14. Cây biểu thức (Trang 29)
Sơ đồ - Tài liệu Cây tổng quát doc
Sơ đồ (Trang 33)
Hình cây tìm - Tài liệu Cây tổng quát doc
Hình c ây tìm (Trang 34)

TỪ KHÓA LIÊN QUAN

w