Ứng dụng của thuật toán LCA và RMQ trong bài toán xác định băng thông cực đại

Tóm tắt. Nghiên cứu này quan tâm tới bài toán LCA và RMQ cùng một số cách tiếp cận để giải quyết chúng. Bên cạnh đó, các tác giả phân tích một ứng dụng quan trọng của lý thuyết đồ thị và mạng máy tính: Bài toán đường truyền bằng thông cực đại. Kết quả chính đạt được của nghiên cứu là chỉ ra phép quy dẫn từ bài toán truy vấn băng thông cực đại về bài toán truy vấn LCA trên cây nhị phân đầy đủ, từ đó có thể áp dụng các thuật toán LCA hay RMQ một cách trực tiếp để trả lời mỗi truy vấn trong thời gian hằng số. Các đánh giá về phương pháp có thể chứng minh được bằng lý thuyết và hứa hẹn nhiều mở rộng trong việc ứng dụng xử lý đồ thị động.

pdf11 trang | Chia sẻ: thanhle95 | Lượt xem: 186 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Ứng dụng của thuật toán LCA và RMQ trong bài toán xác định băng thông cực đại, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
JOURNAL OF SCIENCE OF HNUE FIT., 2011, Vol. 56, pp. 91-101 ỨNG DỤNG CỦA THUẬT TOÁN LCA VÀ RMQ TRONG BÀI TOÁN XÁC ĐỊNH BĂNG THÔNG CỰC ĐẠI Đoàn Thị Thu Huyền(∗) Học viên cao học K20, Khoa CNTT Trường Đại học Sư phạm Hà Nội Lê Minh Hoàng Trường Đại học Sư phạm Hà Nội (∗)Email: huyendtt88@gmail.com Tóm tắt. Nghiên cứu này quan tâm tới bài toán LCA và RMQ cùng một số cách tiếp cận để giải quyết chúng. Bên cạnh đó, các tác giả phân tích một ứng dụng quan trọng của lý thuyết đồ thị và mạng máy tính: Bài toán đường truyền bằng thông cực đại. Kết quả chính đạt được của nghiên cứu là chỉ ra phép quy dẫn từ bài toán truy vấn băng thông cực đại về bài toán truy vấn LCA trên cây nhị phân đầy đủ, từ đó có thể áp dụng các thuật toán LCA hay RMQ một cách trực tiếp để trả lời mỗi truy vấn trong thời gian hằng số. Các đánh giá về phương pháp có thể chứng minh được bằng lý thuyết và hứa hẹn nhiều mở rộng trong việc ứng dụng xử lý đồ thị động. 1. Mở đầu Bài toán LCA và bài toán RMQ là hai bài toán cổ điển nhưng những nghiên cứu mới về mở rộng của hai bài toán này vẫn được phát triển bởi phạm vi ứng dụng rộng rãi trong lý thuyết cũng như trong thực tế. Tầm quan trọng của bài toán LCA và RMQ thể hiện ở 3 điểm: (1) Những thuật toán kinh điển giải quyết bài toán LCA và RMQ đều là những thuật toán mẫu mực về tính hiệu quả, được chứng minh và đánh giá rõ ràng trong các giáo trình cấu trúc dữ liệu và giải thuật; (2) Rất nhiều thuật toán và ứng dụng thực tế khác cần trả lời truy vấn LCA và RMQ bên trong để tiền xử lý dữ liệu hoặc sử dụng kết quả để xử lý tiếp, việc tăng tốc thuật toán LCA và RMQ sẽ làm tăng tốc thuật toán tổng thể; (3) Có phương pháp quy dẫn tuyến tính từ bài toán LCA sang bài toán RMQ và ngược lại, cho phép phát triển những thuật toán chung cho cả hai bài toán. Bài toán tìm tiền bối chung gần nhất (Lowest Common Ancestors - LCA) phát biểu như sau: Cho một cây có gốc và một loạt các truy vấn. Mỗi truy vấn nhận vào một cặp nút (u, v) và trả về nút tiền bối chung của cả u và v có độ sâu lớn nhất. 91 Đoàn Thị Thu Huyền và Lê Minh Hoàng Bài toán LCA được đề xuất đầu tiên bởi Aho, Hopcroft và Ullman [1]. Rất nhiều thuật toán đã được phát triển với thời gian tiền xử lý tuyến tính, và trả lời mỗi truy vấn trong thời gian hằng số [6,7]. Đặc biệt, Omer Berkman và Uzi Vishkin [8] đã chỉ ra rằng nếu xây dựng một chu trình Euler trên phiên bản có hướng của cây rồi liệt kê các nút theo đúng thứ tự được thăm trong một danh sách, khi đó tiền bối chung gần nhất của hai nút bất kỳ sẽ là đỉnh có độ sâu nhỏ nhất nằm giữa hai nút trong danh sách. Lúc này, truy vấn LCA trở thành truy vấn tìm giá trị nhỏ nhất trong một phạm vi (Range-Minimum Query - RMQ). Bài toán RMQ quản lý một danh sách A gồm n phần tử và trả lời một loạt các truy vấn. Mỗi truy vấn có dạng RMQ(i, j) nhận vào một cặp số (i, j) là chỉ số của hai phần tử trong mảng và trả về chỉ số của phần tử nhỏ nhất trong mảng con A[i..j]. Trong thuật toán quy dẫn từ bài toán LCA về bài toán RMQ sử dụng chu trình Euler, mỗi bài toán LCA tổng quát sẽ được quy dẫn về một trường hợp hạn chế của bài toán RMQ - khi danh sách là số nguyên mà hai phần tử liên tiếp hơn kém nhau đúng 1 đơn vị. Gabow, Bentley và Tarjan [6] lại đề xuất phép quy dẫn tuyến tính theo hướng ngược lại - từ bài toán RMQ về bài toán LCA - bằng cách sử dụng một cấu trúc dữ liệu là cây descartes (cartesian trees). Trước khi có kết quả này, hầu hết các thuật toán RMQ như sử dụng bảng thưa (sparse tables) hay cây quản lý đoạn (segment trees) đều không đạt được yêu cầu:Thời gian tiền xử lý O(n) và thời gian trả lời mỗi truy vấn O(1). Kết quả của Gabow, Bentley và Tarjan cho phép quy dẫn tuyến tính bài toán RMQ về bài toán LCA, sau đó bài toán LCA lại có thể quy dẫn tuyến tính về một trường hợp hạn chế của bài toán RMQ bằng chu trình Euler. Như vậy người ta chỉ cần phát triển các thuật toán RMQ trong trường hợp hạn chế và đã có những thuật toán trả lời truy vấn RMQ trong thời gian O(1) sau một phép tiền xử lý trong thời gian O(n) [4]. Nội dung nghiên cứu chính của bài báo gồm: Giới thiệu bài toán đường truyền băng thông cực đại giữa mọi cặp máy; Trình bày phép quy dẫn về cây khung lớn nhất và bài toán LCA; Mô tả thuật toán quy dẫn sử dụng cây nhị phân đầy đủ đối ngẫu; Kết quả cài đặt thực nghiệm và kết luận. 2. Nội dung nghiên cứu 2.1. Bài toán đường truyền băng thông cực đại Bài toán đường truyền băng thông cực đại phát biểu như sau: Cho mạng gồm n máy và m cáp nối biểu diễn bởi đồ thị vô hướng liên thông có trọng số G = (V,E, b). Trong đó tập đỉnh V là tập các máy, tập cạnh E là tập các cáp nối và hàm trọng số b : E → R cho mỗi cạnh e = (u, v) một trọng số (hay băng thông) b(e) = b(u, v) là băng thông của dây cáp mạng e. Mỗi đường đi từ s tới t trên đồ thị tương ứng 92 Ứng dụng của thuật toán LCA và RMQ trong bài toán xác định băng thông cực đại với một đường truyền từ máy s tới máy t. Định nghĩa băng thông của một đường truyền là băng thông nhỏ nhất của một dây cáp mạng trên đường truyền. Tức là nếu Ps = p1, p2, . . . , pk = t là một đường truyền từ máy s tới máy t thì băng thông của đường truyền này, ký hiệu b(P ) = min1≤i<k{b(pi, p(i+1))}. Bài toán đặt ra là xác định đường truyền băng thông cực đại giữa một số cặp máy của mạng. Để tiện trong việc trình bày, ta gọi băng thông cực đại giữa hai đỉnh u,v, ký hiệu (βu, v), là băng thông của đường truyền băng thông cực đại giữa hai đỉnh đó. Bổ đề 2.1. (Tính chất bài toán con tối ưu) Nếu P = (p1, p2, . . . , pk) là một đường truyền băng thông cực đại từ máy p1 tới máy pk thì với mọi cặp đỉnh (pi, pj)(i < j), nếu ta thay thế đoạn (pi, p(i+1), . . . , pj) trên đường P bởi đường truyền bằng thông cực đại từ máy pi tới máy pj thì vẫn thu được đường truyền băng thông cực đại từ máy p1 tới máy pk. Nếu P là một đường truyền từ x tới y và Q là đường truyền từ y tới z thì đường truyền P nối tiếp đường truyền Q có băng thông là: min{b(P ), b(Q)}. Việc chứng minh Bổ đề 1 khá hiển nhiên. Nhờ tính chất khá tương đồng với bài toán đường đi ngắn nhất này mà chúng ta có thể thực hiện phép tìm đường truyền băng thông cực đại giữa hai đỉnh s, t bằng một sửa đổi nhỏ trong các thuật toán tìm đường đi ngắn nhất: - Các thuật toán tìm đường đi ngắn nhất trước hết khởi tạo các nhãn khoảng cách d(v) là độ dài đường đi nào đó từ s tới v. Trong bài toán tìm băng thông cực đại, ta khởi tạo các d(v) là băng thông một đường truyền nào đó từ s tới v. Chẳng hạn d(s) =∞; d(v) = −∞(∀v 6= s) . - Các thuật toán tìm đường đi ngắn nhất đều dựa trên một toán tử quan trọng là phép co trên một cạnh (u, v): Nếu đường đi từ s tới v đang có dài hơn đường đi từ s tới u cộng với trọng số cạnh (u, v) thì hủy bỏ đường s ; v đang có và thay vào đó là đường s ; u→ v. Công thức tối ưu hóa nhãn khoảng cách là: d(v) = min{d(v), d(u) + b(u, v)} Ở bài toán tìm băng thông cực đại, đường đi s ; u → v có băng thông là min{d(u), b(u, v)}, vì vậy công thức tối ưu nhãn được sửa lại là: d(v) = max{d(v),min{d(u), b(u, v)}} . - Trong bài toán đường đi ngắn nhất, các nhãn khoảng cách giảm dần về độ dài đường đi ngắn nhất, ở bài toán tìm băng thông cực đại, các nhãn băng thông tăng dần về về giá trị băng thông cực đại. 93 Đoàn Thị Thu Huyền và Lê Minh Hoàng Như vậy, thuật toán Dijkstra có thể sửa đổi để tìm đường truyền băng thông cực đại xuất phát từ một đỉnh. Bằng sự hỗ trợ của một số cấu trúc dữ liệu hàng đợi ưu tiên như Fibonacci Heaps, thời gian thực hiện giải thuật Dijkstra là: O(|V | log |V |+ |E|) Ta cũng có thể sửa đổi thuật toán Floyd để tìm băng thông cực đại giữa mọi cặp đỉnh trong thời gian O(|V |3). Trong trường hợp đồ thị thưa, việc xác định đường truyền băng thông cực đại giữa mọi cặp đỉnh có thể sử dụng thuật toán Johnson (thực hiện |V | lần Dijkstra với tất cả các cách chọn đỉnh xuất phát), với thời gian thực hiện giải thuật là: O(|V |2 log |V |+ |V ||E|). Thuật toán Dijkstra và thuật toán Floyd hoàn toàn có thể tìm băng thông cực đại trong trường hợp đồ thị có trọng số âm, thậm chí có chu trình âm. Việc chứng minh tính đúng đắn của thuật toán có thể làm tương tự như trong lý thuyết bài toán đường đi ngắn nhất [3]. Tuy nhiên với những cách tiếp cận đơn giản kể trên, để tính băng thông cực đại giữa hai đỉnh mất thời gian O(|V | log |V | + |E|) và để tính băng thông cực đại giữa mọi cặp đỉnh mất thời gian O(|V |3). Kết quả lý thuyết và thực nghiệm đều cho thấy chương trình cài đặt các giải thuật trên thực hiện khá chậm trong trường hợp đồ thị lớn và số truy vấn nhiều. Điều này chỉ ra sự cần thiết của những thuật toán hiệu suất cao sẽ được trình bày trong những phần sau. 2.2. Quy dẫn về cây khung lớn nhất Cây khung lớn nhất của đồ thị là cây khung có tổng trọng số cạnh lớn nhất. Những thuật toán tìm cây khung nhỏ nhất đều có thể áp dụng để tìm cây khung lớn nhất bằng cách đổi dấu tất cả các trọng số cạnh của đồ thị. Bổ đề sau đây là cở sở cho phép quy dẫn bài toán đường truyền băng thông cực đại về bài toán tìm đường đi trên cây. Bổ đề 2.2. (Phép quy dẫn về đường đi trên cây khung lớn nhất) Gọi T là cây khung lớn nhất của đồ thị G, khi đó với mọi cặp đỉnh (s, t) tồn tại một đường truyền băng thông cực đại từ s tới t là đường đi đơn duy nhất từ s tới t trên cây khung T . Chứng minh. Trong số các đường truyền băng thông cực đại từ s tới t, chọn P là một đường truyền có ít cạnh ngoài T nhất. Ta sẽ chứng minh rằng P không chứa cạnh ngoài T . Thật vậy nếu trên P có cạnh e(u, v) /∈ T , việc kết nạp e vào T sẽ tạo ra đúng một chu trình đơn C. Cạnh e phải là cạnh có băng thông nhỏ nhất trong số cách 94 Ứng dụng của thuật toán LCA và RMQ trong bài toán xác định băng thông cực đại cạnh thuộc C vì nếu có cạnh e′ ∈ C có b(e′) < b(e), thì ta có thể loại e′ khỏi T và bổ sung vào T cạnh e, được cây khung mới lớn hơn cây khung T , điều này mâu thuẫn với giả thiết T là cây khung lớn nhất. Vì e là cạnh có băng thông nhỏ nhất trong các cạnh thuộc C, ta có thể thay thế cạnh e = (u, v) trên đường truyền P bởi các cạnh còn lại của chu trình C sau khi đã loại bỏ đi cạnh e, điều này không làm giảm băng thông của đường truyền mà còn thu được một đường truyền mới chứa ít cạnh ngoài T hơn so với đường P , điều này mâu thuẫn với cách chọn P là đường truyền băng thông cực đại chứa ít cạnh ngoài T nhất. Bổ đề 2 cho phép chúng ta chỉ cần quan tâm tới những cạnh thuộc cây khung lớn nhất mà không cần quan tâm tới những cạnh khác của đồ thị. Đường đi đơn giữa hai đỉnh trên cây khung là duy nhất, được thực hiện bằng cách di chuyển từ một đỉnh lên tiền bối chung gần nhất sau đó di chuyển tới đỉnh còn lại. Từ đó ta có thuật toán: Chọn một đỉnh bất kỳ làm gốc, dùng một thuật toán tìm kiếm trên đồ thị (BFS/DFS) để xác định thứ tự cha/con của các đỉnh trên cây khung cũng như độ sâu của chúng. Với mỗi đỉnh v, ký hiệu d[v] là độ sâu của đỉnh v, ký hiệu p[0, v] là đỉnh cha của đỉnh v(quy ước p[0, "gốc" ] = 0). Ký hiệu q[0, v] là trọng số cạnh nối v với đỉnh cha p[0, v] của nó. Với 1 ≤ i ≤ lg |V |, các giá trị p[i, v] được định nghĩa là đỉnh tiền bối của v, đến được từ v sau 2i bước di chuyển lên gốc và giá trị q[i, v] là băng thông nhỏ nhất của một cạnh trên đường di chuyển, dễ dàng tính được những giá trị này bằng các công thức truy hồi sau: u := p[i− 1, v] p[i, v] := p[i− 1, u] q[i, v] := min{q[i− 1, v], q[i− 1, u]} Phép tiền xử lý cho phép ta cài đặt phép nhảy xa bằng con trỏ p[..]: Để từ nút v đi lên k bước về phía gốc, ta phân tích k thành tổng các lũy thừa của 2 bằng thuật toán chuyển đổi cơ số nhị phân: k = 2i1 + 2i2 + ...+ 2ij . Sau đó từ v nhảy lên u1 = p[i1, v], từ u1 nhảy lên u2 = p[i2, u1], từ u2 nhảy lên u3 = p[i3, u2]. . . cuối cùng ta nhảy lên uj = p[ij, uj−1], hoàn thành phép di chuyển k bước chỉ bằng O(lg k) phép nhảy. Để trả lời mỗi truy vấn về băng thông cực đại giữa s và t. Ta di chuyển từ s và t lên nút tiền bối chung và trả về băng thông nhỏ nhất của một cạnh trên đường di chuyển: Trước hết là từ nút sâu hơn nhảy lên cho bằng độ sâu của nút còn lại, sau đó từ hai nút nhảy theo các bước từ xa đến gần cho tới khi tới được nút tiền bối chung. function Query(s, t ∈ V ) : R; 66 Trả về băng thông giữa s và t 95 Đoàn Thị Thu Huyền và Lê Minh Hoàng begin β := +∞; if d[s] < d[t] then //Đảo giá trị s và t; for i := [lg |V |] downto 1 do //Chỉnh cho 2 đỉnh cùng độ sâu if d[s]− 2i ≥ d[t] then begin //Cho s nhảy lên 2i bước β := min{β, q[i, s]}; s := p[i, s]; end; if s 6= t then begin for i := [lg |V |] downto 1 do if p[i, s] 6= p[i, t] then begin //Nhảy cả s và t lên 2i bước β := min{β, q[i, s], q[i, t]}; s := p[i, s]; t := p[i, t]; end; β := min{β, q[0, s], q[0, t]}; end; return β; end; Sau các phép tiền xử lý: Tìm cây khung lớn nhất (O(|V | log |V |+E))xác định các con trỏ nhảy xa (O(|V | lg |V |)), việc tìm băng thông cực đại giữa hai đỉnh bất kỳ có thể thực hiện trong thời gian O(lg |V |). Kết quả này tỏ ra tốt hơn thuật toán Dijkstra nếu phép truy vấn băng thông cực đại được gọi thực hiện nhiều lần. Thuật toán sử dụng cây nhị phân đầy đủ đối ngẫu. Thời gian thực hiện giải thuật O(lg |V |) cho mỗi truy vấn băng thông cực đại đã là khá tốt trong các ứng dụng thực tế, khi mà pha tiền xử lý chỉ cần thực hiện một lần với thời gian không đáng kể. Tuy nhiên vẫn còn có phương pháp tốt hơn nữa để trả lời mỗi truy vấn băng thông cực đại. Thuật toán dưới đây dựa trên cơ chế xây dựng cây nhị phân đầy đủ đối ngẫu song song với quá trình tìm cây khung lớn nhất, nó có những ưu điểm chính sau: - Có thể trả lời mỗi truy vấn băng thông cực đại trong thời gian hằng số (O(1)). - Dễ dàng tìm lại đường truyền băng thông cực đại sau mỗi truy vấn. - Việc tìm băng thông cực đại được trả lời trực tiếp bằng truy vấn LCA trên cây nhị phân đầy đủ mà không cần các cấu trúc dữ liệu phụ trợ như con trỏ nhảy xa. Điều này cho phép áp dụng trực tiếp các thuật toán LCA hay quy dẫn về bài 96 Ứng dụng của thuật toán LCA và RMQ trong bài toán xác định băng thông cực đại toán RMQ mà không cần một sửa đổi nào. - Chính vì việc có thể áp dụng trực tiếp các thuật toán LCA và RMQ, phương pháp này có cơ hội mở rộng để xử lý truy vấn động: khi băng thông của các cạnh liên tục thay đổi đi kèm với các truy vấn băng thông cực đại. Với đồ thị gồm n đỉnh, m cạnh, trước hết, ta xây dựng cây khung lớn nhất bằng thuật toán Kruskal. Thuật toán Kruskal trước hết khởi tạo một họ các tập rời nhau S1, S2, . . . , Sn, mỗi tập chứa một đỉnh của đồ thị. Với mỗi tập Si, ta cho tương ứng với nó một cây nhị phân đầy đủ B(Si) chứa các đỉnh của Si trong lá. Ban đầu tất cả các cây B(Si) cũng chỉ gồm một nút duy nhất chứa một đỉnh của Si. Thuật toán Kruskal duyệt các cạnh theo thứ tự từ băng thông lớn tới băng thông nhỏ. Mỗi khi duyệt cạnh (u, v), thuật toán xác định Si và Sj lần lượt là hai tập chứa u và v. Nếu Si 6= Sj , hai tập này sẽ được hợp nhất lại thành một tập Sk, tức là thuật toán hủy đi hai tập Si,Sj và kết nạp vào một tập Sk = Si ∪ Sj . Song song với quá trình đó, ta tạo một nút nhánh chứa cạnh (u,v), cho B(Si) và B(Sj) lần lượt là con trái và con phải nút nhánh này để được cây B(Sk) tương ứng với tập Skmới tạo ra. Khi thuật toán Kruskal kết thúc và xác định cây khung lớn nhất T . Ta cũng thu được một cây nhị phân B với các nút lá là các đỉnh và các nút nhánh là các cạnh. Đây là cây nhị đầy đủ (full binary trees) - mỗi nút nhánh có đúng 2 nút con. Thuật toán xây dựng cây nhị phân đầy đủ đối ngẫu. Input: G = (V,E, b) có các đỉnh đánh số từ 1 tới n và m cạnh đánh số từ 1 tới m. Cạnh ei nối hai đỉnh ui, vi Output: Cây khung lớn nhất T và cây nhị phân đầy đủ đối ngẫu B. Sắp xếp ds cạnh: b(e1)b(e2) ≥ ... ≥ b(em); for u := 1 to n do begin Su := u;B(Su) := Node(u); end; T := Ø; for i := 1 to m do begin Si := ”FindSet”(ui);Sj := ”FindSet”(vj); if Si 6= Sj then begin T := T ∪ {ei}; Sk := ”Union”(Si, Sj); B(Sk) := Node(ei); 97 Đoàn Thị Thu Huyền và Lê Minh Hoàng B(Sk).Left := B(Si);B(Sk).Right := B(Sj); end; end; S∗ :="Tập duy nhất còn lại trong họ tập rời nhau" ; return Cây khung lớn nhất T , cây nhị phân đầy đủ đối ngẫu B = B(S∗); Để tìm băng thông cực đại giữa đỉnh s và đỉnh t: từ lá s và t trên cây nhị phân đầy đủ B, ta tìm nút tiền bối chung gần nhất của chúng. Băng thông của cạnh e chứa trong nút tiền bối chung gần nhất chính là băng thông cực đại của đường truyền từ s tới t. Tính đúng đắn của thuật toán có thể chứng minh như sau: Nếu cạnh e nằm trong nút tiền bối chung gần nhất, thì e là cạnh đầu tiên thuật toán Kruskal kết nạp vào cây khung mà cho phép đi giữa s và t trên cây. Những cạnh đã kết nạp trước đó luôn tách s,t vào hai thành phần liên thông khác nhau, những cạnh kết nạp sau đó đều có băng thông nhỏ hơn e. Vì vậy đường đi từ s tới t trên cây khung lớn nhất có cạnh e là cạnh mang băng thông nhỏ nhất, đó chính là băng thông cực đại giữa s và t. Bởi phép truy vấn băng thông cực đại được thực hiện trực tiếp bởi truy vấn LCA trên cây nhị phân đầy đủ, bất kỳ thuật toán LCA nào cũng có thể áp dụng được. Cũng có thể áp dụng phép quy dẫn về bài toán RMQ và sử dụng các thuật toán RMQ. Định lí 2.1. Có thể trả lời mỗi truy vấn băng thông cực đại trong thời gian O(1) với thời gian tiền xử lý O(|E| log |E|). Chứng minh. Thuật toán sắp xếp danh sách cạnh có thể dùng HeapSort hoặc Merge Sort O(|E| log |E|). Nếu dùng các thuật toán sắp xếp số học còn có thể đạt hiệu quả cao hơn. Thuật toán Kruskal với cấu trúc dữ liệu dùng các tập rời nhau (disjoint-set forest) kết hợp với hai kỹ thuật: hợp theo hạng (union-by-rank) và nén đường (path compression) có thời gian thực hiện O(|E|α(|V |)) CITATION Cormen_IA l1033 [3]. Phép dựng cây nhị phân đầy đủ mất thời gian O(|V |). Vì đồ thị liên thông nên E = Ω(|V |), ta có tổng thời gian tiền xử lý là O(|E| log |E|). Trong trường hợp các cặp đỉnh trong các truy vấn băng thông cực đại được biết trước, có thể dùng thuật toán Tarjan’s Offline LCA để trả lời toàn bộ k truy vấn trong thời gian O(n + k). Một phương pháp khác là mất thêm thời gian O(n) để quy dẫn về bài toán RMQ, sau đó mỗi truy vấn LCA được lại được quy dẫn về một truy vấn RMQ, thực hiện trong thời gian O(1), phương pháp này có thể sử dụng ngay cả khi các truy vấn là không biết trước. 98 Ứng dụng của thuật toán LCA và RMQ trong bài toán xác định băng thông cực đại 2.3. Cài đặt thực nghiệm Mặc dù các kết quả thu được có thể chứng minh chặt chẽ bằng lý thuyết. Việc cài đặt thêm một vài thực nghiệm là cần thiết để đánh giá tác động của hằng số ẩn trong ký pháp đánh giá thời gian thực hiện giải thuật. Các thực nghiệm được cài đặt trên máy tính có cấu hình như sau: CPU AMD 64X2 5200MHz (2600MHz/core), RAM 4GB, hệ điều hành Windows 7 64 bit, môi trường phát triển RAD Studio XE. Dữ liệu là 10 nhóm đồ thị, mỗi nhóm chứa 10 đồ thị ngẫu nhiên có số đỉnh (n) bằng số hiệu nhóm ×105. Thời gian thực hiện với một nhóm được tính bằng thời gian trung bình thực hiện trên một đồ thị của nhóm. Có ba thuật toán được thử nghiệm: - Thuật toán A: Sử dụng con trỏ nhảy xa như đã đề cập ở mục 3. - Thuật toán B: Sử dụng cây nhị phân đầy đủ đối ngẫu và thuật toán Tarjan’s Offline LCA [7]. - Thuật toán C: Sử dụng cây nhị phân đầy đủ đối ngẫu, dùng chu trình Euler quy dẫn về bài toán RMQ sau đó thực hiện thuật toán RMQ [4]. Thuật toán Dijkstra và Floyd đã có nhiều nghiên cứu khác đánh giá, hơn nữa, chúng có thời gian thực hiện quá chậm, không thích hợp với kích thước đồ thị lớn và số truy vấn nhiều. Trong các thực nghiệm, thời gian trả lời riêng lẻ từng truy vấn băng thông cực đại là rất nhỏ và rất khó đo được trên máy tính. Chúng tôi khắc phục bằng cách đo tổng thời gian thực hiện trên 10 triệu truy vấn ngẫu nhiên. Thực nghiệm 1. Được tiến hành để đo riêng thời gian tiền xử lý với từng thuật toán. Thời gian nhập/xuất dữ liệu và dựng cây khung lớn nhất không được tính vì những pha này có mặt trong cả ba thuật toán. Giải thuật Tarjan’s Offline LCA không cần tiền xử lý dữ liệu mà chỉ cần biết trước danh sách các truy vấn, vì vậy thuật