def __new__(cls): obj = object.__new__(cls) obj.items = BinomialHeap() return obj
def test_BinomialHeap(): # Corner cases assert raises( TypeError, lambda: BinomialHeap(root_list=[BinomialTreeNode(1, 1), None])) is True tree1 = BinomialTree(BinomialTreeNode(1, 1), 0) tree2 = BinomialTree(BinomialTreeNode(2, 2), 0) bh = BinomialHeap(root_list=[tree1, tree2]) assert raises(TypeError, lambda: bh.merge_tree(BinomialTreeNode(2, 2), None)) assert raises(TypeError, lambda: bh.merge(None)) # Testing BinomialHeap.merge nodes = [ BinomialTreeNode(1, 1), # 0 BinomialTreeNode(3, 3), # 1 BinomialTreeNode(9, 9), # 2 BinomialTreeNode(11, 11), # 3 BinomialTreeNode(6, 6), # 4 BinomialTreeNode(14, 14), # 5 BinomialTreeNode(2, 2), # 6 BinomialTreeNode(7, 7), # 7 BinomialTreeNode(4, 4), # 8 BinomialTreeNode(8, 8), # 9 BinomialTreeNode(12, 12), # 10 BinomialTreeNode(10, 10), # 11 BinomialTreeNode(5, 5), # 12 BinomialTreeNode(21, 21) ] # 13 nodes[2].add_children(nodes[3]) nodes[4].add_children(nodes[5]) nodes[6].add_children(nodes[9], nodes[8], nodes[7]) nodes[7].add_children(nodes[11], nodes[10]) nodes[8].add_children(nodes[12]) nodes[10].add_children(nodes[13]) tree11 = BinomialTree(nodes[0], 0) tree12 = BinomialTree(nodes[2], 1) tree13 = BinomialTree(nodes[6], 3) tree21 = BinomialTree(nodes[1], 0) heap1 = BinomialHeap(root_list=[tree11, tree12, tree13]) heap2 = BinomialHeap(root_list=[tree21]) def bfs(heap): bfs_trav = [] for i in range(len(heap.root_list)): layer = [] bfs_q = Queue() bfs_q.append(heap.root_list[i].root) while len(bfs_q) != 0: curr_node = bfs_q.popleft() if curr_node is not None: layer.append(curr_node.key) for _i in range(curr_node.children._last_pos_filled + 1): bfs_q.append(curr_node.children[_i]) if layer != []: bfs_trav.append(layer) return bfs_trav heap1.merge(heap2) expected_bfs_trav = [[1, 3, 9, 11], [2, 8, 4, 7, 5, 10, 12, 21]] assert bfs(heap1) == expected_bfs_trav # Testing Binomial.find_minimum assert heap1.find_minimum().key == 1 # Testing Binomial.delete_minimum heap1.delete_minimum() assert bfs(heap1) == [[3], [9, 11], [2, 8, 4, 7, 5, 10, 12, 21]] assert raises(ValueError, lambda: heap1.decrease_key(nodes[3], 15)) heap1.decrease_key(nodes[3], 0) assert bfs(heap1) == [[3], [0, 9], [2, 8, 4, 7, 5, 10, 12, 21]] heap1.delete(nodes[12]) assert bfs(heap1) == [[3, 8], [0, 9, 2, 7, 4, 10, 12, 21]] # Testing BinomialHeap.insert heap = BinomialHeap() assert raises(IndexError, lambda: heap.find_minimum()) heap.insert(1, 1) heap.insert(3, 3) heap.insert(6, 6) heap.insert(9, 9) heap.insert(14, 14) heap.insert(11, 11) heap.insert(2, 2) heap.insert(7, 7) assert bfs(heap) == [[1, 3, 6, 2, 9, 7, 11, 14]]
def __new__(cls, **kwargs): raise_if_backend_is_not_python(cls, kwargs.get('backend', Backend.PYTHON)) obj = object.__new__(cls) obj.items = BinomialHeap() return obj