Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.34 KB | None | 0 0
  1. #!/bin/python3
  2.  
  3. import math
  4. import os
  5. import random
  6. import re
  7. import resource
  8. import sys
  9.  
  10. class Set:
  11.     def __init__(self):
  12.         self.arr = []
  13.         self.size = 0
  14.        
  15.     def add(self, value):
  16.         if value not in self.arr:
  17.             self.arr.append(value)
  18.             self.size+=1
  19.            
  20.     def output(self):
  21.         for i in self.arr:
  22.             print(i,end=" ")
  23.         print(" ")
  24.  
  25. class Tree:
  26.     class Node:
  27.         def __init__(self, key, value):
  28.             self.key = key
  29.             self.value = Set()
  30.             self.left = None
  31.             self.right = None
  32.             self.height = 1
  33.             self.value.add(value)
  34.  
  35.     def __init__(self):
  36.         self.root = None
  37.         self.size = 0
  38.  
  39.     @staticmethod
  40.     def get_height(current):
  41.         if current is None:
  42.             return 0
  43.         return current.height
  44.  
  45.     def get_difference(self, current):
  46.         if current is None:
  47.             return 0
  48.         return self.get_height(current.left) - self.get_height(current.right)
  49.  
  50.     def get(self, key):
  51.         current = self.root
  52.         while current is not None:
  53.             if key < current.key:
  54.                 current = current.left
  55.             elif key > current.key:
  56.                 current = current.right
  57.             else:
  58.                 return current
  59.         return None
  60.  
  61.     def balance(self, current, key):
  62.         difference = self.get_difference(current)
  63.         if difference > 1 and key < current.left.key:
  64.             return self.right_rotation(current)
  65.         elif difference < -1 and key > current.right.key:
  66.             return self.left_rotation(current)
  67.         elif difference > 1 and key > current.left.key:
  68.             current.left = self.left_rotation(current.left)
  69.             return self.right_rotation(current)
  70.         elif difference < -1 and key < current.right.key:
  71.             current.right = self.right_rotation(current.right)
  72.             return self.left_rotation(current)
  73.         return current
  74.    
  75.     def put(self, key, value):
  76.         self.root = self.__put(self.root, key, value)
  77.  
  78.     def __put(self, current, key, value):
  79.         if current is None:
  80.             self.size += 1
  81.             return Tree.Node(key, value)
  82.  
  83.         if key < current.key:
  84.             current.left = self.__put(current.left, key, value)
  85.         elif key > current.key:
  86.             current.right = self.__put(current.right, key, value)
  87.         else:
  88.             current.value.add(value)
  89.  
  90.         current.height = 1 + max(self.get_height(current.left), self.get_height(current.right))
  91.         return self.balance(current, key)
  92.  
  93.     def right_rotation(self, node):
  94.         change = node.left
  95.         tree = change.right
  96.  
  97.         change.right = node
  98.         node.left = tree
  99.  
  100.         node.height = max(self.get_height(node.left), self.get_height(node.right)) + 1
  101.         change.height = max(self.get_height(change.left), self.get_height(change.right)) + 1
  102.         return change
  103.    
  104.     def left_rotation(self, node):
  105.         change = node.right
  106.         tree = change.left
  107.  
  108.         change.left = node
  109.         node.right = tree
  110.  
  111.         node.height = max(self.get_height(node.left), self.get_height(node.right)) + 1
  112.         change.height = max(self.get_height(change.left), self.get_height(change.right)) + 1
  113.         return change
  114.                    
  115.     def _get_all_elements(self, current):
  116.         if current is None:
  117.             return 0
  118.         return current.value.size + self._get_all_elements(current.left) + self._get_all_elements(current.right)
  119.    
  120.     def get_all_elements(self):
  121.         return self._get_all_elements(self.root)
  122.    
  123.     def print_increase(self, current):
  124.         if current is not None:
  125.             self.print_increase(current.left)
  126.             print(current.key, end=" ")
  127.             self.print_increase(current.right)
  128.  
  129.  
  130. class InvertedIndex:
  131.     def __init__(self):
  132.         self.docs = Tree()
  133.        
  134.     def index_document(self, document, document_id):
  135.         words = document.split()
  136.         for element in words:
  137.             self.docs.put(element, document_id)
  138.  
  139.     def search(self, words):
  140.         element = self.docs.get(words)
  141.         if element is not None:
  142.             return element.value
  143.         element = Set()
  144.         element.add(-1)
  145.         return element
  146.    
  147.     def get_average_documents_per_key(self):
  148.         if self.docs.size == 0:
  149.             return 0
  150.         all_words = self.docs.get_all_elements()
  151.         return round(all_words / self.docs.size)
  152.    
  153.     def get_keys(self):
  154.         self.docs.print_increase(self.docs.root)
  155.  
  156.  
  157.        
  158. def main():
  159.     num_documents = int(input().strip())
  160.     a = InvertedIndex()
  161.  
  162.     for i in range(num_documents):
  163.         documents_item = input()
  164.         a.index_document(documents_item, i)
  165.  
  166.     num_queries = int(input().strip())
  167.     queries = []
  168.  
  169.  
  170.     for _ in range(num_queries):
  171.         queries_item = input()
  172.         queries.append(queries_item)
  173.    
  174.     try:
  175.         print_keys_flag = input()
  176.         is_printing = (print_keys_flag == 'print_keys')
  177.     except:
  178.         is_printing = False
  179.        
  180.     for word in queries:
  181.         positions = a.search(word)
  182.         positions.output()
  183.  
  184.     print(a.get_average_documents_per_key())
  185.    
  186.     if is_printing:
  187.         a.get_keys()
  188.  
  189.  
  190. if __name__ == "__main__":
  191.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement