Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.37 KB | None | 0 0
  1. import csv
  2. import time
  3.  
  4.  
  5. class NodeLista:
  6.     def __init__(self, data):
  7.         self.data = data
  8.         self.next = None
  9.  
  10.     def get_data(self):
  11.         return self.data
  12.  
  13.     def get_next(self):
  14.         return self.next
  15.  
  16.     def set_data(self, new_data):
  17.         self.data = new_data
  18.  
  19.     def set_next(self, new_next):
  20.         self.next = new_next
  21.  
  22.  
  23. class LinkedList:
  24.     def __init__(self):
  25.         self.head = None
  26.  
  27.     def is_empty(self):
  28.         return self.head == None
  29.  
  30.     def add(self, item):
  31.         temp = NodeLista(item)
  32.  
  33.         if self.is_empty():
  34.             self.head = temp
  35.             return
  36.         previous = self.head
  37.         next = self.head.next
  38.         while next is not None:
  39.             previous = next
  40.             next = next.next
  41.         previous.next = temp
  42.  
  43.     def search(self, item):
  44.         current = self.head
  45.         found = False
  46.         while current is not None and not found:
  47.             if current.get_data() == item:
  48.                 found = True
  49.             else:
  50.                 current = current.get_next()
  51.  
  52.  
  53.     def remove(self, item):
  54.         current = self.head
  55.         previous = None
  56.         found = False
  57.         while not found:
  58.  
  59.             if current.data[0] == item:
  60.                 found = True
  61.             else:
  62.                 previous = current
  63.                 current = current.get_next()
  64.                 if current.get_next() is None:
  65.                     found = True
  66.         if previous is None:
  67.             self.head = current.get_next()
  68.         else:
  69.             previous.set_next(current.get_next())
  70.  
  71.     def print(self,ano):
  72.         node = self.head
  73.  
  74.         while node:
  75.             if node.get_data():
  76.                 if ano == node.data[0]:
  77.                     print("(",str(ano),",",str(node.data[1]),")")
  78.                 elif int(ano) == 0:
  79.                     print(node.get_data())
  80.             node = node.next
  81.  
  82.  
  83. class Node:
  84.     def __init__(self, key, lista = None):
  85.         self.key = key
  86.         self.lista = LinkedList()
  87.         self.left = None
  88.         self.right = None
  89.  
  90.  
  91. class AVLTree:
  92.     def __init__(self, *args):
  93.         self.node = None
  94.         self.height = -1
  95.         self.balance = 0
  96.         if len(args) == 1:
  97.             for i in args[0]:
  98.                 self.insert(i)
  99.  
  100.     def height(self):
  101.         if self.node:
  102.             return self.node.height
  103.         else:
  104.             return 0
  105.  
  106.     def is_leaf(self):
  107.         return self.height == 0
  108.  
  109.     def insert(self, key, lista):
  110.         tree = self.node
  111.         newnode = Node(key,lista)
  112.         if tree is None:
  113.             self.node = newnode
  114.             self.node.lista = lista
  115.             self.node.left = AVLTree()
  116.             self.node.right = AVLTree()
  117.  
  118.         elif key < tree.key:
  119.             self.node.left.insert(key,lista)
  120.  
  121.         elif key > tree.key:
  122.             self.node.right.insert(key,lista)
  123.  
  124.         else:
  125.             self.rebalance()
  126.  
  127.     def rebalance(self):
  128.  
  129.         # key inserted. Let's check if we're balanced
  130.         self.update_heights(False)
  131.         self.update_balances(False)
  132.         while self.balance < -1 or self.balance > 1:
  133.             if self.balance > 1:
  134.                 if self.node.left.balance < 0:
  135.                     self.node.left.lrotate()  # we're in case II
  136.                     self.update_heights()
  137.                     self.update_balances()
  138.                 self.rrotate()
  139.                 self.update_heights()
  140.                 self.update_balances()
  141.  
  142.             if self.balance < -1:
  143.                 if self.node.right.balance > 0:
  144.                     self.node.right.rrotate()  # we're in case III
  145.                     self.update_heights()
  146.                     self.update_balances()
  147.                 self.lrotate()
  148.                 self.update_heights()
  149.                 self.update_balances()
  150.  
  151.     def rrotate(self):
  152.  
  153.         A = self.node
  154.         B = self.node.left.node
  155.         T = B.right.node
  156.  
  157.         self.node = B
  158.         B.right.node = A
  159.         A.left.node = T
  160.  
  161.     def lrotate(self):
  162.  
  163.         A = self.node
  164.         B = self.node.right.node
  165.         T = B.left.node
  166.  
  167.         self.node = B
  168.         B.left.node = A
  169.         A.right.node = T
  170.  
  171.     def update_heights(self, recurse=True):
  172.         if not self.node is None:
  173.             if recurse:
  174.                 if self.node.left is not None:
  175.                     self.node.left.update_heights()
  176.                 if self.node.right is not None:
  177.                     self.node.right.update_heights()
  178.  
  179.             self.height = max(self.node.left.height, self.node.right.height) + 1
  180.         else:
  181.             self.height = -1
  182.  
  183.     def update_balances(self, recurse=True):
  184.         if not self.node is None:
  185.             if recurse:
  186.                 if self.node.left is not None:
  187.                     self.node.left.update_balances()
  188.                 if self.node.right is not None:
  189.                     self.node.right.update_balances()
  190.  
  191.             self.balance = self.node.left.height - self.node.right.height
  192.         else:
  193.             self.balance = 0
  194.  
  195.     def delete(self, key):
  196.         if self.node is not None:
  197.             if self.node.key[1] == key or self.node.key[0] == key:
  198.                 if self.node.left.node is None and self.node.right.node is None:
  199.                     self.node = None
  200.                 elif self.node.left.node is None:
  201.                     self.node = self.node.right.node
  202.                 elif self.node.right.node is None:
  203.                     self.node = self.node.left.node
  204.                 else:
  205.                     replacement = self.logical_successor(self.node)
  206.                     if replacement is not None:
  207.                         self.node.key = replacement.key
  208.                         self.node.right.delete(replacement.key)
  209.                 self.rebalance()
  210.                 return
  211.             elif key < self.node.key[0] or key < self.node.key[1]:
  212.                 self.node.left.delete(key)
  213.             elif key > self.node.key[0] or key<self.node.key[1]:
  214.                 self.node.right.delete(key)
  215.             self.rebalance()
  216.         else:
  217.             return
  218.  
  219.     def logical_predecessor(self, node):
  220.         node = node.left.node
  221.         if node is not None:
  222.             while node.right is not None:
  223.                 if node.right.node is None:
  224.                     return node
  225.                 else:
  226.                     node = node.right.node
  227.         return node
  228.  
  229.     def logical_successor(self, node):
  230.         node = node.right.node
  231.         if node != None:  # just a sanity check
  232.  
  233.             while node.left != None:
  234.  
  235.                 if node.left.node == None:
  236.                     return node
  237.                 else:
  238.                     node = node.left.node
  239.         return node
  240.  
  241.     def check_balanced(self):
  242.         if self == None or self.node == None:
  243.             return True
  244.  
  245.         self.update_heights()
  246.         self.update_balances()
  247.         return (abs(self.balance) < 2) and self.node.left.check_balanced() and self.node.right.check_balanced()
  248.  
  249.     def inorder_traverse(self):
  250.         if self.node == None:
  251.             return []
  252.         inlist = []
  253.         l = self.node.left.inorder_traverse()
  254.         for i in l:
  255.             inlist.append(i)
  256.  
  257.         inlist.append(self.node.key)
  258.  
  259.  
  260.         l = self.node.right.inorder_traverse()
  261.         for i in l:
  262.             inlist.append(i)
  263.  
  264.         return inlist
  265.  
  266.     def display(self, key, ano):
  267.         #self.update_heights()
  268.         #self.update_balances()
  269.         if len(key) is 3:
  270.             if self.node is not None:
  271.                 if self.node.key[1] == key:
  272.                     self.node.lista.print(ano)
  273.                 else:
  274.                     if self.node.left is not None:
  275.                         self.node.left.display(key,ano)
  276.                     if self.node.left is not None:
  277.                         self.node.right.display(key,ano)
  278.         else:
  279.             if self.node is not None:
  280.                 if self.node.key[0] == key:
  281.                     self.node.lista.print(ano)
  282.                 else:
  283.                     if self.node.left is not None:
  284.                         self.node.left.display(key,ano)
  285.                     if self.node.left is not None:
  286.                         self.node.right.display(key,ano)
  287.  
  288.     def insertPais(self, key,valor):
  289.         # self.update_heights()
  290.         # self.update_balances()
  291.         if len(key) is 3:
  292.             if self.node is not None:
  293.                 if self.node.key[1] == key:
  294.                     self.node.lista.add(valor)
  295.                 else:
  296.                     if self.node.left is not None:
  297.                         self.node.left.insertPais(key,valor)
  298.                     if self.node.left is not None:
  299.                         self.node.right.insertPais(key,valor)
  300.         else:
  301.             if self.node is not None:
  302.                 if self.node.key[0] == key:
  303.                     self.node.lista.add(valor)
  304.                 else:
  305.                     if self.node.left is not None:
  306.                         self.node.left.insertPais(key,valor)
  307.                     if self.node.left is not None:
  308.                         self.node.right.insertPais(key,valor)
  309.  
  310.     def deleteValor(self, key, valor):
  311.         # self.update_heights()
  312.         # self.update_balances()
  313.         if len(key) is 3:
  314.             if self.node is not None:
  315.                 if self.node.key[1] == key:
  316.                     self.node.lista.remove(valor)
  317.                 else:
  318.                     if self.node.left is not None:
  319.                         self.node.left.deleteValor(key, valor)
  320.                     if self.node.left is not None:
  321.                         self.node.right.deleteValor(key, valor)
  322.         else:
  323.             if self.node is not None:
  324.                 if self.node.key[0] == key:
  325.                     self.node.lista.remove(valor)
  326.                 else:
  327.                     if self.node.left is not None:
  328.                         self.node.left.deleteValor(key, valor)
  329.                     if self.node.left is not None:
  330.                         self.node.right.deleteValor(key, valor)
  331.  
  332.     def displayAno(self,ano):
  333.  
  334.             if self.node is not None:
  335.                 self.node.lista.print(ano)
  336.                 if self.node.left is not None:
  337.                     self.node.left.displayAno(ano)
  338.                 if self.node.left is not None:
  339.                     self.node.right.displayAno(ano)
  340.  
  341.  
  342. def menu(a):
  343.     ans = True
  344.     while ans:
  345.         print("""
  346.        1.Add
  347.        2.Remove
  348.        3.Search
  349.        4.Back
  350.        """)
  351.         ans = input("Opção:\n ")
  352.         if ans == "1":
  353.             check =input("Inserir pais ou dados?\n")
  354.             if check == "pais":
  355.                 lista = LinkedList()
  356.                 code = input("Pais:\n")
  357.                 code2 = input("Sigla:\n")
  358.                 t0 = time.clock()
  359.                 a.insert((code,code2),lista)
  360.                 print("\n",(time.clock() - t0) * 1000, "ms")
  361.             elif check == "dados":
  362.                 code = input("Pais/Sigla:\n")
  363.                 val1 = input("Ano:\n")
  364.                 val2 = input("Valor:\n")
  365.                 t0 = time.clock()
  366.                 a.insertPais(code,(str(val1),str(val2)))
  367.                 print("\n",(time.clock() - t0) * 1000, "ms")
  368.             else:
  369.                 print("Errado!")
  370.  
  371.         elif ans == "2":
  372.             check = input("Remover pais ou dados?\n")
  373.             if check == "pais":
  374.                 code = input("Pais:\n")
  375.                 t0 = time.clock()
  376.                 a.delete(code)
  377.                 print("\n",(time.clock() - t0) * 1000, "ms")
  378.             elif check == "dados":
  379.                 code = input("Pais:\n")
  380.                 val = input("Ano a remover:\n")
  381.                 t0 = time.clock()
  382.                 a.deleteValor(code,val)
  383.                 print("\n",(time.clock() - t0) * 1000, "ms")
  384.         elif ans == "3":
  385.             check = input("pais ou ano?\n")
  386.             if check == "pais":
  387.                 code = input("Pais/Sigla:\n")
  388.                 ano = input("Ano especifico(0 caso todos):\n")
  389.                 t0 = time.clock()
  390.                 a.display(code, ano)
  391.                 print("\n",(time.clock() - t0) * 1000, "ms")
  392.             elif check == "ano":
  393.                 ano = input("Ano:\n ")
  394.                 t0 = time.clock()
  395.                 a.displayAno(ano)
  396.                 print("\n",(time.clock() - t0)*1000,"ms")
  397.  
  398.         elif ans == "4":
  399.             print("\n Goodbye!")
  400.             break
  401.         elif ans != "":
  402.             print("\n Not Valid Choice Try again")
  403.  
  404. def main():
  405.     i = 0
  406.     a = AVLTree()
  407.     with open("dados.csv", "r") as f:
  408.         reader = csv.reader(f)
  409.         for row in reader:
  410.             rowSplit = row[0].split(";")
  411.             for j in range(len(rowSplit)):
  412.                 if rowSplit[j] is not "":
  413.                     rowSplit[j] = rowSplit[j].replace('"','')
  414.  
  415.             if i == 0:
  416.                 pass
  417.             else:
  418.                 tuplo = (rowSplit[0], rowSplit[1])
  419.                 lista = LinkedList()
  420.                 for j in range(57):
  421.                     if rowSplit[2 + j] == '':
  422.                         pass
  423.                     else:
  424.                         tuploAnos = (str(j + 1960), rowSplit[2 + j])
  425.                         lista.add(tuploAnos)
  426.                 a.insert(tuplo, lista)
  427.             i += 1
  428.         menu(a)
  429.         f.close()
  430.  
  431.  
  432. if __name__ == "__main__":
  433.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement