Ta có đồ thị của chúng ta là một vòng có n nút và có một hướng duy nhất theo chiều kim đồng hồ. Độ lớn của mạng là tuỳ ý, các bộ xử lý cũng là tuỳ ý. Bài toán đặt ra là chọn ra một tiến trình duy nhất có thông điệp leader đi ra khỏi kênh[4].
Một điểm nhận thấy ngay là nếu tất cả các nút đều giống hệt nhau thì bài toán của chúng ta không có lời giải.
Định đề 1: Nếu tất cả các nút trong mạng đều giống nhau về tập các trạng thái, tập các trạng thái ban đầu, các hàm sinh thông điệp và các hàm chuyển tiếp thì chúng ta không thể giải quyết được vấn đề leader election đối với n>1.
Chứng minh: Bằng phương pháp quy nạp áp dụng cho số vòng quay của mạng, các bộ xử lý đều có chung một trạng thái sau bất kỳ số vòng quay. Do đó, nếu có một bộ xử lý nào gửi thông điệp leader thì tất cả các bộ xử lý còn lại cũng gửi thông điệp leader tại cùng một thời điểm, và như vậy là vi phạm yêu cầu của bài toán.
Theo như định đề 1, để giải quyết được vấn đề leader election thì ta phải phá vỡ đi sự cân bằng. Mỗi nút sẽ được gán cho một định danh duy nhất (UID) đảm bảo sao cho định danh của các nút là khác nhau.
Giải quyết bài toán này có một số thuật toán sau
1. Thuật toán Lelann, Chang-Roberts (LCR)
Mỗi tiến trình sẽ gửi ID của mình vòng quanh mạng. Khi một nút nhận được một ID đến, nó sẽ so sánh ID đó với ID của mình. Nếu ID đến lớn hơn, nó sẽ để ID đó tiếp tục đi qua. Nếu ID đến nhỏ hơn, nó sẽ loại bỏ ID đến. Nếu bằng thì tiến trình sẽ thông báo nó là leader. Rõ ràng, tiến trình có ID lớn nhất sẽ đưa ra thông điệp leader[4]. Sau đây là thuật toán.
Tập thông điệp M là có các UID cùng với thông điệp leader. Tập trạng thái states(i) sẽ có các thành phần sau:
own, có kiểu của UID, khởi tạo là UID của i.
send, có kiểu của UID hoặc null, khởi tạo là UID của i.
status, có giá trị trong tập {unknown, chosen, reported}, khởi tạo là unknown. Trạng thái bắt đầu start(i) được khởi tạo như ở trên.
Hàm thông điệp msg(i) được định nghĩa như sau. Gửi thông điệp m, tức UID, theo chiều kim đồng hồ tớn nút láng giềng nếu m là giá trị của send. Nếu status=chosen thì gửi leader tới nút tiếp theo.
Hàm chuyển được định nghĩa theo đoạn giả mã sau. Giả sử thông điệp mới là m.
send:=null
If status=chosen then status:=reported Case: m>own then send:=m m=own then status:=chosen send:=null else no-op End case
Bây giờ ta sẽ chứng minh tính đúng đắn của thuật toán. Đặt imax là chỉ số của tiến trình có UID lớn nhất. Ta có hai bổ đề sau:
Bổ đề 1: Nút imax sẽ sinh ra thông điệp leader tại vòng thứ n+1
Chứng minh: Đặt trạng thái own của tiến trình imax là vmax: own=vmax. Chú ý rằng, theo đoạn mã trên thì giá trị của own không bao giờ thay đổi. Theo đoạn mã, ta có thể thấy rằng sau n vòng
status(imax)=chosen
Điều này có thể chứng minh bằng phương pháp quy nạp đối với số lượng các bước tính toán, mà ở đây là số các vòng. Ta sẽ chứng minh khẳng định sau
Với mọi r mà 0≤r≤n-1 thì sau r vòng send(imax+r)=vmax.
Thật vậy, tất cả các nút khác imax đều sẽ gán giá trị lớn nhất vào thành phần send, khi đó vmax sẽ lớn hơn tất cả các giá trị khác.
Bổ đề 2:Không có tiến trình nào khác imax gửi thông điệp leader.
Chứng minh: Ta thấy rằng tất cả các tiến trình khác đều có status=unknown, và chúng cũng không thay đổi. Gọi khoảng [a,b) là tập các vị trí {a,a+1,..,b-1}. Ta có khẳng định sau
Nếu i≠imax và j[imax,i), thì own(i)≠send(j)
Tức là giá trị lớn nhất chỉ xuất hiện giữa chỉ số lớn nhất imax và chỉ số own trong mạng.
Bằng phương pháp quy nạp ta sẽ thu được chỉ có vmax là lớn nhất.
Độ phức tạp: Với vòng mạng có độ lớn là n thì, độ phức tạp về thời gian là n+1 vòng cho đến khi một leader được thông báo. Độ phức tạp kết nối là O(n2) thông điệp.
2. Thuật toán Hirshberg-Sinclair
Thời gian của thuật toán LCR là chấp nhận được. Tuy nhiên số lượng thông điệp trên mạng O(n2) là nhiều. Thuật toán thứ nhất khắc phục được hạn chế này xuống chỉ còn O(nlogn) là thuật toán Hirshberg-Sinclair[4]. Ở thuật toán này, bài toán của chúng ta vẫn có kích thước mạng là không xác định, nhưng mạng ở đây sử dụng kết nối hai chiều. Cũng giống như trong thuật toán LCR, thuật toán này cũng chọn ra một tiến trình có UID lớn nhất.
Ở đây, các tiến trình không gửi thông điệp đi hết vòng quanh mạng mà các thông điệp “đi vòng quanh” và quay trở lại tiến trình gốc(xem hình 3.1). Tư tưởng thuật toán như sau:
Mỗi tiến trình sẽ gửi thông điệp (theo cả hai chiều) liên tiếp với khoảng cách lớn dần theo bội số của 2 và sau đó quay trở lại nút gốc. Khi một UID vi được gửi đi từ tiến trình i thì tất cả các tiến trình khác trên đường đi của vi sẽ so sánh vi với UID của mình. Với tiến trình j có UID là vj thì có hai khả năng xảy ra. Nếu vi<vj thì j sẽ không cho vi về nút gốc mà nó sẽ gửi thông điệp tới i để thông báo i ngừng tạo thông điệp. Ngược lại, nếu vi>vj, j sẽ để vi tiếp tục, nó cũng nhận ra là nó không thể chiến thắng nên nó sẽ không tạo thêm thông điệp nữa. Cuối cùng, nếu một tiến trình nhận được thông điệp của nó trước khi thông điệp đó đi vòng quanh mạng thì tiến trình đó chiến thắng.
Phân tích: Một tiến trình có thể tạo được thông điệp có đường truyền dài 2i
chỉ khi nó không bị huỷ bỏ bởi các tiến trình khác trên đoạn 2i-1 theo cả hai chiều của vòng. Điều này có nghĩa là trong bất kỳ nhóm tiến trình 2i-1
+1 sẽ có nhiều nhất một tiến trình liên tiếp tạo ra các thông điệp có độ dài đường truyền là 2i. Như vậy có tổng số nhiều nhất
1 2i 1
n
thông điệp có độ dài 2i. Vậy tổng số thông điệp sẽ được gửi là
... 1 2 . 2 ... 3 . 4 2 . 2 . 1 4 n n n i i 1n
Thừa số 4 trong biểu thức trên là do mỗi vòng mà thông điệp được gửi đi sẽ được gửi theo cả hai chiều – theo chiều kim đồng hồ và ngược chiều kim đồng hồ và mỗi thông điệp gửi đi sẽ đi vòng quanh và quay trở lại. (Ví dụ, trong vòng đầu tiên của các thông điệp, mỗi tiến trình sẽ gửi đi hai thông điệp - mỗi chiều một thông điệp – theo mỗi khoảng cách của chúng; sau đó mỗi thông điệp gửi đi sẽ quay trở lại theo khoảng cách của chúng; như vậy tổng số là bốn thông điệp). Mỗi số hạng trong ngoặc đơn ngoài cùng là số lượng thông điệp được gửi quanh vòng và không bị chặn lại(chỉ đếm các thông điệp đi hết vòng). Số hạng đầu tiên, (1.n), chỉ ra rằng tất cả n tiến trình gửi đi thông điệp có khoảng cách là 1.
Mỗi số hạng trong ngoặc đơn ngoài cùng đều có giá trị nhỏ hơn hoặc bằng 2n nên có nhiều nhất là 1+[log n] số hạng trong biểu thức, do đó tổng số thông điệp là O(n log
n) với hằng số xấp xỉ 8.
Độ phức tạp về thời gian của thuật toán là O(n), là thời gian để tìm ra tiến trình chiến thắng. Tiến trình chiến thắng sẽ gửi các thông điệp mất khoảng thời gian là 2, 4, 8, …để đi ra và quay trở lại và nó sẽ kết thúc sau khi gửi [log n] thông điệp. Nếu n là một bộ số của 2 thì thời gian mà tiến trình chiến thắng thực hiện là 3n, nếu n không là bội số của 2 thì thời gian nhiều nhất là 5n.