Advertisement
999ms

Untitled

Jul 19th, 2020
1,364
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.91 KB | None | 0 0
  1. class BinaryTrie:
  2.     def __init__(self):
  3.         self.nodes = [0 for _ in range(64)]
  4.         self.empty_nodes = [63 - i for i in range(63)]
  5.         self.MASK = (1 << 31) - 1
  6.  
  7.  
  8.  
  9.     def __sizeof__(self):
  10.         return self.nodes.__sizeof__() + self.empty_nodes.__sizeof__() + self.MASK.__sizeof__()
  11.  
  12.     def get_left(self, value):
  13.         return (value >> 1) & self.MASK
  14.  
  15.     @staticmethod
  16.     def get_right(value):
  17.         return value >> 32
  18.  
  19.     @staticmethod
  20.     def get_type(value):
  21.         return value & 1
  22.  
  23.     def _create_node(self):
  24.         if len(self.empty_nodes) == 0:
  25.             self.empty_nodes = [2 * len(self.nodes) - 1 - i for i in range(len(self.nodes))]
  26.             self.nodes += [0 for _ in range(len(self.nodes))]
  27.         index = self.empty_nodes.pop()
  28.         return index
  29.  
  30.     def _remove_nodes(self, node):
  31.         if node == 0:
  32.             return
  33.         self.empty_nodes.append(node)
  34.  
  35.         left_node = self.get_left(self.nodes[node])
  36.         self._remove_nodes(left_node)
  37.  
  38.         right_node = self.get_right(self.nodes[node])
  39.         self._remove_nodes(right_node)
  40.  
  41.         self.nodes[node] = 0
  42.  
  43.     def add_address(self, value, size):
  44.         current_node = 0
  45.         for i in range(size):
  46.             bit = 31 - i
  47.             if self.get_type(self.nodes[current_node]) == 1:
  48.                 return
  49.             if (value >> bit) & 1 == 0:
  50.                 current_left = self.get_left(self.nodes[current_node])
  51.                 if current_left == 0:
  52.                     current_left = self._create_node()
  53.                     self.nodes[current_node] |= current_left << 1
  54.                 current_node = current_left
  55.             else:
  56.                 current_right = self.get_right(self.nodes[current_node])
  57.                 if current_right == 0:
  58.                     current_right = self._create_node()
  59.                     self.nodes[current_node] |= current_right << 32
  60.                 current_node = current_right
  61.  
  62.         current_left = self.get_left(self.nodes[current_node])
  63.         current_right = self.get_right(self.nodes[current_node])
  64.  
  65.         self._remove_nodes(current_left)
  66.         self._remove_nodes(current_right)
  67.  
  68.         self.nodes[current_node] = 1
  69.  
  70.     def __contains__(self, value, size):
  71.         current_node = 0
  72.         for i in range(size):
  73.             bit = 31 - i
  74.             if self.get_type(self.nodes[current_node]) == 1:
  75.                 return True
  76.             if (value >> bit) & 1 == 0:
  77.                 current_left = self.get_left(self.nodes[current_node])
  78.                 if current_left == 0:
  79.                     return False
  80.                 current_node = current_left
  81.             else:
  82.                 current_right = self.get_right(self.nodes[current_node])
  83.                 if current_right == 0:
  84.                     return False
  85.                 current_node = current_right
  86.         return self.get_type(self.nodes[current_node]) == 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement