Guest User

Untitled

a guest
May 24th, 2018
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. import unittest
  2.  
  3. ## Kd-tree implementation
  4. ## 2d tree
  5. ## search, insert
  6.  
  7. class Node:
  8.  
  9. def __init__(self,x,y,cmp_x):
  10. '''
  11. x,y - point
  12. cmp_x - compare point by x-coord if True else compare by y-coord
  13. '''
  14. self.x = x
  15. self.y = y
  16. self.cmp_x = cmp_x
  17. self.left = None
  18. self.right = None
  19.  
  20. def __lt__(self,other):
  21. '''
  22. < operator overload
  23. '''
  24.  
  25. if self.cmp_x:
  26. if self.x != other.x:
  27. return self.x < other.x
  28. else:
  29. return self.y < other.y
  30.  
  31. else:
  32. if self.y != other.y:
  33. return self.y < other.y
  34. else:
  35. return self.x < other.x
  36.  
  37. def __eq__(self,other):
  38. '''
  39. == operator overload
  40. :param other:
  41. :return:
  42. '''
  43.  
  44. if other.x == self.x and other.y == self.y:
  45. return True
  46. else:
  47. return False
  48.  
  49. class Tdtree:
  50. def __init__(self):
  51. self.root = None
  52.  
  53. def search(self,key):
  54. '''
  55.  
  56. :param key: Node
  57. :return: True if exists
  58. '''
  59.  
  60. self.curnode = self.root
  61. while self.curnode is not None:
  62. if not self.curnode == key:
  63. if self.curnode < key:
  64. self.curnode = self.curnode.right
  65. else:
  66. self.curnode = self.curnode.left
  67. else:
  68. return True
  69.  
  70. return False
  71.  
  72. def insert(self,key):
  73. '''
  74.  
  75. :param key:
  76. :return:
  77. '''
  78. self.curnode = self.root
  79. prevnode = None
  80. if self.curnode is not None:
  81. while self.curnode is not None:
  82. if not self.curnode == key:
  83. prevnode = self.curnode
  84. if self.curnode < key:
  85. self.curnode = self.curnode.right
  86. else:
  87. self.curnode = self.curnode.left
  88. else:
  89. return False
  90.  
  91. if prevnode.left == self.curnode:
  92. key.cmp_x = not prevnode.cmp_x
  93. prevnode.left = key
  94. else:
  95. self.root = key
  96. key.cmp_x = True
  97.  
  98. class TestNodes(unittest.TestCase):
  99.  
  100. def setUp(self):
  101. self.n1 = Node(3,5,True)
  102. self.n2 = Node(6,1,False)
  103.  
  104. def test_comparison(self):
  105. '''
  106. '''
  107.  
  108. self.assertIs(self.n1 < self.n2,True)
  109. self.assertIs(self.n2 < self.n1,True)
  110. self.assertNotEqual(self.n1, self.n2)
  111.  
  112.  
  113. class TestTdTree(unittest.TestCase):
  114.  
  115. def setUp(self):
  116. self.t = Tdtree()
  117. self.t.root = Node(5,2,True)
  118. self.t.root.left = Node(1,4,False)
  119. self.t.root.right = Node(6,3,False)
  120. self.n1 = Node(6, 3, False)
  121. self.n2 = Node(5, 3, True)
  122.  
  123. def testSearch(self):
  124.  
  125. self.assertIs(self.t.search(self.n1),True)
  126. self.assertIs(self.t.search(self.n2),False)
  127.  
  128. def testInsert1(self):
  129. self.t.insert(self.n2)
  130. self.assertEqual(self.t.search(self.n2),True)
  131. self.assertEqual(self.t.root.right.left,self.n2)
  132.  
  133. if __name__ == '__main__':
  134. unittest.main(verbosity=2)
Add Comment
Please, Sign In to add comment