Advertisement
Guest User

Untitled

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