Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.85 KB | None | 0 0
  1. def height(Node_for_tree):
  2.     if Node_for_tree is not None:
  3.         return Node_for_tree.height
  4.     else:
  5.         return -1
  6.  
  7. class Node_for_tree:
  8.     def __init__(self, key, DocID):
  9.         self.key = key
  10.         self.height = 0
  11.         self.right = None
  12.         self.left = None
  13.         self.DocID = DocID
  14.    
  15.     def balance(self):
  16.         return height(self.right) - height(self.left)
  17.  
  18.  
  19. class AVL_Tree:
  20.     def __init__(self):
  21.         self.root = None
  22.         self.how_much_nodes = 0
  23.  
  24.     def Turn_left(self, Old_root):
  25.         New_root = Old_root.right
  26.         New_root_left = New_root.left
  27.         New_root.left = Old_root
  28.         Old_root.right = New_root_left
  29.        
  30.         Old_root.height = 1 + max(height(Old_root.left), height(Old_root.right))
  31.         New_root.height = 1 + max(height(New_root.left), height(New_root.right))
  32.         return New_root
  33.  
  34.     def Turn_right(self, Old_root):
  35.         New_root = Old_root.left
  36.         New_root_right = New_root.right
  37.         New_root.right = Old_root
  38.         Old_root.left = New_root_right
  39.        
  40.         Old_root.height = 1 + max(height(Old_root.left), height(Old_root.right))
  41.         New_root.height = 1 + max(height(New_root.left), height(New_root.right))
  42.         return New_root
  43.  
  44.    
  45.     def add_key(self, key, DocID, Node):
  46.         if Node is not None:
  47.             if key < Node.key:
  48.                 Node.left = self.add_key(key, DocID, Node.left)
  49.             elif key > Node.key:
  50.                 Node.right = self.add_key(key, DocID, Node.right)
  51.             else:
  52.                 Node.DocID.append(DocID)
  53.                 return Node
  54.         else:
  55.             self.how_much_nodes += 1
  56.             return Node_for_tree(key, Set(DocID))
  57.        
  58.         Node.height = 1 + max(height(Node.left), height(Node.right))
  59.         balance = Node.balance()
  60.  
  61.         if balance == 2:
  62.             if Node.right.balance() == 1:
  63.                 print('balance 2.1')
  64.                 return self.Turn_left(Node)
  65.             else:
  66.                 print('balance 2.2')
  67.                 Node.right = self.Turn_right(Node.right)
  68.                 return self.Turn_left(Node)  
  69.  
  70.         if balance == -2:
  71.             if Node.left.balance() == -1:
  72.                 print('balance -2.1')
  73.                 return self.Turn_right(Node)
  74.             else:
  75.                 print('balance -2.2')
  76.                 Node.left = self.Turn_left(Node.left)
  77.                 return self.Turn_right(Node)
  78.        
  79.         return Node
  80.        
  81.     def add_value_in_Set(self, key, DocID, Node):
  82.         if Node is not None:
  83.             if key < Node.key:
  84.                 Node.left = self.add_key(key, DocID, Node.left)
  85.             elif key > Node.key:
  86.                 Node.right = self.add_key(key, DocID, Node.right)
  87.             else:
  88.                 return Node
  89.         else:
  90.             self.how_much_nodes += 1
  91.             return Node_for_tree(key, DocID)
  92.        
  93.         Node.height = 1 + max(height(Node.left), height(Node.right))
  94.         balance = Node.balance()
  95.  
  96.         if balance == 2:
  97.             if Node.right.balance() == 1:
  98.                 return self.Turn_left(Node)
  99.             else:
  100.                 Node.right = self.Turn_right(Node.right)
  101.                 return self.Turn_left(Node)  
  102.  
  103.         if balance == -2:
  104.             if Node.left.balance() == -1:
  105.                 return self.Turn_right(Node)
  106.             else:
  107.                 Node.left = self.Turn_left(Node.left)
  108.                 return self.Turn_right(Node)
  109.        
  110.         return Node
  111.    
  112.     def print_keys(self, Node):
  113.         if Node.left is not None:
  114.             self.print_keys(Node.left)
  115.         print(Node.key, end = ' ')
  116.         if Node.right != None:
  117.             self.print_keys(Node.right)
  118.  
  119. class Set:
  120.     def __init__(self, value):
  121.         self.Tree = AVL_Tree()
  122.         self.Tree.root = self.Tree.add_value_in_Set(value, 'Present', self.Tree.root)
  123.        
  124.     def append(self, value):
  125.         self.Tree.root = self.Tree.add_value_in_Set(value, 'Present', self.Tree.root)
  126.        
  127.     def get(self):
  128.         self.Tree.print_keys(self.Tree.root)
  129.         print('')
  130.    
  131. class Inverted_Index(AVL_Tree):
  132.    
  133.     def index_document(self, document, DocID):
  134.         for word in document:
  135.             self.root = self.add_key(word, DocID, self.root)
  136.    
  137.     def search(self, key):
  138.         Node = self.root
  139.         while Node is not None:
  140.             if key > Node.key:
  141.                     Node = Node.right
  142.             elif key < Node.key:
  143.                     Node = Node.left
  144.             else:
  145.                 Node.DocID.get()
  146.                 return
  147.         print(-1)
  148.    
  149.     def get_keys(self):
  150.         self.print_keys(self.root)
  151.    
  152.     def how_much_docs(self, Node):
  153.         amount_of_docs = 0
  154.         if Node.left != None:
  155.             amount_of_docs += self.how_much_docs(Node.left)
  156.         amount_of_docs += Node.DocID.Tree.how_much_nodes
  157.         if Node.right != None:
  158.             amount_of_docs += self.how_much_docs(Node.right)
  159.         return amount_of_docs
  160.    
  161.     def get_avarage_documents_per_key(self):
  162.         print(round(self.how_much_docs(self.root)/self.how_much_nodes))
  163.  
  164.  
  165. #Старт программы#
  166. if __name__ == '__main__':
  167.     num_documents = int(input())
  168.    
  169.     Inverted_Index = Inverted_Index()
  170.    
  171.     for i in range(num_documents):
  172.         document = list(map(str, input().split()))
  173.         Inverted_Index.index_document(document, i)
  174.  
  175.     num_queries = int(input())
  176.  
  177.     for i in range(num_queries):
  178.         queries_item = input()
  179.         Inverted_Index.search(queries_item)
  180.  
  181.     Inverted_Index.get_avarage_documents_per_key()
  182.  
  183.     try:
  184.         print_keys_flag = input()
  185.         should_print_keys = print_keys_flag == 'print_keys'
  186.     except:
  187.         should_print_keys = False
  188.    
  189.     if should_print_keys:
  190.         Inverted_Index.get_keys()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement