Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.75 KB | None | 0 0
  1. import random
  2. import matplotlib.pyplot as plt
  3.  
  4. class ChainingHashMap:
  5. def __init__(self, size = 10):
  6. self.elementsAmount = 0
  7. self.MAX_PER_LIST = 10
  8. self.size = size
  9. self.data = [[] for _ in range(size)]
  10. self.operationToFind = 0
  11.  
  12. def key(self, element):
  13. return element[0]
  14.  
  15. def findIndex(self, k):
  16. self.operationToFind = 0
  17. h = hash(k) % len(self.data)
  18. for i in range (len(self.data[h])):
  19. self.operationToFind += 1
  20. if self.key(self.data[h][i]) == k:
  21. return h, i
  22. return h, -1
  23.  
  24. def find(self, k):
  25. h, i = self.findIndex(k)
  26. if i == -1: return None
  27. return self.data[h][i]
  28.  
  29. def createNewData(self, newSize):
  30. newData = [[] for _ in range(newSize)]
  31. for tab in self.data:
  32. for el in tab:
  33. arrIndex = hash(self.key(el)) % len(newData)
  34. newData[arrIndex].append(el)
  35. return newData
  36.  
  37. def insert(self, *element):
  38. h, i = self.findIndex(self.key(element))
  39. if i == -1:
  40. self.data[h].append(element)
  41. self.elementsAmount += 1
  42. if self.elementsAmount > self.size * self.MAX_PER_LIST:
  43. self.size *= 2
  44. self.data = self.createNewData(self.size)
  45. else:
  46. self.data[h][i] = element
  47.  
  48. def delete(self, value):
  49. h, i = self.findIndex(value)
  50. if i != -1:
  51. self.data[h][i] = self.data[h][-1]
  52. del self.data[h][-1]
  53. self.elementsAmount -= 1
  54. isRehashPossible = 4 * self.elementsAmount < self.size * self.MAX_PER_LIST
  55. if self.elementsAmount > 1 and self.size > 1 and isRehashPossible:
  56. self.size //= 2
  57. self.data = self.createNewData(self.size)
  58.  
  59.  
  60.  
  61. def simulateFindOperation():
  62. mapForSimulation = ChainingHashMap()
  63. x = []
  64. y = []
  65. for i in range(1, 1000):
  66. operationAverage = 0
  67. mapForSimulation.insert(i, i)
  68. for j in range(20):
  69. rand = random.randint(0, i)
  70. mapForSimulation.find(rand)
  71. operationAverage += mapForSimulation.operationToFind
  72. operationAverage /= 20
  73. x.append(i)
  74. y.append(operationAverage)
  75. plt.plot(x,y)
  76. plt.show()
  77.  
  78. simulateFindOperation()
  79.  
  80. map = ChainingHashMap()
  81. map.insert(5, 1)
  82. map.insert(25, 4)
  83. map.insert(13, 1)
  84. map.insert(15, 7)
  85. map.insert(11, 4)
  86. map.insert(27, 1)
  87. map.insert(19, 7)
  88. print(map.data)
  89. x = map.find(5)
  90. map.delete(5)
  91. map.delete(25)
  92. map.delete(13)
  93. map.delete(15)
  94. map.delete(11)
  95. map.delete(27)
  96. print(x, map.data, sep='\n')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement