mirror of
				https://github.com/donnemartin/system-design-primer.git
				synced 2025-11-04 10:12:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# -*- 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):
 | 
						|
 | 
						|
    def __init__(self, id, name):
 | 
						|
        self.id = id
 | 
						|
        self.name = name
 | 
						|
        self.friend_ids = []
 | 
						|
 | 
						|
 | 
						|
class LookupService(object):
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        self.lookup = {}  # key: person_id, value: person_server
 | 
						|
 | 
						|
    def get_person(self, person_id):
 | 
						|
        person_server = self.lookup[person_id]
 | 
						|
        return person_server.people[person_id]
 | 
						|
 | 
						|
 | 
						|
class PersonServer(object):
 | 
						|
 | 
						|
    def __init__(self):
 | 
						|
        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
 | 
						|
 | 
						|
 | 
						|
class UserGraphService(object):
 | 
						|
 | 
						|
    def __init__(self, person_ids, lookup):
 | 
						|
        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
 |