You are on page 1of 10

Heavy-Light Decomposition

Giới thiệu
Kĩ thuậ t Heavy-Light Decomposition (cò n gọ i là heavy path decomposition, từ đâ y xin viết
tắ t là HLD) đượ c đưa ra lầ n đầ u nă m 1983 bở i Sleator và Tarjan trong bà i bá o "A data
structure for dynamic trees", Journal of Computer and System Sciences 26 (3): 362–391
trong phầ n phâ n tích tiệm cậ n về tính hiệu quả củ a cấ u trú c link/cut tree củ a họ . Nă m 1984,
Harel và Tarjan lạ i sử dụ ng mộ t lầ n nữ a kĩ thuậ t nà y trong bà i bá o "Fast algorithms for
finding nearest common ancestors", SIAM Journal on Computing 13 (2): 338–355 về tìm tổ
tiên chung gầ n nhấ t củ a hai nú t trong mộ t câ y. HLD sớ m chứ ng tỏ sứ c mạ nh củ a nó trong
nghiên cứ u độ phứ c tạ p củ a cá c thuậ t toá n, cá c cấ u trú c dữ liệu trên câ y.

Tưở ng chừ ng HLD chỉ có ý nghĩa chủ yếu trên phương diện lý thuyết độ phứ c tạ p và chỉ là
cô ng cụ chứ ng minh toá n họ c thuầ n tú y cho cá c bà i bá o thì đến nhữ ng nă m 2013-2014,
trong cá c bà i toá n củ a nhiều cuộ c thi lậ p trình online, HLD đã bướ c ra thự c tiễn và nhanh
chó ng thể hiện đượ c tính ưu việt củ a mình trong việc mô tả và xử lí cá c mố i quan hệ độ ng
giữ a cá c đố i tượ ng trong nhiều bà i toá n, đặ c biệt trên cấ u trú c câ y vớ i cá c truy vấ n online.

Chú ng tô i xin cung cấ p mộ t cá i nhìn sơ lượ c về HLD và và i mở rộ ng củ a nó thô ng qua mộ t


số bà i toá n lậ p trình thuậ t toá n, ngõ hầ u cù ng quý vị nắ m bắ t kịp vớ i xu hướ ng thay đổ i
chó ng mặ t về giả i thuậ t cũ ng như cấ u trú c dữ liệu củ a cá c cuộ c thi lậ p trình online, cá c cuộ c
thi lậ p trình khu vự c và quố c tế.

HLD trên cây


Cây cân bằng

Ta đã biết câ y câ n bằ ng là mộ t cấ u trú c tố t trong lậ p trình. Mộ t câ y câ n bằ ng nú t có độ cao

, điều nà y cho ta hai tính chấ t:

 Ta cầ n duyệt qua khô ng quá nú t để đến đượ c nú t gố c từ mộ t nú t bấ t kì trong


câ y;

 Ta cầ n duyệt qua khô ng quá nú t để di chuyển từ mộ t nú t bấ t kì đến mộ t


nú t bấ t kì khá c trong câ y.
Hệ số luô n tố t cho mọ i bà i toá n. Vớ i mộ t câ y câ n bằ ng nú t, ta giả i quyết đượ c mộ t

loạ t cá c truy vấ n bằ ng độ phứ c tạ p . Chẳ ng hạ n: khoả ng cá ch giữ a hai nú t, trọ ng số


lớ n/nhỏ nhấ t trên mộ t đườ ng đi, tổ ng liên tiếp lớ n nhấ t củ a cá c đoạ n liên tiếp, …

Chuỗi tuyến tính

Mộ t dã y cá c nú t đượ c nố i tiếp tuyến tính cũ ng là mộ t cấ u trú c tố t. Ta có thể xâ y dự ng cá c


segment tree hay binary indexed tree (là cá c câ y câ n bằ ng) cho chuỗ i để giả i quyết bằ ng độ

phứ c tạ p cá c truy vấ n dạ ng max, min, tổ ng đoạ n, … trên chuỗ i.

Cây không cân bằng

Độ cao củ a mộ t câ y khô ng câ n bằ ng dao độ ng trong mộ t phạ m vi quá lớ n ( ). Vớ i

trườ ng hợ p suy biến, ta phả i duyệt qua nú t để từ mộ t nú t nà y di chuyển đến mộ t nú t


khá c. Ta xem xét dướ i đâ y cá ch đố i phó vớ i mộ t câ y khô ng câ n bằ ng tương đố i đặ c biệt.

Bài toán: cho câ y như hình vẽ, tính tổ ng trọ ng số cá c nú t trên đườ ng đi (đơn) giữ a hai nú t
bấ t kì, giả thiết trọ ng số cá c nú t có thể thay đổ i theo thờ i gian/truy vấ n.
Có thể nhậ n thấ y:

 Câ y có nú t

 Ta cầ n thă m nú t để di chuyển từ đến

 Ta thă m ít nhấ t nú t để di chuyển từ đến

 Ta thă m ít nhấ t nú t để di chuyển từ đến

Như vậ y rõ rà ng cầ n chi phí để di chuyển giữ a hai nú t tù y ý trong câ y.

Để đố i phó , ta thử bẻ câ y thà nh ba chuỗ i như hình vẽ:


Vớ i mỗ i chuỗ i ta có thể xâ y dự ng segment tree cho riêng nó và truy vấ n trên mỗ i chuỗ i sẽ
xuấ t hiện yếu tố log. Ta nhậ n thấ y:

 Câ y vẫ n có nú t, nhưng đã đượ c phân rã thà nh ba chuỗ i độ dà i

 thuộ c cù ng mộ t chuỗ i, truy vấ n giữ a chú ng đượ c giả i quyết trong

 thuộ c hai chuỗ i khá c nhau, đườ ng đi giữ a chú ng có thể tá ch thà nh

, truy vấ n giữ a đượ c giả i quyết trong , chính xá c là

mấ t hai lầ n
 Tương tự : thuộ c hai chuỗ i khá c nhau, đườ ng đi giữ a chú ng có thể tá ch thà nh

, truy vấ n giữ a chú ng đượ c giả i quyết trong ,

chính xá c là là mấ t ba lầ n

Như vậ y, vớ i câ y đã cho, bằ ng phép phâ n rã thà nh ba chuỗ i và xâ y dự ng segment tree kèm

theo mỗ i chuỗ i, truy vấ n giữ a hai nú t bấ t kì tố n chi phí .

Vấ n đề là : câ y trên chỉ có đú ng hai nú t có bậ c ba nên ta có đượ c mộ t phâ n rã tốt, đườ ng đi


giữ a hai nú t bấ t kì tá ch thà nh khô ng quá ba đoạ n chuỗ i. Điều gì xả y ra nếu câ y là câ y tổ ng
quá t? Ta cầ n mộ t kĩ thuậ t phâ n rã phứ c tạ p hơn nhằ m đạ t đượ c độ phứ c tạ p chấ p nhậ n
đượ c ngay cả trong trườ ng hợ p xấ u nhấ t. Đó chính là HLD.

Phân rã Heavy-Light

Ta sẽ phâ n rã câ y thà nh cá c chuỗ i rờ i (khô ng có hai chuỗ i nà o có nú t chung) theo cá ch sao

cho đườ ng đi từ nú t gố c đến mộ t nú t bấ t kì trong câ y phả i chuyển qua khô ng quá


chuỗ i. Nghĩa là phâ n rã phả i thỏ a mã n: đườ ng đi từ nú t gố c đến mộ t nú t bấ t kì có thể tá ch

thà nh cá c mả nh, mỗ i mả nh thuộ c mộ t chuỗ i và có khô ng quá mả nh.

Nếu thự c hiện đượ c phâ n rã như trên, vớ i hai nú t bấ t kì , ta xét tá ch đườ ng đi từ đến

thà nh hai phầ n: đến ; đến , và dạ ng truy vấ n chung củ a chú ng là :


từ mộ t nú t, đi lên mộ t nú t tổ tiên củ a nó .

Vớ i giả thiết phâ n rã đã có ta thấ y ngay độ phứ c tạ p củ a mộ t truy vấ n sẽ là Việc


cò n lạ i là chỉ ra cá ch phâ n rã đó .

Xét mộ t câ y tổ ng quá t, ta đặ t ra cá c khá i niệm:

 Nú t con nặ ng (heavy): trong số cá c nú t con củ a mộ t nú t, nú t con ứ ng vớ i câ y con


nặ ng nhấ t (nhiều nú t nhấ t) đượ c gọ i là nú t con nặ ng, cá c nú t con cò n lạ i đượ c gọ i là
nú t con nhẹ (light). Mỗ i nú t trong chỉ có đú ng mộ t nú t con nặ ng.
 Cạ nh nặ ng: vớ i mỗ i nú t trong, cạ nh nố i nú t đó vớ i con nặ ng củ a nó đượ c gọ i là mộ t
cạ nh nặ ng, cá c cạ nh cò n lạ i đượ c gọ i là cạ nh nhẹ.

Bằ ng việc tô mà u tấ t cả cá c cạ nh nặ ng, ta thu đượ c phâ n rã HLD, mỗ i chuỗ i là mộ t dã y cạ nh


đượ c tô mà u liên thuộ c nố i tiếp. Do mỗ i nú t trong chỉ có đú ng mộ t nú t con nặ ng nên cá c
chuỗ i là đô i mộ t rờ i nhau. Hơn thế, mỗ i chuỗ i đều là mộ t đườ ng nố i mộ t nú t đến mộ t tổ tiên
củ a nú t đó . Cá c cạ nh nhẹ đó ng vai trò kết nố i cá c chuỗ i.

Ta xem xét việc di chuyển từ mộ t nú t theo mộ t cạ nh nhẹ xuố ng mộ t nú t con nhẹ , do

là nú t con nhẹ nên câ y con gố c có kích thướ c khô ng vượ t quá mộ t nử a câ y con gố c .

Lạ i xem xét việc di chuyển từ nú t gố c củ a câ y xuố ng mộ t nú t lá , do mỗ i lầ n đi và o mộ t cạ nh

nhẹ thì kích thướ c câ y con giả m mộ t nử a nên số cạ nh nhẹ phả i qua nhiều nhấ t là Vì
cạ nh nhẹ đó ng vai trò kết nố i cá c chuỗ i nên điều đó cũ ng có nghĩa là phâ n rã ta vừ a xâ y
dự ng hoà n toà n thỏ a mã n cá c yêu cầ u đề ra.

Các vấn đề về cài đặt

Để khở i tạ o HLD và giả i quyết bà i toá n ta cầ n hiện thự c hó a cá c cô ng việc:


 Tính kích thướ c cho mộ t câ y con gố c bấ t kì.

 Xá c định cá c cạ nh nặ ng, nú t con nặ ng, qua đó kết nố i thà nh cá c chuỗ i.


 Xâ y dự ng segment tree cho mỗ i chuỗ i.
 Xâ y dự ng sparse table phụ c vụ bà i toá n tìm tổ tiên chung gầ n nhấ t.

Cá c thô ng tin hỗ trợ cầ n thiết:

 Vớ i mỗ i nú t, cầ n biết nó thuộ c chuỗ i nà o.


 Vớ i mỗ i nú t, cầ n biết vị trí củ a nó trong chuỗ i.
 Vớ i mỗ i chuỗ i, cầ n biết nú t đầ u tiên củ a chuỗ i (nú t tổ tiên).
 Vớ i mỗ i chuỗ i, cầ n biết độ dà i củ a chuỗ i.

Vớ i mỗ i truy vấ n cậ p nhậ t trọ ng số , cầ n thự c hiện:

 Thay đổ i trự c tiếp trên cạ nh nhẹ.


 Thay đổ i trong segment tree tương ứ ng vớ i cạ nh nặ ng.

Vớ i mỗ i truy vấ n hỏ i thô ng tin giữ a hai nú t , cầ n thự c hiện:

 Xá c định .

 Lấ y thô ng tin trên đườ ng , ta xét tổ ng quá t :

o Lặ p cho đến khi cù ng chuỗ i : lấ y thô ng tin từ đến đầ u chuỗ i chứ a , lấ y

thô ng tin cạ nh nhẹ nố i đầ u chuỗ i chứ a vớ i nú t cha trự c tiếp, thay bở i nú t


cha trự c tiếp.

o Khi cù ng chuỗ i, lấ y thô ng tin về đoạ n trong chuỗ i đó .


o Tổ ng hợ p thô ng tin.

Toà n bộ cá c cô ng việc kể trên đều có độ phứ c tạ p ).

Một ứng dụng tư tưởng của HLD


Blocking
Xét bà i toá n cơ bả n: cho dã y phầ n tử , thự c hiện cá c truy vấ n: cậ p nhậ t giá trị mộ t phầ n tử
nà o đó , hỏ i thô ng tin khô ng cộ ng tính (max, min, …) củ a mộ t đoạ n phầ n tử liên tiếp nà o đó .

Nhớ lạ i nhữ ng gì ta thườ ng là m khi Segment tree, Binary Indexed tree và cá c cấ u trú c tương
tự chưa xuấ t hiện (chưa biết).

Cách 1. Brute force

 Thay đổ i trự c tiếp phầ n tử vớ i truy vấ n cậ p nhậ t. Độ phứ c tạ p

 Duyệt qua tấ t cả cá c phầ n tử củ a đoạ n đố i vớ i truy vấ n hỏ i. Độ phứ c tạ p .

Cách 2. Blocking (băm khối)

Chia dã y thà nh đoạ n rờ i, gọ i là cá c khố i, mỗ i khố i là mộ t đoạ n độ dà i . Duy trì dã y


thô ng tin củ a từ ng khố i. Cá c truy vấ n đượ c xử lí như sau:
 Truy vấ n cậ p nhậ t: cậ p nhậ t phầ n tử , duyệt và cậ p nhậ t thô ng tin khố i chứ a phầ n tử

đó . Độ phứ c tạ p .

 Truy vấ n hỏ i thô ng tin đoạ n : xá c định khố i chứ a phầ n tử thứ , xá c định khố i

chứ a phầ n tử thứ ; xá c định thô ng tin cá c khố i xen giữ a hai khố i vừ a tìm đượ c; xá c

định thô ng tin nử a khố i phả i chứ a ; xá c định thô ng tin nử a khố i trá i chứ a ; kết hợ p

cá c thô ng tin. Độ phứ c tạ p .

Có thể nhậ n thấ y HLD cũ ng cù ng mộ t tư tưở ng xuấ t phá t vớ i kĩ thuậ t blocking. Đó là phâ n
rã khô ng gian tìm kiếm thà nh cá c mả nh, khố i và duy trì cá c cấ u trú c lưu giữ thô ng tin, hỗ
trợ truy vấ n thô ng tin trên cá c mả nh, khố i. Điểm đặ c biệt củ a HLD là ta giữ mố i liên hệ giữ a
cá c khố i tố t hơn.

Sau đâ y ta tìm cá ch kết hợ p hai kĩ thuậ t nà y trong mộ t bà i toá n về tậ p hợ p.

HLD cho tập hợp


Bà i toá n: cho dã y số và tậ p chỉ số . Phầ n tử củ a tậ p kí

hiệu là vớ i . Tổ ng kích thướ c cá c tậ p cỡ . Giả i quyết hai loạ i truy vấ n

trên dã y :

 “? K”: tính tổ ng tấ t cả cá c phầ n tử củ a có chỉ số nằ m trong tậ p

 : gia tă ng mộ t lượ ng cho tấ t cả cá c phầ n tử củ a có chỉ số nằ m trong tậ p

Hướ ng giả i quyết có thể tó m tắ t như sau:

 Coi mộ t tậ p là nặ ng nếu , đượ c đưa và o , cá c tậ p nặ ng đượ c

quả n lí thô ng qua vị trí nó đượ c đưa và o (vì số nà y ). Cá c tậ p cò n lạ i


gọ i là nhẹ.
 Cá c phầ n tử củ a tậ p nặ ng đượ c duy trì danh sá ch nhữ ng tậ p nặ ng nó có tham gia.
 Mỗ i tậ p (cả nặ ng và nhẹ) đều xá c định số phầ n tử mà nó có chung vớ i từ ng tậ p nặ ng
(nhờ danh sá ch trên)
 Giá trị phầ n tử đượ c lưu là cá c giá trị riêng, bỏ qua cá c lầ n đượ c tă ng ở tậ p nặ ng.
 Duy trì mả ng tổ ng củ a cá c tậ p bỏ qua việc tă ng đều củ a cá c tậ p nặ ng, mả ng ghi nhớ
lượ ng tă ng đều và o cá c tậ p nặ ng, chú ng đượ c gọ i tắ t là tổ ng riêng và lượ ng tă ng.

 Xét truy vấ n

o Nếu là tậ p nặ ng, gia tă ng lượ ng tă ng củ a , chi phí

o Nếu là tậ p nhẹ, thay đổ i trự c tiếp phầ n tử trong tậ p, chi phí

o Tổ ng riêng củ a cá c tậ p nặ ng đượ c tă ng theo số phầ n tử chung vớ i tậ p , chi

phí .
 Xét truy vấ n

o Nếu là tậ p nặ ng, kết quả là : tổ ng riêng lượ ng tă ng kích thướ c, chi phí

o Nếu là tậ p nhẹ, kết quả là : tổ ng cá c giá trị riêng số lầ n chung vớ i từ ng tậ p

nặ ng lượ ng tă ng củ a tậ p đó . Chi phí củ a cả hai pha duyệt phầ n tử củ a tậ p

, duyệt cá c tậ p nặ ng đều là .

Trong cá ch giả i quyết trên, bằ ng việc tá ch rờ i hoà n toà n cá c lầ n tă ng trên mỗ i tậ p nặ ng, ta


đã khéo léo thiết lậ p mố i quan hệ giữ a cá c tậ p nó i chung vớ i từ ng tậ p nặ ng. Qua đó chấ p
nhậ n việc duyệt tă ng giá trị riêng củ a phầ n tử trên cá c tậ p nhẹ vớ i chi phí chấ p nhậ n đượ c.

Việc kết hợ p tiêu chuẩ n phâ n loạ i Heavy-Light củ a HLD vớ i cậ n độ phứ c tạ p củ a

blocking đã cho mộ t giả i thuậ t đẹp cho mộ t bà i toá n khó .

Kết luận
Cá c giả i thuậ t, cấ u trú c dữ liệu, kĩ thuậ t lậ p trình mớ i liên tụ c nả y sinh theo thờ i gian. Bắ t
kịp vớ i xu hướ ng đó củ a cộ ng đồ ng lậ p trình thuậ t toá n trên thế giớ i là nhu cầ u că n bả n củ a
mỗ i chú ng ta. Qua HLD và mộ t ứ ng dụ ng kết hợ p HLD vớ i blocking đượ c trình bà y ở trên,
có thể thấ y rằ ng: cá i mớ i nhiều khi chẳ ng qua chỉ là tìm tò i, phá t triển, kết hợ p từ nhiều thứ
đã rấ t cũ kĩ, quen thuộ c. Hy vọ ng rằ ng cộ ng đồ ng chú ng ta có thể đà o sâ u nghiên cứ u và
sá ng tạ o thêm nhiều kết quả mớ i, đẹp hơn, hiệu quả hơn, đó ng gó p và o dò ng chả y tiến lên
củ a thế giớ i lậ p trình thuậ t toá n.

You might also like