PARALLEL DỰA TRÊN PHÂN TÍCH TAI
2.3 Thuật toán nhận dạng đồ thị Series - Parallel
2.3.2 Kiểm tra tính gắn kết
Trong mục này ta sẽ trình bày chi tiết bước 5 và 6, đây là hai bước quan trọng của thuật toán với cách giải quyết rất tinh tế.
Ta sẽ lần lượt giải quyết hai vấn đề, vấn đề thứ nhất là làm thế nào để kiểm tra tính gắn kết của một phân tích tai? Vấn đề thứ hai nếu ta mong muốn tìm một cây nhị phân thể hiện cấu trúc Series Parallel (câysp) thì phải làm thế nào?
Vấn đề 1: Để kiểm tra tính gắn kết của một phân tích tai, ta sẽ kiểm tra tính gắn kết trên từng tai của phân tích đó, ta có thể xử lí bộ các tai gắn thực sự trên một tai một cách độc lập với những tai gắn trên các tai khác bằng cách như sau:
Ta xây dựng đường tai Hi cho mỗi taiEi:
• Hi chứa các bản sao của các đỉnh trong Ei.
• Hi chứa bản sao các cạnh của Ei (các cạnh này gọi là đường dẫn - path edge).
• Nếu Ej gắn thực sự trên Ei thì ta thêm một cạnh mới vàoHi với hai đầu mút là hai đầu mút của taiEj (cạnh này gọi là cạnh không nằm trên đường - non path edge).
Từ giờ cho đến hết mục này, khi nhắc đến "cạnh" và "đỉnh" ta hiểu rằng đó là cạnh và đỉnh trong Hi. Khi đó để giải quyết vấn đề 1 ta kiểm tra tính gắn kết
trên Hi. Nếu xây dựng được cây gắn kết, ta mất thời gian logarit và số các bộ xử lí tỉ lệ thuận với kích thước củaHi.
Từ ví dụ 2.1.3 ta thấy rằng, nếu không xây dựng được đường tai Hi (có tai gắn thực sự nhưng không gắn trên Ei) thì phân tích tai cần kiểm tra không gắn kết và thuật toán kết thúc. Nếu xây dựng được Hi ta tiếp tục kiểm tra tính gắn kết như sau:
Đánh số các đỉnh của Hi theo thứ tự từ 1 cho đến hết (áp dụng thuật toán parallel list ranking algorith Anderson, Miller, 1988) [8].
Với mỗi ei ∈ Hi, ta đặt M in(ei) bằng số nhỏ hơn trong hai số tương ứng với hai đầu mút, M ax(ei) bằng số lớn hơn trong hai số tương ứng với hai đầu mút. Cạnh e được gọi là lồng trong cạnh f nến M in(e) ≥ M in(f) và M ax(e) ≤M ax(f).
Với mỗi đỉnh ta chia danh sách các cạnh kề của đỉnh đó thành hai danh sách, danh sách các cạnh đi xuôi (đi từ đỉnh có số thứ tự nhỏ đến đỉnh có số thứ tự lớn) và danh sách các cạnh đi ngược (đi từ đỉnh có số thứ tự lớn đến đỉnh có số thứ tự nhỏ) và giả sử rằng các đường dẫn luôn được xếp trước trong mỗi trường hợp.
Móc nối các danh sách các cạnh đi ngược với nhau từ đỉnh có số thứ tự nhỏ đến đỉnh có số thứ tự lớn ta được một danh sách các cạnh của Hi, ta sắp xếp các cạnh này theo thứ tự tăng dần của M ax(e). Với cùng một giá trị M ax thì đường dẫn được xếp trước các cạnh khác có cùng giá trị, còn nếu có hai cạnh không nằm trên đường có cùng giá trị M ax thì cạnh nào có M in nhỏ hơn thì đứng sau.
Với mỗi cạnh không nằm trên đường e trong danh sách, ta đặt N est(e) là cạnhf gần nhất xuất hiện trướcetrong danh danh sách vớiM in(f) ≤M in(e) và M ax(f) < M ax(e) (thực hiện nhờ thuật toán "All Nearest Smaller Value"
[9]). Nếu e và f có cùng giá trịM in, M ax và f xếp trước e trong danh sách
thìN est(e) =f.
Theo tiêu chuẩn trên thì tất cả các đường dẫn sẽ lồng vào trong bất cứ cạnh nào có chung hai đầu mút và mỗi cạnh không nằm trên đường sẽ có ít nhất một đường dẫn được lồng vào trong nó.
Ta nói rằng g lồng trực tiếp tronge nếu g lồng trong e và không có cạnh f nào thỏa mãng lồng trongf vàf lồng tronge.
Ví dụ 2.3.1. Cho một tai Ei như trong hình 2.8i, ta xây dựng được đường tai Hi như trong hình 2.8ii và danh sách các cạnh đi xuôi, đi ngược được cho trong bảng 2.1. Móc nối các danh sách đi ngược với nhau và sắp xếp theo giá trị tăng dần củaM axta được danh sách các cạnh củaHi là:
e1, e2, e6, e7, e3, e4, e8, e5, e9.
Ta xác định đượcN est(e6) =e2,N est(e7) =e1,N est(e8) =e4,N est(e9) = e8.
Hình 2.8: TaiEi và đường taiHi.
Bảng 2.1: Danh sách các cạnh đi xuôi và đi ngược của các đỉnh trongHi.
1 2 3 4 5 6
Cạnh đi xuôi e1, e7 e2, e6 e3 e4, e8, e9 e5
Cạnh đi ngược e1 e2, e6, e7 e3 e4, e8 e5, e9
Bổ đề 2.3.1. [5] Cho Hi gắn kết, khi đó với mỗi cạnh không nằm trên đường e thì M in(e) = M in(N est(e)) và N est(e) là cạnh duy nhất lồng trực tiếp trongevà có cùng giá trịM in.
Chứng minh. Giả sửM in(N est(e)) < M in(e),f là đường dẫn vớiM in(f) = M in(e). Do M in(N est(e)) < M in(e)và Hi là gắn kết nên
M ax(N est(e)) ≤M in(e) < M ax(f).
Do đóN est(e)phải xuất hiện trướcf trong danh sách, nhưngf lại không được chọn làm N est(e) nên chỉ có thể xảy ra e = f màelà cạnh không đường dẫn nên giả sử sai. VậyM in(N est(e)) = M in(e)vàN est(e)lồng tronge.
Ta chứng minhN est(e)là cạnh duy nhất lồng trực tiếp tronge. DoN est(e) là cạnh gần nhất trong danh sách có cùng giá trịM in vớienên nó phải là cạnh có giá trị M ax lớn nhất trong tất cả các cách có cùng giá trị M in với e. Giả sử có hai cạnh như vậy thì cạnh đứng sau trong danh sách sẽ được chọn làm N est(e), do đóN est(e)không lồng trong cạnh nào khác ngoàienênN est(e) lồng trực tiếp tronge.
Định lý 2.3.1. [5] Cho đồ thị G có phân tích tai ED, ta có thể kiểm tra phân tích tai đó có gắn kết hay không và nếu có thì ta có thể xây dựng được cây gắn kết tương ứng với cấu trúc gắn kết trong mỗi tai trong thời gian O(logn) với O(n) bộ xử lí song song.
Chứng minh. Ta tính toán để xây dựng cây gắn kết và nếu xây dựng được thì ta sẽ dùng nó để chứng minh phân tích tai là gắn kết. Ta sẽ xây dựng cây gắn kết với các nút tương ứng với các cạnh của Hi và các cạnh của cây tương ứng với tính lồng nhau của các cạnh trong Hi. Nếu phân tích tai cần kiểm tra là gắn kết thì việc xây dựng trên sẽ thu được một cây gắn kết. Ta xây dựng cây gắn kết như sau:
Đầu tiên ta tạo ra các nút tương ứng với mỗi cạnh củaHi và một nút bổ sung.
Cây sẽ được chỉ ra bằng cách liệt kê đứa con đầu tiên và anh em kế của nó. Mỗi
nút tương ứng với cạnh không nằm trên đường e có con đầu là nút tương ứng với cạnh N est(e). Bổ đề 2.2.6 cho ta xác định đứa con đầu tiên của mỗi nút.
Các nút không phải là nút cha tương ứng với các đường dẫn. Việc còn lại là tìm anh em kế cho mỗi nút.
• Nút ecó em kế (next sibling) khi và chỉ khi cạnh ekhông lồng trong bất kì một cạnhf nào cóM ax(e) =M ax(f).
• Nútecó anh kế (previous sibling) khi và chỉ khi cạnh ekhông lồng trong bất kì một cạnhf nào có M in(e) = M in(f).
• Mỗi đỉnhv trong Hi có duy nhất một cặp cạnhevà f sao choM ax(e) = M in(f) = v và nút f là em kế của núte. Cạnhevàf được xác định như sau:
– Cạnh f là cuối cùng trong danh sách các cạnh đi xuôi tại đỉnhv. – Cạnh elà cuối cùng trong danh sách các cạnh đi ngược tại đỉnhv. Gốc của cây được thêm là một đỉnh mới với đứa con đầu tiên là cạnhexuất hiện cuối cùng trong danh sách các cạnh cóM in = 1.
Tất cả các bước trên đều có thể biểu diễn được cho bất kì phân tích tai nào, gắn kết hay không. Tạo ra đứa con đầu tiên và em kế cho mỗi nút của cây.
Nếu Hi là gắn kết thì mỗi cạnh của Hi hoặc là con đầu hoặc là em kế của một cạnh khác, tức là không có cạnh nào vừa là con đầu vừa là em kế hoặc không là con đầu cũng không là em kế của bất kì cạnh nào. Thật vậy giả sử có cạnh e vừa là con đầu củaf và vừa là em kế của g. Vìe là con đầu của f nên M in(e) = M in(f)vàeđứng trướcf trong danh sách. Vìelà em kế củag nên M ax(g) = M in(e) = M in(f), màf đứng sau etrong danh sách các cạnh đi xuôi tại đỉnh cóM in = M in(e)nênf mới là em kế của g(mâu thuẫn). Giả sử cạnh ekhông là con đầu cũng không là em kế của bất kì cạnh nào. Doe không là con đầu nên e chỉ có thể là cạnh không nằm trên đường, e không là em kế
của cạnh nào nên tồn tại cạnh f sao choelồng trongf và M in(f) = M in(e) (giả sử f là cạnh gầne nhất thỏa mãn điều này). Khi đó theo định nghĩaN est vàHi là gắn kết,elà con củaf (mâu thuẫn).
Ta kiểm tra tính chất trên như sau: ta dùng một chuỗi các ô nhớ để lưu trữ các nút của cây, ô nhớ thứi tương ứng với cạnhei của Hi.
1. Mỗi nút sẽ viết tên nó vào ô nhớ của con đầu và em kế của nó. Nếu viết tên vào ô của con đầu ta sẽ gắn thêm chữP vào trước tên của nút.
2. Mỗi nút xác nhận rằng không có hai nút nào cùng viết tên vào ô của nó (không có ô nào mà có hai nút cùng viết tên vào).
3. Mỗi nút khác nút gốc sẽ xác nhận rằng có một nút khác viết tên vào ô của nó (tức là mỗi một ô đều có một nút điền tên vào, không có ô để trống).
Sau bước này, mọi nút đều biết được bố của nó và mỗi nút được lồng trong bố của mình. Thật vậy nếu có núte là con của nútf mà cạnh ekhông lồng trong cạnhf thì xảy ra hai trường hợp. Một làM in(e) < M in(f), khi đó cạnh núte có thể là con đầu hoặc là em kế của một nút khác (mâu thuẫn với điều kiện thứ 2). Hai là M ax(e) > M ax(f), khi đó f có thể là con của e hoặc elà con của một cạnh khác.
Nếu tất cả các điều kiện trên được thỏa mãn, ta sẽ xây dựng được một đồ thị không có vòng (mỗi nút chỉ có duy nhất một bố). Vì mỗi đỉnh chỉ là con đầu hoặc em kế nên số cạnh sẽ nhỏ hơn số đỉnh là 1, do đó đồ thị thu được là một cây. Mỗi nút được lồng trong bố của mình và các con của cùng một nút có quan hệ anh em kế nên không có hai cạnh không nằm trên đường nào cắt nhau. Vì vậy phân tích tai cần kiểm tra là gắn kết.
Ví dụ 2.3.2. Với đường taiHi như trong hình 2.8ii, ta tìm được danh sách con đầu và em kế được liệt kê trong bảng 2.2. Từ đó ta có thể lưu trữ các nút vào trong các ô nhớ như trong bảng 2.3. Như vậy tất cả các điều kiện trong định lý
2.2.2 đều được thỏa mãn vậy taiEi là gắn kết và ta xây dựng được một cây gắn kết như trong hình 2.9.
Bảng 2.2: Bảng liệt kê con đầu và em kế của các cạnh trongHi. Con đầu Em kế
e1 e6
e3 e9
e6 e2
e7 e1 e3 e8 e4 e5 e9 e8
R e7
Bảng 2.3: Lưu trữ các cạnh củaHivào các ô nhớ.
Root 1 2 3 4 5 6 7 8 9
P e7 P e6 e7 P e8 e8 e1 PR P e9 e3
Ví dụ 2.3.3. Ta xét một ví dụ mà tai Ej không gắn kết và đường taiHj của nó được cho trong hình 2.10. Khi đó ta cũng tìm được danh sách các cạnh đi xuôi và các cạnh đi ngược của từng đỉnh (bảng 2.4). Từ đó ta xác định được con đầu và em kế của các cạnh trongHj (bảng 2.5). Nhưng khi lưu trữ vào trong các ô nhớ, ta thấy rằng ô số 6 (ô của cạnhe6) và ô số 7 có hai cạnh cùng viết tên vào, do đóHj không gắn kết.
Vấn đề 2:Tìm câyspthể hiện cấu trúc Series Parallel. Hình thành phân tích các phép toán Series và Parallel như sau: Ta tìm các hàmW cho mỗi taiEi, các hàm X, Y, Z cho mỗi nút ej trên cây gắn kết của mỗi tai Ei. X(ei) sẽ tương ứng với cạnh ei nếu ei là một đường dẫn và sẽ tương ứng với tai Ei nếu ei là cạnh không nằm trên đường.Y(ei)thể hiện phép tổng hợpP nếueicó con đầu.
Z(ei)thể hiện phép tổng hợpS nếuei có em kế.
Hình 2.9: Cây gắn kết của taiEi.
Hình 2.10: Đường taiHj của taiEj.
Bảng 2.4: Danh sách các cạnh đi xuôi và đi ngược của các đỉnh trongHj.
1 2 3 4 5 6
Cạnh đi xuôi e1, e6 e2, e7, e8 e3, e9 e4 e5, e10
Cạnh đi ngược e1 e2, e7, e6 e3, e8 e4, e9 e5, e10
Bảng 2.5: Bảng liệt kê con đầu và em kế của các cạnh trongHj. Con đầu Em kế
e1 e8
e6 e1 e9 e7 e2
e8 e6 e4 e9 e8 e10 e10 e5
R e6
Bảng 2.6: Lưu trữ các cạnh củaHj vào các ô nhớ.
Root 1 2 3 4 5 6 7 8 9
e6 e7 e8 e10 e6,R e1,e9 e6 e9
• Nếuej tương ứng với tai Ej thìX(ej) = W(ej).
• Nếuej tương ứng với cạnh trên taiEi thìX(ej) = ej.
• Nếuej có con đầu tiên ek thìY(ej) =P(X(ej), Z(ek)).
• Nếuej không có con thìY(ej) = X(ej).
• Nếuej có em kế ek thìZ(ej) =S(Y(ej), Z(ek)).
• Các trường hợp còn lại thìZ(ej) =Y(ej).
• Cuối cùng với mỗi taiEi đặt W(Ei) = Z(ej) với ej là con đầu của gốc của cây gắn kết.
Ví dụ 2.3.4. Với tai Ei cho trong hình 2.8i, ta sẽ hình thành cây sp cho tai đó như sau. Đầu tiên, ta sẽ tìm được X(ej), Y(ej), Z(ej) cho mỗi nút ej (bảng 2.7). Từ đó ta hình thành được câyspcho tai Ei như trong hình 2.11.
Bảng 2.7: Bảng tínhX, Y, Zcho từng cạnhei.
e X Y Z
e1 X(e1) = e1 Y(e1) = X(e1) Z(e1) = S(Y(e1), Z(e6)) e2 X(e2) = e2 Y(e2) = X(e2) Z(e2) = Y(e2) e3 X(e3) = e3 Y(e3) = X(e3) Z(e3) = S(Y(e3), Z(e9)) e4 X(e4) = e4 Y(e4) = X(e4) Z(e1) = Y(e4) e5 X(e5) = e5 Y(e5) = X(e5) Z(e1) = Y(e5) e6 X(e6) =W(e6) Y(e6) = P(X(e6), Z(e2)) Z(e1) = Y(e6) e7 X(e7) =W(e7) Y(e7) = P(X(e7), Z(e1)) Z(e7) = S(Y(e7), Z(e3)) e8 X(e8) =W(e8) Y(e8) = P(X(e8), Z(e4)) Z(e8) = S(Y(e8), Z(e5)) e9 X(e9) =W(e9) Y(e9) = P(X(e9), Z(e8)) Z(e1) = Y(e9)
Hình 2.11: Câysp.