Khác biệt giữa bản sửa đổi của “Thuật toán tìm thành phần liên thông mạnh của Tarjan”
Nội dung được xóa Nội dung được thêm vào
nKhông có tóm lược sửa đổi |
sửa chính tả |
||
Dòng 1:
[[File:Tarjan's Algorithm Animation.gif|thumb|Tarjan's Algorithm Animation]]
'''Thuật Toán Tarjan''' (được đặt theo tên của người tìm ra nó - Robert Tarjan<ref>{{citation|first=R. E.|last=Tarjan|authorlink=Robert Tarjan|title=Depth-first search and linear graph algorithms|journal=[[SIAM Journal on Computing]]|volume=1|year=1972|issue=2|pages=146–160|doi=10.1137/0201010}}</ref>) là một thuật toán trong [[lý thuyết đồ thị]] dùng để tìm thành phần liên thông mạnh trong một đồ thị. Mặc dù
==Tổng
*
*'''Ý tưởng cơ bản của thuật toán này là''': [[tìm kiếm theo chiều sâu]] bắt đầu từ một đỉnh tùy ý (và sau đó tìm kiếm sâu dần trên bất kỳ các đỉnh nào chưa được xét). Việc tìm kiếm sẽ không xét đến bất kỳ đỉnh nào đã được xét trước đó. Các thành phần liên thông mạnh tạo nên các cây con của cây tìm kiếm, gốc của những cây con đó chính là là gốc của các thành phần liên thông mạnh.
*Các đỉnh được đưa vào một [[ngăn xếp]] theo thứ tự mà chúng đã được xét. Khi việc tìm kiếm trả về một cây con, các đỉnh được lấy ra khỏi [[ngăn xếp]] và được xác định xem liệu mỗi đỉnh được lấy ra có phải là gốc của một thành phần liên thông mạnh hay không. Nếu một đỉnh đã được xác định là gốc của một thành phần liên thông mạnh thì nó và tất cả các đỉnh được lấy ra trước đó hình thành nên thành phần liên thông mạnh.
===Các
*Điểm mấu chốt của thuật toán chính là việc xác định một đỉnh có phải là gốc của một thành phần liên thông mạnh hay không
*Để tìm đỉnh gốc, mỗi đỉnh v được gán cho
==Mã
index:= 0
S:= empty
Dòng 27:
for mỗi (v, w) trong E do
if (w.index không xác định) then
// Đỉnh kế w chưa được viếng thăm; đệ quy thăm nó
strongconnect(w)
v.lowlink:= min(v.lowlink, w.lowlink)
else if (w is in S) then
// Đỉnh kế w nằm trong
v.lowlink:= min(v.lowlink, w.index)
end if
repeat
// Nếu v là nút gốc, lấy ra khỏi
if (v.lowlink = v.index) then
bắt đầu một thành phần liên thông mạnh
Dòng 45:
end if
end function
*Biến index
*Vòng lặp ngoài thực hiện tìm kiếm
*Khi mỗi đỉnh kết thúc việc tìm kiếm, nếu lowlink có giá trị bằng index thì đỉnh đó chính là đỉnh gốc của một thành phần liên thông mạnh - được hình từ bởi tất cả các đỉnh ở phía trước nó trong [[ngăn xếp]]. Thuật toán sẽ lấy ra tất cả các đỉnh có trong [[ngăn xếp]] và bao gồm đỉnh hiện tại, và trình bày tất các đỉnh như một thành phần liên thông mạnh.
==Nhận
*Độ phức tạp: thủ tục Tarjan được gọi một lần cho mỗi cạnh và mỗi cạnh được xét qua nhiều nhất là hai lần. Chi phí thời gian của thuật toán là tuyến tính tùy thuộc theo số lượng các cạnh có trong đồ thị G tức là:<math>O(|V|+|E|)</math>.
*
*Một ưu điểm của thuật toán là không có thành phần liên thông mạnh được xác định trước khi bất kỳ đỉnh kế của nó được xác định. Do đó, thứ tự của các thành phần liên thông mạnh đã được tìm thấy tạo thành nghịch đảo của một
==Tham
{{tham khảo}}
==Xem
*[http://www.ics.uci.edu/~eppstein/161/960220.html#sca Description of Tarjan's Algorithm]
*[http://stackoverflow.com/questions/6643076/tarjan-cycle-detection-help-c#sca Implementation of Tarjan's Algorithm in .NET]
|