def insertion(args):

    tree = BTree()

    for value in args.strip().split(" "):
        tree.insert(value)

    return tree
示例#2
0
    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)
示例#3
0
文件: main.py 项目: Wickan-lab/AADS
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")
示例#4
0
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
示例#5
0
    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)
示例#6
0
 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)
示例#7
0
    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))
示例#8
0
 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])
示例#9
0
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("建物")
示例#10
0
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)
示例#11
0
    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)
示例#12
0
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)
示例#13
0
def build_btree_index(_item_list):
    index = BTree()
    [index.insert(x, i) for i, x in enumerate(_item_list)]

    return index
示例#14
0
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
示例#15
0
 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)
示例#16
0
        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))
示例#17
0
        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)