Về thuật toán:
Tôi thích câu trả lời @sxeraverx trừ phần ma trận thưa thớt. Một danh sách điều chỉnh hoặc đồ thị đối tượng đơn giản sẽ là một lựa chọn tốt hơn ở đây. Ma trận phải cấp phát bộ nhớ cho mỗi kết nối có thể là là O (n^2) trong đó n là số lượng người dùng.Một danh sách hoặc đồ thị đối tượng sẽ chỉ cấp phát bộ nhớ trên O (e) trong đó e là số lượng kết nối, đó là thưa thớt.
Tôi sẽ sử dụng tìm kiếm chuyên sâu với đánh dấu để tìm bạn bè. Đánh dấu các nút mà bạn đã duyệt qua là điều cần thiết vì chu kỳ của bạn bè sẽ tồn tại. Với DFS, việc tìm kiếm đường dẫn gần như là tầm thường bởi vì chồng bạn đang sử dụng để thực hiện DFS là đường dẫn. Vì vậy, khi bạn tìm thấy người bạn, bạn chỉ cần bật toàn bộ ngăn xếp và bạn đã hoàn tất.
Tìm kiếm hơi thở đầu tiên không có thuộc tính đẹp vì hàng đợi được sử dụng để duyệt biểu đồ sẽ có các nút chưa được khám phá, vì vậy bạn sẽ cần phải theo dõi đường dẫn bằng cách sử dụng một số cấu trúc khác. Một tìm kiếm đầu tiên chiều rộng có thể thích hợp nếu chúng ta mong đợi chức năng được chạy với những người trong cùng một "khu phố" của bạn bè và thực sự quan tâm đến hiệu suất.
Một đặc tính hay khác của DFS là nó có thể được song song. Khi gặp phải một nút mới, người ta có thể tạo ra các quy trình/chủ đề DFS mới/bất cứ thứ gì để xử lý các nút con. Các chủ đề mới phải có khả năng chia sẻ thông tin đánh dấu thông qua một số loại hệ thống nhắn tin. Điều này có thể là một chút tối ưu hóa sớm bây giờ mà tôi nghĩ về nó một số chi tiết. Dưới đây là một paper về đề tài này trong trường hợp bất cứ ai đang quan tâm đến
Cho Người một lĩnh vực machineID không phải là thực sự tốt đẹp. Điều này giả định một người không thể được đặt trên nhiều máy và nó cũng trộn mã "phân phối" với mã "người" – Ivan
@Ivan: Như tôi đã nói, có thể có rất nhiều tối ưu hóa khác nhau được thực hiện để phân phối người dùng. Tôi vừa đưa ra một giải pháp khả thi có thể tốt cho một câu hỏi phỏng vấn. –
Tôi nghĩ đây là một giải pháp tốt cho một cuộc phỏng vấn. Ít nhất nó tấn công vấn đề theo đúng hướng. – user450090