def insertion(args): tree = BTree() for value in args.strip().split(" "): tree.insert(value) return tree
def test_add_insert_full(self): bt = BTree(1) bt.insert(50) self.assertEqual(bt.rootNode.items, [50, None]) bt.insert(27) self.assertEqual(bt.rootNode.items, [27, 50]) res = bt.insert(35) self.assertEqual(res, 35)
def main(): a = 2 b = 6 tree = BTree(b) print("1 esercizio") if tree.is_empty(): print("albero vuoto") tree.insert(0, (42, 65)) if not tree.is_empty(): print("nodo inserito")
def test(pairs=None): try: error_info = OrderedDict() if pairs is not None: pair_cnt = len(pairs) seq = pairs b_tree = BTree(pairs) error_info['Insert sequence'] = seq error_info['Tree'] = b_tree else: pair_cnt = 200 seq = [] b_tree = BTree() error_info['Insert sequence'] = seq error_info['Tree'] = b_tree for i in range(pair_cnt): pair = Pair(random.randint(1, 50), random.randint(1, 1000)) seq.append(pair) b_tree.insert(pair) assert b_tree.is_valid(), \ 'Occur the error when inserting the pair.' sorted_seq = sorted(seq) tree_seq = [pair for pair in b_tree] error_info['Sorted insert sequence'] = sorted_seq error_info['Output sequence'] = tree_seq assert len(sorted_seq) == len(tree_seq), \ 'The length of the output sequence of the tree i not correct.' for i in range(len(sorted_seq)): assert id(sorted_seq[i]) == id(tree_seq[i]), \ 'Input node and output nodes are not the same.' del_seq = [] error_info['Delete sequence'] = del_seq for_del = seq.copy() for i in range(pair_cnt): # delete until zero node in the tree idx = random.randint(0, len(for_del) - 1) pair = for_del.pop(idx) del_seq.append(pair) b_tree.delete_one(pair) assert b_tree.is_valid(), f'Deleting fails. Pair:{pair}' return True except Exception as e: extra_msg = '\n\n'.join([f'{k}:\n{v}' for k, v in error_info.items()]) # The error message may be at the first item? e.args = (e.args[0] + f'\n{extra_msg}', *e.args[1:]) raise e
def test_add_insert_full_d2(self): bt = BTree(2) bt.insert(50) self.assertEqual(bt.rootNode.items, [50, None, None, None]) bt.insert(27) self.assertEqual(bt.rootNode.items, [27, 50, None, None]) bt.insert(11) self.assertEqual(bt.rootNode.items, [11, 27, 50, None]) bt.insert(72) self.assertEqual(bt.rootNode.items, [11, 27, 50, 72]) res = bt.insert(10) self.assertEqual(res, 10)
def test_add_insert_deep(self): bt = BTree(1) bt.insert(50) bt.insert(27) res = bt.insert(35) self.assertEqual(res, 35) # full, root bt.insert(98) bt.insert(201)
def test_btree(self): ''' Test BTree insert, traverse and find ''' bt = BTree(27) bt.insert(1) bt.insert(15) bt.insert(5) bt.insert(5) bt.insert(50) self.assertEqual(bt.traverse(), [1, 5, 15, 27, 50]) self.assertTrue(bt.find(5)) self.assertTrue(bt.find(50)) self.assertFalse(bt.find(55))
def test_add_insert_not_full(self): bt = BTree(2) bt.insert(50) self.assertEqual(bt.rootNode.items, [50, None, None, None]) bt.insert(27) self.assertEqual(bt.rootNode.items, [27, 50, None, None]) res = bt.insert(30) self.assertEqual(bt.rootNode.items, [27, 30, 50, None]) res = bt.insert(10) self.assertEqual(bt.rootNode.items, [10, 27, 30, 50])
def main(): """Create a BTree and add a few BNodes.""" # Create BNodes kotei = BNode("固定資産") mukei = BNode("無形固定資産", kotei) yukei = BNode("有形固定資産", kotei) tochi = BNode("土地", yukei) tatemono = BNode("建物", yukei) kouchiku = BNode("構築物", yukei) # Create BTree with kotei BNode as root node tree = BTree(kotei) # Construct BTree tree.insert(mukei) tree.insert(yukei) tree.insert(tochi) tree.insert(tatemono) tree.insert(kouchiku) # Print location of tatemono tree.locate("建物")
def walk(item, spaces=0): print("{}{}={} {} {}".format(" " * spaces, item.key, item.value, "leaf" if item.leaf else "", item.parent)) for child in item.children: walk(child, spaces + 1) root = BTree(False, 3, 0, None)\ .insert(1, "1")\ .insert(2, "2")\ .insert(3, "3")\ .insert(4, "4") inserted = [1, 2, 3, 4] for i in range(5, 100): root = root.insert(i, str(i)) inserted.append(i) walk(root) print(root.children) def keysonly(items): for item in items: yield item.key assert sorted(list(keysonly(root.walk()))) == list(keysonly(root.walk())) assert sorted(list(keysonly(root.walk()))) == sorted(inserted)
def test_add_insert_split_parent(self): bt = BTree(1) bt.insert(50) bt.insert(27) bt.insert(35) bt.insert(98) bt.insert(201) bt.insert(73) bt.insert(29) bt.insert(150) bt.insert(15)
from btree import BTree from GreatestDistance import findDiameter t = BTree("h") t.insert("d") t.insert("f") t.insert("a1") t.insert("a2") t.insert("a3") t.insert("a4") t.insert("m1") t.insert("m2") t.insert("m3") t.insert("m4") t.display() print findDiameter(t)
def build_btree_index(_item_list): index = BTree() [index.insert(x, i) for i, x in enumerate(_item_list)] return index
class Table: BTREE_ROOT_DEFAULT = 16300 buffer = attr.ib(validator=attr.validators.instance_of(Buffer)) btree = attr.ib(default=None) @classmethod def init(cls, datafile): buffer = Buffer.init(datafile) try: config_datablock = buffer.get_datablock( int(buffer.datafile.NUM_DATABLOCKS) - 1) btree_root = BTree(root=config_datablock.btree_root, buffer=buffer) except (EnvironmentError): btree_root = None return cls(buffer=buffer, btree=btree_root) def refresh(self, datafile): buffer = Buffer.init(datafile) try: config_datablock = buffer.get_datablock( int(buffer.datafile.NUM_DATABLOCKS) - 1) btree_root = BTree(root=config_datablock.btree_root, buffer=buffer) except (EnvironmentError): btree_root = None self.buffer = buffer self.btree = btree_root def insert(self, code, desc): """ Inserts code and desc into table """ if (self.btree is None): new_config = self.buffer.new_datablock( 4, self.buffer.datafile.NUM_DATABLOCKS - 1) self.btree = BTree(root=self.BTREE_ROOT_DEFAULT, buffer=self.buffer) self.btree.init() new_record = Record(code=code, description=desc) #Search if code already exists if (self.btree.has_key(code)): print('Record with code %s already exists' % code) return None dblock, position = self.buffer.search_dblock_with_free_space( new_record.size() + 4, 1) new_record = dblock.write_data(new_record, position) self.btree.insert(new_record.code, new_record.rowid) print('Record Inserted') pass def select_code(self, code): """ Finds record with code Uses btree for index """ if (self.btree is None): print('[]') return None rowid = self.btree.find_key(code) if (rowid is None): print('[]') return None dblock = self.buffer.get_datablock(rowid.dblock) print(dblock.get_record_by_pos(rowid.pos)) pass def select_desc(self, desc): """ Finds record by description Can't use btree """ records = self.buffer.linear_search_record(1, desc, 'description') print(records) pass def update(self, code, desc): """ Updates record code with new description desc Finds record through select_code() """ if (self.btree is None): print('[]') return None rowid = self.btree.find_key(code) if (rowid is None): print('Record not found') return None dblock = self.buffer.get_datablock(rowid.dblock) record = dblock.get_record_by_pos(rowid.pos) result = dblock.update_record(record, desc) if (result): print('Record Updated') return None update_record = record update_record.description = desc update_record.rowid = None update_record.deleted = False dblock, position = self.buffer.search_dblock_with_free_space( update_record.size() + 4, 1) record = dblock.write_data(update_record, position) self.btree.update(record.code, record.rowid) print('Record Updated') pass def delete(self, code): """ Deletes record by code Finds record through select_code() """ if (self.btree is None): print('[]') return None rowid = self.btree.find_key(code) if (rowid is None): print('Record not found') return None dblock = self.buffer.get_datablock(rowid.dblock) record = dblock.get_record_by_pos(rowid.pos) dblock.delete_record(record) self.btree.delete(code) print('Record Removed') pass def exit(self): self.buffer.flush() pass
def test_del_nonleaf(self): bt = BTree(2) bt.insert(20) bt.insert(40) bt.insert(10) bt.insert(30) bt.insert(15) bt.insert(35) bt.insert(7) bt.insert(26) bt.insert(18) bt.insert(22) bt.insert(5) bt.insert(42) bt.insert(13) bt.insert(46) bt.insert(27) bt.insert(8) bt.insert(32) bt.insert(38) bt.insert(24) bt.insert(45) bt.insert(25) bt.delete(35) bt.delete(38) bt.delete(25)
while item: parents.append(item) item = item.parent return parents node_1_parents = find_parents(node_1) item = node_2 while item: if item in node_1_parents: return item item = item.parent return None if __name__ == '__main__': tree = BTree() node_1 = Node(50) node_2 = Node(102) node_3 = Node(40) node_4 = Node(200) node_5 = Node(90) node_6 = Node(80) tree.insert(node_1) tree.insert(node_2) tree.insert(node_3) tree.insert(node_4) tree.insert(node_5) tree.insert(node_6) # tree.show() print(lca(node_4, node_6))
curr = node.right while curr.left: curr = curr.left return curr # otherwise it's the first parent which can be arrived from the left else: curr = node.parent while curr: # this could be "and (curr.left and curr.left.data != ...)" then we would leave when == if curr.left and curr.left.data == node.data: break node = curr curr = curr.parent return curr t = BTree() t.insert(5) t.insert(3) t.insert(7) t.insert(-1) t.insert(4) t.insert(6) t.insert(8) t.insert(-2) t.insert(2) t.insert(0) t.insert(1) node = t.root.left.left.right.left # 0, successor is 1 successor(node)