Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.67 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 == 1:
  63.                 return self.Turn_left(root)
  64.             else:
  65.                 root.right = self.Turn_right(root.right)
  66.                 return self.Turn_left(root)  
  67.  
  68.         if balance == -2:
  69.             if Node.left == -1:
  70.                 return self.Turn_right(root)
  71.             else:
  72.                 root.left = self.Turn_left(root.left)
  73.                 return self.Turn_right(root)
  74.        
  75.         return Node
  76.        
  77.     def add_value_in_Set(self, key, DocID, Node):
  78.         if Node is not None:
  79.             if key < Node.key:
  80.                 Node.left = self.add_key(key, DocID, Node.left)
  81.             elif key > Node.key:
  82.                 Node.right = self.add_key(key, DocID, Node.right)
  83.             else:
  84.                 return Node
  85.         else:
  86.             self.how_much_nodes += 1
  87.             return Node_for_tree(key, DocID)
  88.        
  89.         Node.height = 1 + max(height(Node.left), height(Node.right))
  90.         balance = Node.balance()
  91.  
  92.         if balance == 2 and Node.right == 1:
  93.             return self.Turn_left(Node)
  94.  
  95.         if balance == 2 and Node.right == -1:
  96.             Node.right = self.Turn_right(root.right)
  97.             return self.Turn_left(Node)  
  98.  
  99.         if balance == -2 and Node.left == -1:
  100.             return self.Turn_right(Node)
  101.  
  102.         if balance == -2 and Node.left == 1:
  103.             Node.left = self.Turn_left(Node.left)
  104.             return self.Turn_right(Node)
  105.        
  106.         return Node
  107.    
  108.     def print_keys(self, Node):
  109.         if Node.left is not None:
  110.             self.print_keys(Node.left)
  111.         print(Node.key, end = ' ')
  112.         if Node.right != None:
  113.             self.print_keys(Node.right)
  114.  
  115. class Set:
  116.     def __init__(self, value):
  117.         self.Tree = AVL_Tree()
  118.         self.Tree.root = self.Tree.add_value_in_Set(value, 'Present', self.Tree.root)
  119.        
  120.     def append(self, value):
  121.         self.Tree.root = self.Tree.add_value_in_Set(value, 'Present', self.Tree.root)
  122.        
  123.     def get(self):
  124.         self.Tree.print_keys(self.Tree.root)
  125.         print('')
  126.    
  127. class Inverted_Index(AVL_Tree):
  128.    
  129.     def index_document(self, document, DocID):
  130.         for word in document:
  131.             self.root = self.add_key(word, DocID, self.root)
  132.    
  133.     def search(self, key):
  134.         Node = self.root
  135.         while Node is not None:
  136.             if key > Node.key:
  137.                     Node = Node.right
  138.             elif key < Node.key:
  139.                     Node = Node.left
  140.             else:
  141.                 Node.DocID.get()
  142.                 return
  143.         print(-1)
  144.    
  145.     def get_keys(self):
  146.         self.print_keys(self.root)
  147.    
  148.     def how_much_docs(self, Node):
  149.         amount_of_docs = 0
  150.         if Node.left != None:
  151.             amount_of_docs += self.how_much_docs(Node.left)
  152.         amount_of_docs += Node.DocID.Tree.how_much_nodes
  153.         if Node.right != None:
  154.             amount_of_docs += self.how_much_docs(Node.right)
  155.         return amount_of_docs
  156.    
  157.     def get_avarage_documents_per_key(self):
  158.         print(round(self.how_much_docs(self.root)/self.how_much_nodes))
  159.  
  160.  
  161. #Старт программы#
  162. if __name__ == '__main__':
  163.     num_documents = int(input())
  164.    
  165.     Inverted_Index = Inverted_Index()
  166.    
  167.     for i in range(num_documents):
  168.         document = list(map(str, input().split()))
  169.         Inverted_Index.index_document(document, i)
  170.  
  171.     num_queries = int(input())
  172.  
  173.     for i in range(num_queries):
  174.         queries_item = input()
  175.         Inverted_Index.search(queries_item)
  176.  
  177.     Inverted_Index.get_avarage_documents_per_key()
  178.  
  179.     try:
  180.         print_keys_flag = input()
  181.         should_print_keys = print_keys_flag == 'print_keys'
  182.     except:
  183.         should_print_keys = False
  184.    
  185.     if should_print_keys:
  186.         Inverted_Index.get_keys()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement