Advertisement
Guest User

Untitled

a guest
Mar 1st, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. class RegionTree:
  2. def __init__(self, left, right):
  3. self.left = left
  4. self.right = right
  5. self.child_regions = []
  6. self.values = []
  7. def add_item(self, range_obj, value):
  8. if self.left == range_obj.start and self.right == range_obj.stop:
  9. self.values.append(value)
  10. else:
  11. middle = int((self.left + self.right) / 2)
  12. if not self.child_regions:
  13. self.child_regions = [RegionTree(self.left, middle), RegionTree(middle, self.right)]
  14. if range_obj.stop <= middle:
  15. #exists only in left region
  16. self.child_regions[0].add_item(range_obj, value)
  17. elif range_obj.start >= middle:
  18. #exists only in right region
  19. self.child_regions[1].add_item(range_obj, value)
  20. else:
  21. #exists in both regions
  22. left_range = range(range_obj.start, middle)
  23. right_range = range(middle, range_obj.stop)
  24. self.child_regions[0].add_item(left_range, value)
  25. self.child_regions[1].add_item(right_range, value)
  26. def in_range(self, key):
  27. return self.left <= key < self.right
  28. def get_items(self, key):
  29. assert self.in_range(key)
  30. for val in self.values:
  31. yield val
  32. for child_region in self.child_regions:
  33. if child_region.in_range(key):
  34. yield from child_region.get_items(key)
  35. def get_first_item(self, key):
  36. return next(self.get_items(key))
  37.  
  38. x = RegionTree(-500, 500)
  39. x.add_item(range(0,6), 0)
  40. x.add_item(range(6, 10), 1)
  41. print(x.get_first_item(0))
  42. print(x.get_first_item(6))
  43. print(x.get_first_item(9))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement