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 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)
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))
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__()
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__()
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)
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)
def test_remove_last(self): array = Array([1, 2, 3]) array.remove_last() self.assertEqual(array.find(3), -1)
def test_remove_element(self): array = Array([1, 2, 3]) array.remove_element(2) self.assertEqual(array.find(2), -1)
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)
def test_get_size(self): array = Array([1, 2, 3]) self.assertEqual(array.get_size(), 3)
def test_add_first_and_get_first(self): array = Array() array.add_first(6) self.assertEqual(array.get_first(), 6)
def test_is_empty(self): array = Array() self.assertTrue(array.is_empty())
def test_magic_repr(self): array = Array([1, 2, 3]) self.assertEqual(repr(array), "Array: [1, 2, 3], capacity: 3")
def __init__(self, cap=0): self._array = Array(capacity=cap)
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