Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.32 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. class Node:
  10.     def __init__(self, key, value):
  11.         self.key = key
  12.         self.value = value
  13.         self.left = None  
  14.         self.right = None
  15.         self.level = None
  16.         self.height= 0
  17.  
  18.     def __str__(self):
  19.         return str(self.value)
  20.  
  21. class AVLSet:
  22.     def __init__(self):
  23.         self.avltree = AVLTree()
  24.         self.present = object()  
  25.  
  26.     def add(self, value):
  27.         self.avltree[value] = self.present
  28.  
  29.     def __contains__(self, value):
  30.         try:
  31.             _ = self.avltree[value]
  32.             return True
  33.         except KeyError:
  34.             return False
  35.  
  36.     def __str__(self):
  37.         return self.printset(self.avltree.root)
  38.    
  39.     def printset(self, node):
  40.         s=""
  41.         if node is None:
  42.             return ""
  43.         s=s+self.printset(node.left)
  44.         s=s+str(node.key)+" "
  45.         s=s+self.printset(node.right)
  46.         return s
  47.    
  48.     def amount(self):
  49.         return self.avltree.size
  50.    
  51. class AVLTree:
  52.     def __init__(self):
  53.         self.root = None
  54.         self.size=0
  55.  
  56.     def __setitem__(self, key, value):  
  57.         if self.root == None:
  58.             self.root = Node(key, value)
  59.             self.size+=1
  60.         else:
  61.             current = self.root
  62.             while True:
  63.                 if key < current.key:
  64.                     if current.left:
  65.                         current = current.left
  66.                     else:
  67.                         current.left = Node(key, value)
  68.                         self.size+=1
  69.                         break
  70.                 elif key > current.key:
  71.                     if current.right:
  72.                         current = current.right
  73.                     else:
  74.                         current.right = Node(key, value)
  75.                         self.size+=1
  76.                         break
  77.                 else:
  78.                     break
  79.         self.root=self.rebalance(key, self.root)
  80.        
  81.        
  82.     def __getitem__(self, key):
  83.         current=self.root
  84.         while True:
  85.             if key < current.key:
  86.                 current = current.left
  87.             elif key > current.key:
  88.                 current = current.right
  89.             else:
  90.                 return current.value
  91.  
  92.  
  93.     def rebalance(self, key, current):
  94.         if key > current.key:
  95.             current.right.height+=1
  96.             current.right=self.rebalance(key, current.right)
  97.         elif key < current.key:
  98.             current.left.height+=1
  99.             current.left=self.rebalance(key, current.left)
  100.         if (self.balance(current)==-2 and self.balance(current.left)==-1):
  101.             current=self.right_rotation(current)
  102.         elif (self.balance(current)==-2 and self.balance(current.left)==1):
  103.             current.left=self.left_rotation(current.left)
  104.             current=self.right_rotation(current)
  105.         elif (self.balance(current)==2 and self.balance(current.right)==1):
  106.             current=self.left_rotation(current)
  107.         elif (self.balance(current)==2 and self.balance(current.right)==-1):
  108.             current.right=self.right_rotation(current.right)
  109.             current=self.left_rotation(current)
  110.         return current
  111.  
  112.    
  113.     def balance(self, node):
  114.         if node is None:
  115.             return 0
  116.         elif node.right is None and node.left is None:
  117.             return 0
  118.         elif node.right is None:
  119.             return -1 - node.left.height
  120.         elif node.left is None:
  121.             return node.right.height+1
  122.         else: return node.right.height - node.left.height
  123.    
  124.     def left_rotation(self, node):
  125.         A=Node(node.key, node.value)
  126.         A.left=node.left
  127.         if node.right is not None:
  128.             A.right=node.right.left
  129.             node=node.right
  130.             node.left=A
  131.         return node
  132.        
  133.        
  134.     def right_rotation(self, node):
  135.         A=Node(node.key, node.value)
  136.         A.right=node.right
  137.         if node.left is not None:
  138.             A.left=node.left.right
  139.             node=node.left
  140.             node.right=A
  141.         return node
  142.        
  143.          
  144.        
  145.     def __contains__(self, key):
  146.         current=self.root
  147.         while True:
  148.             if current==None:
  149.                 return False
  150.             elif key < current.key:
  151.                 current = current.left
  152.             elif key > current.key:
  153.                 current = current.right
  154.             else:
  155.                 return True
  156.        
  157.  
  158.        
  159. class Inverted_Index:
  160.     def __init__(self, tree):
  161.         self.tree=tree
  162.    
  163.     def index_document(self, document, document_id):
  164.         s=document.split()
  165.         for k in s:
  166.             avlset=AVLSet()
  167.             if k in self.tree:
  168.                 self.tree[k].add(document_id)
  169.             else:
  170.                 avlset.add(document_id)
  171.                 self.tree[k] = avlset
  172.            
  173.     def search(self, word):
  174.         if word in self.tree:
  175.             return self.tree[word]
  176.         else: return -1
  177.        
  178.     def get_average_main(self):
  179.         return int(round(self.get_average(self.tree.root)/self.tree.size))
  180.        
  181.     def get_average(self, node):
  182.         c=0
  183.         if node is None:
  184.             return 0
  185.         c=c+self.get_average(node.left)
  186.         c=c+node.value.amount()
  187.         c=c+self.get_average(node.right)
  188.         return c
  189.  
  190.     def print_keys_main(self):
  191.         return self.print_keys(self.tree.root)
  192.        
  193.     def print_keys(self, node):
  194.         s=""
  195.         if node is None:
  196.             return ""
  197.         s=s+self.print_keys(node.left)
  198.         s=s+str(node.key)+" "
  199.         s=s+self.print_keys(node.right)
  200.         return s
  201.    
  202. if __name__ == '__main__':
  203.     num_documents = int(input().strip())
  204.     tree1=AVLTree()
  205.     ii = Inverted_Index(tree1)
  206.     for i in range(num_documents):
  207.         documents_item = input()
  208.         ii.index_document(documents_item, i)
  209.  
  210.     num_queries = int(input().strip())
  211.  
  212.  
  213.     for _ in range(num_queries):
  214.         queries_item = input()
  215.         print(ii.search(queries_item))
  216.        
  217.     print(ii.get_average_main())
  218.  
  219.     try:
  220.         print_keys_flag = input()
  221.         should_print_keys = print_keys_flag == 'print_keys'
  222.     except:
  223.         should_print_keys = False
  224.        
  225.     if should_print_keys:
  226.         print(ii.print_keys_main())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement