Advertisement
Guest User

Untitled

a guest
Nov 9th, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.23 KB | None | 0 0
  1. from time import perf_counter as clock
  2.  
  3. t0 = clock()
  4.  
  5. class Node:
  6. """Class to define BST Node"""
  7. def __init__(self, unx_time, ip_adrs):
  8. """Assign values and 2 children"""
  9. self.time = unx_time
  10. self.adrs = ip_adrs
  11. self.left = None
  12. self.right = None
  13.  
  14. def __repr__(self):
  15. """Function to Enable Printing Node"""
  16. return str(self.time) + " " + self.adrs
  17.  
  18.  
  19. class BST:
  20. """Function to define binary tree"""
  21. def __init__(self):
  22. """Define Root Node"""
  23. self.root = None
  24.  
  25. def __repr__(self):
  26. """Function to Print Tree as Sorted List"""
  27. self.sorted = []
  28. self.get_inorder(self.root)
  29. return str(self.sorted)
  30.  
  31. def get_inorder(self, node):
  32. """Helper Function for __repr__"""
  33. if node:
  34. self.get_inorder(node.left)
  35. self.sorted.append(str(node.time) + " " + str(node.adrs))
  36. self.get_inorder(node.right)
  37.  
  38. def add(self, time, adrs):
  39. """Tree Builder Function"""
  40. if not self.root:
  41. self.root = Node(time, adrs)
  42. else:
  43. self._add(self.root, time, adrs)
  44.  
  45. def _add(self, node, time, adrs):
  46. """Helper for Tree Builder Function"""
  47. if time <= node.time:
  48. if node.left:
  49. self._add(node.left, time, adrs)
  50. else:
  51. node.left = Node(time, adrs)
  52. else:
  53. if node.right:
  54. self._add(node.right, time, adrs)
  55. else:
  56. node.right = Node(time, adrs)
  57.  
  58. def lookup_LTE(self, node, time, prev_ans):
  59. """Function to Execute LTE Query"""
  60. if node == None:
  61. #print(prev_ans)
  62. f.write(prev_ans + "\n")
  63. return
  64. elif time == node.time:
  65. #print(node.adrs)
  66. f.write(node.adrs + "\n")
  67. return
  68. elif time < node.time:
  69. self.lookup_LTE(node.left, time, prev_ans)
  70. else:
  71. prev_ans = node.adrs
  72. self.lookup_LTE(node.right, time, prev_ans)
  73.  
  74.  
  75. def lookup_GTE(self, node, time, prev_ans):
  76. """Function to Execute GTE Query"""
  77. if node == None:
  78. #print(prev_ans)
  79. f.write(prev_ans + "\n")
  80. return
  81. elif time == node.time:
  82. #print(node.adrs)
  83. f.write(node.adrs + "\n")
  84. return
  85. elif time < node.time:
  86. prev_ans = node.adrs
  87. self.lookup_GTE(node.left, time, prev_ans)
  88. else:
  89. self.lookup_GTE(node.right, time, prev_ans)
  90.  
  91. def _BTW(self, node, time, prev_time, prev_ans):
  92. """Helper Function for BTW Query"""
  93. if node == None:
  94. return prev_time, prev_ans
  95.  
  96. if time == node.time:
  97. prev_time, prev_ans = node.time, node.adrs
  98. elif time < node.time:
  99. prev_ans = node.adrs
  100. prev_time = node.time
  101. prev_time, prev_ans = self._BTW(node.left, time,
  102. prev_time, prev_ans)
  103. else:
  104. prev_time, prev_ans = self._BTW(node.right, time,
  105. prev_time, prev_ans)
  106. return prev_time, prev_ans
  107.  
  108. def lookup_BTW(self, time1, time2, prev_arr):
  109. """Function for BTW Query"""
  110. time, adrs = self._BTW(bst.root, time1, time1, "")
  111. if time > time2:
  112. f.write("\n")
  113. else:
  114. for rec in log:
  115. tim = rec[0]
  116. if tim < time1 : continue
  117. if tim > time2 : break
  118. prev_arr.append(rec[1])
  119.  
  120. f.write(" ".join(prev_arr) + "\n")
  121.  
  122.  
  123.  
  124.  
  125.  
  126. # Input Data
  127. log_file = '2019-Nov-Wed-1572989950_log.txt'
  128. query_file = '2019-Nov-Wed-1572989950_queries.txt'
  129.  
  130. # Read log file and sort on time
  131. log = []
  132. with open(log_file, 'r') as infile:
  133. for rec in infile:
  134. rec1 = rec.strip().split()
  135. rec1[0] = int(rec1[0])
  136. log.append(rec1)
  137.  
  138. log.sort(key=lambda x: int(x[0]))
  139.  
  140. # Read queries file
  141. queries = []
  142. with open(query_file, 'r') as infile1:
  143. for rec in infile1:
  144. queries.append(rec.strip().split())
  145.  
  146.  
  147. # Build Tree
  148. bst = BST()
  149. for rec in log:
  150. bst.add(rec[0], rec[1])
  151.  
  152. # Build Balanced Tree
  153. bst = BST()
  154. def BalancedBST(arr):
  155. if not arr : return
  156. mid = len(arr) // 2
  157. rec = arr[mid]
  158. bst.add(int(rec[0]), rec[1])
  159. BalancedBST(arr[:mid])
  160. BalancedBST(arr[mid+1:])
  161.  
  162. BalancedBST(log)
  163.  
  164. assert len(str(bst).strip().split(", ")) == len(log) #Ensure all ok
  165.  
  166. # Raise Queries
  167. f = open("solution.txt", "w")
  168. for query in queries:
  169. #print(query)
  170. if query[0] == "LTE":
  171. bst.lookup_LTE(bst.root, int(query[1]), "\n")
  172. elif query[0] == "GTE":
  173. bst.lookup_GTE(bst.root, int(query[1]), "\n")
  174. elif query[0] == "BTW":
  175. time1, time2 = int(query[1]), int(query[2])
  176. if time1 > time2:
  177. time1, time2 = time2, time1
  178. bst.lookup_BTW(time1, time2, [])
  179. else:
  180. f.write("Unknown command: " + query[0] + "\n")
  181. f.close()
  182.  
  183. print("Time required: %.5f" % (clock()-t0))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement