Exemplo n.º 1
0
    def test_deleteMin_withNotEmptyBST_shouldDeleteMinKeyFromBSTAndDecreaseBSTLength(
            self):
        bst = AVLTree()
        bst.put("A", 1)
        bst.put("B", 2)
        bst.put("C", 3)
        bst.put("D", 4)

        bst.delete_min()
        self.assertEqual(3, len(bst))
        self.assertNotIn("A", bst)

        bst.delete_min()
        self.assertEqual(2, len(bst))
        self.assertNotIn("B", bst)

        bst.delete_min()
        self.assertEqual(1, len(bst))
        self.assertNotIn("C", bst)

        bst.delete_min()
        self.assertEqual(0, len(bst))
        self.assertNotIn("D", bst)
Exemplo n.º 2
0
    def test_deleteMin_withCompareFunctionAndNotEmptyBST_shouldDeleteMinKeyFromBSTAndDecreaseBSTLength(
            self):
        bst = AVLTree(self.cmp)
        bst.put([0, 0], 1)
        bst.put([0, 1], 2)
        bst.put([0, 2], 3)
        bst.put([0, 3], 4)

        bst.delete_min()
        self.assertEqual(3, len(bst))
        self.assertNotIn([0, 0], bst)

        bst.delete_min()
        self.assertEqual(2, len(bst))
        self.assertNotIn([0, 1], bst)

        bst.delete_min()
        self.assertEqual(1, len(bst))
        self.assertNotIn([0, 2], bst)

        bst.delete_min()
        self.assertEqual(0, len(bst))
        self.assertNotIn([0, 3], bst)
Exemplo n.º 3
0
    def test_min_withNotEmptyBST_shouldReturnMaxKeyFromBST(self):
        bst = AVLTree()
        bst.put("D", 1)
        self.assertEqual("D", bst.min())

        bst.put("C", 2)
        self.assertEqual("C", bst.min())

        bst.put("B", 3)
        self.assertEqual("B", bst.min())

        bst.put("A", 4)
        self.assertEqual("A", bst.min())

        bst.delete_min()
        self.assertEqual("B", bst.min())

        bst.delete_min()
        self.assertEqual("C", bst.min())

        bst.delete_min()
        self.assertEqual("D", bst.min())
Exemplo n.º 4
0
    def test_min_withCompareFunctionAndNotEmptyBST_shouldReturnMaxKeyFromBST(
            self):
        bst = AVLTree()
        bst.put([0, 4], 1)
        self.assertEqual([0, 4], bst.min())

        bst.put([0, 3], 2)
        self.assertEqual([0, 3], bst.min())

        bst.put([0, 2], 3)
        self.assertEqual([0, 2], bst.min())

        bst.put([0, 1], 4)
        self.assertEqual([0, 1], bst.min())

        bst.delete_min()
        self.assertEqual([0, 2], bst.min())

        bst.delete_min()
        self.assertEqual([0, 3], bst.min())

        bst.delete_min()
        self.assertEqual([0, 4], bst.min())
Exemplo n.º 5
0
class MinPQPR:
    def __init__(self):
        self.__min = None
        self.__cur_time = None
        self.__now = AVLTree()
        self.__insertion = InsertionTree()
        self.__updates = PrefixSumBST()

    def empty(self):
        return self.__min is None

    def size(self):
        return self.__now.size()

    def __len__(self):
        return self.size()

    def min(self):
        return self.__min

    def insert(self, key, time):
        self.__update_time(time)

        if self.__updates.empty():
            self.__now.put(key, time)
            self.__updates.put(time, key, 0)
            self.__insertion.put(time, key, True)
            self.__update_min()
            return

        bridge = self.__updates.find_bridge_before(time)
        bridge = self.__insertion.ceiling(bridge)

        if bridge:
            max_now = self.__insertion.max_right(bridge)
        else:
            max_now = None

        if max_now is None:
            max_k = key
        else:
            max_k = max(max_now.val, key)

        if max_now and max_k == max_now.val:
            self.__updates.put(time, key, 1)
            self.__now.put(max_now.val, max_now.key)
            self.__insertion.put(max_now.key, max_now.val, active=True)
        else:
            self.__insertion.put(time, key, active=True)
            self.__updates.put(time, key, 0)
            self.__now.put(key, time)
        self.__update_min()

    def delete_min(self, time):
        self.__updates.put(time, "delete-min", -1)

        if self.__insertion.empty():
            self.__update_time(time)
            return None

        if self.__update_time(time):
            min_k = self.__min
            min_t = self.__now.get(min_k)

            self.__now.delete_min()
            self.__update_min()

            self.__insertion.put(min_t, min_k, False)

            return min_k

        bridge = self.__updates.find_bridge_after(time)
        bridge = self.__insertion.floor(bridge)

        min_now = self.__insertion.min_left(bridge)

        self.__insertion.put(min_now.key, min_now.val, False)
        self.__now.delete(min_now.val)
        self.__update_min()

        return min_now.val

    def delete(self, time):
        if time is None:
            raise ValueError("Invalid 'time' argument of None Type")
        if time not in self.__updates:
            raise ValueError("'time' argument does "
                             "not correspond to any operation")

        if self.__updates.get(time) == "delete-min":
            bridge = self.__updates.find_bridge_before(time)
            bridge = self.__insertion.ceiling(bridge)

            max_now = self.__insertion.max_right(bridge)

            self.__now.put(max_now.val, max_now.key)
            self.__insertion.put(max_now.key, max_now.val, True)
        else:
            bridge = self.__updates.find_bridge_after(time)
            bridge = self.__insertion.floor(bridge)

            min_now = self.__insertion.min_left(bridge)

            self.__now.delete(min_now.val)
            self.__insertion.delete(min_now.key)

        self.__updates.delete(time)
        self.__update_min()

    def __update_time(self, time):
        if self.__cur_time is None or \
           time >= self.__cur_time:
            self.__cur_time = time
            return True
        return False

    def __update_min(self):
        if self.__now.empty():
            self.__min = None
        else:
            self.__min = self.__now.min()