Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.28 KB | None | 0 0
  1. #!/bin/python3
  2.  
  3. import math
  4. import os
  5. import random
  6. import re
  7. import sys
  8.  
  9. sys.setrecursionlimit(1000)
  10. class Node:
  11.     def __init__(self, key, value):
  12.         self.key = key
  13.         self.val = value
  14.         self.left = None
  15.         self.right = None
  16.         self.height = 0
  17.  
  18. class AVL:
  19.  
  20.     def __init__(self):
  21.         self.root = None
  22.         self.size = 0
  23.  
  24.     def insert(self, root, key, value):
  25.      
  26.         if not root:
  27.             self.size+=1
  28.             return Node(key, value)
  29.         elif key < root.key:
  30.             root.left = self.insert(root.left, key, value)
  31.         elif key > root.key:
  32.             root.right = self.insert(root.right, key, value)
  33.         elif key == root.key and hasattr(root.val, "append"):
  34.             root.val.append(value)
  35.  
  36.         root.height = 1 + max(self.getHeight(root.left),
  37.                            self.getHeight(root.right))
  38.  
  39.         balance = self.getBalance(root)
  40.  
  41.         if balance > 1:
  42.             if key > root.left.key:
  43.                 root.left = self.leftRotate(root.left)
  44.                 return self.rightRotate(root)
  45.             elif key < root.left.key:
  46.                 return self.rightRotate(root)
  47.         elif balance < -1:
  48.             if key > root.right.key:
  49.                 return self.leftRotate(root)
  50.             elif key < root.right.key:
  51.                 root.right = self.rightRotate(root.right)
  52.                 return self.leftRotate(root)
  53.  
  54.         return root
  55.  
  56.     def leftRotate(self, z):
  57.  
  58.         y = z.right
  59.         T2 = y.left
  60.         y.left = z
  61.         z.right = T2
  62.         z.height = 1 + max(self.getHeight(z.left),
  63.                          self.getHeight(z.right))
  64.         y.height = 1 + max(self.getHeight(y.left),
  65.                          self.getHeight(y.right))
  66.         return y
  67.  
  68.     def rightRotate(self, z):
  69.  
  70.         y = z.left
  71.         T3 = y.right
  72.  
  73.         y.right = z
  74.         z.left = T3
  75.         z.height = 1 + max(self.getHeight(z.left),
  76.                         self.getHeight(z.right))
  77.         y.height = 1 + max(self.getHeight(y.left),
  78.                         self.getHeight(y.right))
  79.         return y
  80.  
  81.     def hint_all_keys(self, node):
  82.         if node is not None:
  83.             self.hint_all_keys(node.left)
  84.             print(node.value, end=" ")
  85.             self.hint_all_keys(node.right)
  86.  
  87.     def get_all_keys(self, node):
  88.         self.arr = []
  89.         self.het_all_keys(node, self.arr)
  90.         return self.arr
  91.  
  92.     def het_all_keys(self, node, arr):
  93.         if node.left is not None:
  94.             self.het_all_keys(node.left, arr)
  95.         arr.append(node.value)
  96.         if node.right is not None:
  97.             self.het_all_keys(node.right, arr)
  98.  
  99.     def get_all_keyvalues(self, node):
  100.         self.arr = []
  101.         self.het_all_keyvalues(node, self.arr)
  102.         return self.arr
  103.  
  104.     def het_all_keyvalues(self, node, arr):
  105.         if node.left is not None:
  106.             self.het_all_keyvalues(node.left, arr)
  107.         arr.append(node)
  108.         if node.right is not None:
  109.             self.het_all_keyvalues(node.right, arr)
  110.            
  111.     def getHeight(self, root):
  112.         if not root:
  113.             return 0
  114.         return root.height
  115.  
  116.     def getBalance(self, root):
  117.         if not root:
  118.             return 0
  119.         return self.getHeight(root.left) - self.getHeight(root.right)
  120.  
  121.        
  122.     def search(self, value):
  123.         node = self.root
  124.  
  125.         while True:
  126.             if node.key > value:
  127.                 if node.left is not None:
  128.                     node = node.left
  129.                 else:
  130.                     return -1
  131.             elif node.key < value:
  132.                 if node.right is not None:
  133.                     node = node.right
  134.                 else:
  135.                     return -1
  136.             elif node.key == value:
  137.                 return node.val
  138.            
  139.  
  140.     def get_all_keyvalues(self, node):
  141.         if node is None:
  142.             return
  143.         yield from self.get_all_keyvalues(node.left)
  144.         yield node
  145.         yield from self.get_all_keyvalues(node.right)
  146.  
  147.     def singleRightRotate(self, node):
  148.         l = node.left
  149.         node.left = l.right
  150.         l.right = node
  151.         node.height = max(self.height(node.left), self.height(node.right)) + 1
  152.         l.height = max(self.height(l.left), node.height) + 1
  153.         return l
  154.  
  155.     def singleLeftRotate(self, node):
  156.         r = node.right
  157.         node.right = r.left
  158.         r.left = node
  159.         node.height = max(self.height(node.left), self.height(node.right))
  160.         r.height = max(self.height(r.right), node.height + 1)
  161.         return r
  162.  
  163.     def doubleLeftRotate(self, node):
  164.         node.left = self.singleRightRotate(node.left)
  165.         return self.singleLeftRotate(node)
  166.  
  167.     def doubleRightRotate(self, node):
  168.         node.left = self.singleLeftRotate(node.left)
  169.         return self.singleRightRotate(node)
  170.  
  171.     def set(self, key, value):
  172.         self.root = self.insert(self.root, key, value)
  173.  
  174.     def get(self, value):
  175.         return self.search(value)
  176.  
  177.     def get_keys(self):
  178.         for node in self.get_all_keyvalues(self.root):
  179.             yield node.key
  180.  
  181.  
  182. class Set:
  183.     def __init__(self, value):
  184.         self.tree = AVL()
  185.         self.tree.set(value, "present")
  186.    
  187.     def append(self, hash_set):
  188.         key = hash_set.get_first()
  189.         self.tree.set(key, "present")
  190.  
  191.     def get_all_values(self):
  192.         string = ""
  193.         for key in self.tree.get_keys():
  194.             string += str(key) + " "
  195.         return string
  196.  
  197.     def get_first(self):
  198.         return self.tree.root.key
  199.    
  200.     def count(self):
  201.         return self.tree.size
  202.  
  203.  
  204. class InvertedIndex:
  205.     def __init__(self):
  206.         self.tree = AVL()
  207.  
  208.     def index_document(self, document, document_id):
  209.         words = document.split(" ")
  210.         for word in words:
  211.            # print(self.tree.root)
  212.             self.tree.set(word, Set(document_id))
  213.            
  214.     def get_average(self):
  215.         sum = 0
  216.         count = 0
  217.         arr = []
  218.         for node in self.tree.get_all_keyvalues(self.tree.root):
  219.             sum += node.val.count()
  220.             count += 1
  221.             arr.append(node.key)
  222.         return arr, int(round(sum/count, 0))
  223.  
  224.     def search(self, word):
  225.         node = self.tree.get(word)
  226.         if node != -1:
  227.             node = node.get_all_values()
  228.         return node
  229.    
  230.  
  231.  
  232.  
  233. if __name__ == '__main__':
  234.     num_documents = int(input().strip())
  235.  
  236.     documents = []
  237.  
  238.     for _ in range(num_documents):
  239.         documents_item = input()
  240.         documents.append(documents_item)
  241.  
  242.     num_queries = int(input().strip())
  243.  
  244.     queries = []
  245.  
  246.     for _ in range(num_queries):
  247.         queries_item = input()
  248.         queries.append(queries_item)
  249.  
  250.     index = InvertedIndex()
  251.     try:
  252.         for i in range(num_documents):
  253.             index.index_document(documents[i], i)
  254.     except Exception:
  255.         pass
  256.     for word in queries:
  257.         print(index.search(word))
  258.     aver = index.get_average()
  259.     print(aver[1])
  260.  
  261.     try:
  262.         print_keys_flag = input()
  263.         should_print_keys = print_keys_flag == 'print_keys'
  264.     except:
  265.         should_print_keys = False
  266.  
  267.     if should_print_keys:
  268.         for word in aver[0]:
  269.             print(word, end=" ")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement