From 4a88a179238b233ee4f58a190997db3f9dbc8877 Mon Sep 17 00:00:00 2001 From: Lam Tran Date: Sat, 14 Jun 2025 11:53:22 +0700 Subject: [PATCH] changes to the code --- .../social_graph/social_graph_snippets.py | 89 +++++++++---------- 1 file changed, 42 insertions(+), 47 deletions(-) diff --git a/solutions/system_design/social_graph/social_graph_snippets.py b/solutions/system_design/social_graph/social_graph_snippets.py index f0ea4c4b..35029012 100644 --- a/solutions/system_design/social_graph/social_graph_snippets.py +++ b/solutions/system_design/social_graph/social_graph_snippets.py @@ -1,72 +1,67 @@ -# -*- coding: utf-8 -*- from collections import deque from enum import Enum -class State(Enum): - unvisited = 0 - visited = 1 - - -class Graph(object): - - def bfs(self, source, dest): - if source is None: - return False - queue = deque() - queue.append(source) - source.visit_state = State.visited - while queue: - node = queue.popleft() - print(node) - if dest is node: - return True - for adjacent_node in node.adj_nodes.values(): - if adjacent_node.visit_state == State.unvisited: - queue.append(adjacent_node) - adjacent_node.visit_state = State.visited - return False - - -class Person(object): - +class Person: def __init__(self, id, name): self.id = id self.name = name self.friend_ids = [] + def __repr__(self): + return f"Person({self.id}, {self.name})" -class LookupService(object): +class LookupService: def __init__(self): - self.lookup = {} # key: person_id, value: person_server + self.lookup = {} # key: person_id, value: PersonServer def get_person(self, person_id): - person_server = self.lookup[person_id] - return person_server.people[person_id] + person_server = self.lookup.get(person_id) + if person_server: + return person_server.people.get(person_id) + return None -class PersonServer(object): - +class PersonServer: def __init__(self): - self.people = {} # key: person_id, value: person + self.people = {} # key: person_id, value: Person def get_people(self, ids): - results = [] - for id in ids: - if id in self.people: - results.append(self.people[id]) - return results + return [self.people[id] for id in ids if id in self.people] -class UserGraphService(object): - - def __init__(self, person_ids, lookup): +class UserGraphService: + def __init__(self, person_ids, lookup: LookupService): self.lookup = lookup self.person_ids = person_ids self.visited_ids = set() - def bfs(self, source, dest): - # Use self.visited_ids to track visited nodes - # Use self.lookup to translate a person_id to a Person - pass + def bfs(self, source_id, dest_id): + source = self.lookup.get_person(source_id) + dest = self.lookup.get_person(dest_id) + + if source is None or dest is None: + return False + + queue = deque() + queue.append(source) + self.visited_ids.add(source.id) + + while queue: + current_person = queue.popleft() + print(current_person) + + if current_person.id == dest.id: + return True + + # Get actual Person objects for friends + for friend_id in current_person.friend_ids: + if friend_id not in self.visited_ids: + friend = self.lookup.get_person(friend_id) + if friend: + queue.append(friend) + self.visited_ids.add(friend.id) + + return False +