social_graph_snippets.py 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # -*- coding: utf-8 -*-
  2. class Graph(object):
  3. def bfs(self, source, dest):
  4. if source is None:
  5. return False
  6. queue = deque()
  7. queue.append(source)
  8. source.visit_state = State.visited
  9. while queue:
  10. node = queue.popleft()
  11. print(node)
  12. if dest is node:
  13. return True
  14. for adjacent_node in node.adj_nodes.values():
  15. if adjacent_node.visit_state == State.unvisited:
  16. queue.append(adjacent_node)
  17. adjacent_node.visit_state = State.visited
  18. return False
  19. class Person(object):
  20. def __init__(self, id, name):
  21. self.id = id
  22. self.name = name
  23. self.friend_ids = []
  24. class LookupService(object):
  25. def __init__(self):
  26. self.lookup = {} # key: person_id, value: person_server
  27. def get_person(self, person_id):
  28. person_server = self.lookup[person_id]
  29. return person_server.people[person_id]
  30. class PersonServer(object):
  31. def __init__(self):
  32. self.people = {} # key: person_id, value: person
  33. def get_people(self, ids):
  34. results = []
  35. for id in ids:
  36. if id in self.people:
  37. results.append(self.people[id])
  38. return results
  39. class UserGraphService(object):
  40. def __init__(self, person_ids, lookup):
  41. self.lookup = lookup
  42. self.person_ids = person_ids
  43. self.visited_ids = set()
  44. def bfs(self, source, dest):
  45. # Use self.visited_ids to track visited nodes
  46. # Use self.lookup to translate a person_id to a Person
  47. pass