Tất cả chúng ta phải làm là -
- Tìm hiểu một người không biết bất cứ ai khác
- Và sau đó kiểm tra mọi người đều biết người đó
Bước 1: Tìm ra một người không biết ai khác. Ban đầu mỗi người là ứng viên của chúng tôi. Vì vậy, hãy bắt đầu với bất kỳ một i như nút hiện tại. Lặp lại tất cả các ứng cử viên j. Nếu Knows (i, j) là false. Sau đó, j không thể là ứng cử viên của chúng tôi. Vì vậy, loại bỏ j từ các ứng cử viên. Nếu Knows (i, j) là true cho bất kỳ j, thì tôi không thể là ứng cử viên của chúng ta, do đó, nút hiện tại sẽ được cập nhật thành j và loại bỏ nút i. Lặp lại điều này cho đến khi chúng tôi không thể cập nhật nút hiện tại. Nút hiện tại cuối cùng là ứng cử viên cuối cùng của chúng tôi. Điều này sẽ thực sự là O (N) vì tại mỗi bước chúng ta thực sự loại bỏ một nút, hoặc là i hoặc j.
Bước 2: Chúng tôi đã tìm thấy một người không biết bất kỳ ai khác. Nhưng chúng tôi phải xác minh rằng mọi người đều biết anh ấy. Những gì chúng ta có thể làm là lặp qua tất cả các nút và kiểm tra, đó là O (N). Nếu chúng tôi thấy rằng đây không phải là nút của chúng tôi, thì không có giải pháp nào như vậy. Bởi vì không thể có một nút k khác, đó là giải pháp, vì tôi không biết k.
Chúng tôi có thể sử dụng danh sách liên kết để lưu trữ danh sách ứng cử viên để xóa ứng viên sẽ là O (1).
Điều gì xảy ra nếu có N người và không ai trong số họ biết nhau? Trong trường hợp đó phức tạp trở thành O (N^2) không? – ElKamina
@ElKamina: Độ phức tạp sẽ vẫn là O (N). Đối với mỗi cặp người, vì không biết nhau, chúng tôi loại bỏ cả hai người. Mô tả sự cố có một người hợp lệ luôn tồn tại, nhưng chúng tôi có thể dễ dàng xử lý trường hợp có thể không có người như vậy bằng cách kiểm tra ở cuối sau khi xác định ứng cử viên cuối cùng. – Nabb