def __init__(self, arr=None, capacity=0):
     if isinstance(arr, list):
         self._data = Array(arr)
         # heapify
         for i in range((self.size() - 1) // 2, -1, -1):
             self._sift_down(i)
     else:
         self._data = Array(capacity=capacity) if capacity else Array()
Beispiel #2
0
 def test_set(self):
     array = Array([1, 2, 3, 4, 5, 6, 7, 8])
     try:
         array.set(array.get_size(), 8)
     except Exception as e:
         self.assertTrue(isinstance(e, IndexError))
     array.set(0, 10)
     self.assertEqual(array.get_first(), 10)
Beispiel #3
0
 def test_add_and_get(self):
     array = Array([1, 2, 3])
     try:
         array.add(6, 4)
     except Exception as e:
         self.assertTrue(isinstance(e, IndexError))
     array.add(1, 5)
     self.assertEqual(array.get(1), 5)
     try:
         array.get(20)
     except Exception as e:
         self.assertTrue(isinstance(e, IndexError))
Beispiel #4
0
class ArrayStack:
    def __init__(self, cap=0):
        self._array = Array(capacity=cap)

    def push(self, e):
        self._array.add_last(e)

    def pop(self):
        return self._array.remove_last()

    def peek(self):
        return self._array.get_last()

    def get_size(self):
        return self._array.get_size()

    def is_empty(self):
        return self._array.is_empty()

    def get_capacity(self):
        return self._array.get_capacity()

    def __str__(self):
        return f"ArrayStack: {[self._array.get(i) for i in range(self.get_size())]}, right is top."

    def __repr__(self):
        return self.__str__()
Beispiel #5
0
class ArrayQueue:
    def __init__(self, cap=0):
        self._array = Array(capacity=cap)

    def get_size(self):
        return self._array.get_size()

    def is_empty(self):
        return self._array.is_empty()

    def enqueue(self, e):
        self._array.add_last(e)

    def dequeue(self):  # time complexity: O(n)
        return self._array.remove_first()

    def get_front(self):
        return self._array.get_first()

    def __str__(self):
        return f"ArrayQueue: front {[self._array.get(i) for i in range(self.get_size())]} tail."

    def __repr__(self):
        return self.__str__()
Beispiel #6
0
 def test_get_capacity(self):
     array = Array()
     self.assertEqual(array.get_capacity(), 0)
     array.add_last(5)
     self.assertEqual(array.get_capacity(), 1)
     array.add_last(5)
     self.assertEqual(array.get_capacity(), 2)
     array.add_last(5)
     self.assertEqual(array.get_capacity(), 4)
     array.add_last(5)
     self.assertEqual(array.get_capacity(), 4)
     array.add_last(5)
     self.assertEqual(array.get_capacity(), 8)
Beispiel #7
0
 def test_remove(self):
     array = Array([1, 2, 3, 4, 5, 6, 7, 8])
     try:
         array.remove(array.get_size())
     except Exception as e:
         self.assertTrue(isinstance(e, IndexError))
     array.remove_last()
     self.assertEqual(array.get_capacity(), 8)
     array.remove_last()
     self.assertEqual(array.get_capacity(), 8)
     array.remove_last()
     self.assertEqual(array.get_capacity(), 8)
     array.remove_last()
     self.assertEqual(array.get_capacity(), 8)
     array.remove_last()
     self.assertEqual(array.get_capacity(), 8)
     array.remove_last()
     self.assertEqual(array.get_capacity(), 4)
     array.remove_last()
     self.assertEqual(array.get_capacity(), 2)
     array.remove_last()
     self.assertEqual(array.get_capacity(), 1)
Beispiel #8
0
 def test_remove_last(self):
     array = Array([1, 2, 3])
     array.remove_last()
     self.assertEqual(array.find(3), -1)
Beispiel #9
0
 def test_remove_element(self):
     array = Array([1, 2, 3])
     array.remove_element(2)
     self.assertEqual(array.find(2), -1)
Beispiel #10
0
 def test_contains_and_find(self):
     array = Array([1, 2, 3])
     self.assertTrue(array.contains(3))
     self.assertFalse(array.contains(6))
     self.assertEqual(array.find(2), 1)
     self.assertEqual(array.find(6), -1)
Beispiel #11
0
 def test_get_size(self):
     array = Array([1, 2, 3])
     self.assertEqual(array.get_size(), 3)
Beispiel #12
0
 def test_add_first_and_get_first(self):
     array = Array()
     array.add_first(6)
     self.assertEqual(array.get_first(), 6)
Beispiel #13
0
 def test_is_empty(self):
     array = Array()
     self.assertTrue(array.is_empty())
Beispiel #14
0
 def test_magic_repr(self):
     array = Array([1, 2, 3])
     self.assertEqual(repr(array), "Array: [1, 2, 3], capacity: 3")
Beispiel #15
0
 def __init__(self, cap=0):
     self._array = Array(capacity=cap)
Beispiel #16
0
class MaxHeap:
    def __init__(self, arr=None, capacity=0):
        if isinstance(arr, list):
            self._data = Array(arr)
            # heapify
            for i in range((self.size() - 1) // 2, -1, -1):
                self._sift_down(i)
        else:
            self._data = Array(capacity=capacity) if capacity else Array()

    def size(self):
        return self._data.get_size()

    def is_empty(self):
        return self._data.is_empty()

    def add(self, e):
        self._data.add_last(e)
        self._sift_up(self.size() - 1)

    def _sift_up(self, index):
        while index > 0 and self._data.get(index) > self._data.get(
            (index - 1) // 2):
            self._data.swap(index, (index - 1) // 2)
            index = (index - 1) // 2

    def find_max(self):
        if self.size() > 0:
            return self._data.get_first()

    def extract_max(self):
        res = self.find_max()
        self._data.swap(0, self.size() - 1)
        self._data.remove_last()
        self._sift_down(0)
        return res

    def _sift_down(self, index):
        while 2 * index + 1 < self.size():
            j = 2 * index + 1
            if j + 1 < self.size() and self._data.get(j) < self._data.get(j +
                                                                          1):
                j += 1
            if self._data.get(index) >= self._data.get(j):
                break
            self._data.swap(j, index)
            index = j

    def replace(self, e):
        res = self.find_max()
        self._data.set(0, e)
        self._sift_down(0)
        return res