Source code for titan_pylib.data_structures.heap.deletable_min_heap

 1from titan_pylib.data_structures.heap.min_heap import MinHeap
 2from titan_pylib.my_class.supports_less_than import SupportsLessThan
 3from typing import TypeVar, Generic, Iterable
 4
 5T = TypeVar("T", bound=SupportsLessThan)
 6
 7
[docs] 8class DeletableMinHeap(Generic[T]): 9 10 def __init__(self, a: Iterable[T] = []) -> None: 11 """削除可能Minヒープです。 12 要素の 追加/削除/最小値取得 が効率よく行えます。 13 """ 14 self.hq: MinHeap[T] = MinHeap(a) 15 self.rem_hq: MinHeap[T] = MinHeap() 16 self._len: int = len(self.hq) 17
[docs] 18 def push(self, key: T) -> None: 19 """``key`` を追加します。 20 :math:`O(\\log{n})` です。 21 """ 22 self._len += 1 23 if self.rem_hq and self.rem_hq.get_min() == key: 24 self.rem_hq.pop_min() 25 return 26 self.hq.push(key)
27
[docs] 28 def remove(self, key: T) -> None: 29 """``key`` を削除します。 30 :math:`O(\\log{n})` です。 31 """ 32 assert self._len > 0 33 self._len -= 1 34 if self.hq.get_min() == key: 35 self.hq.pop_min() 36 else: 37 self.rem_hq.push(key)
38 39 def _delete(self) -> None: 40 while self.rem_hq and self.rem_hq.get_min() == self.hq.get_min(): 41 self.hq.pop_min() 42 self.rem_hq.pop_min() 43
[docs] 44 def get_min(self) -> T: 45 """最小の要素を返します。 46 :math:`O(\\log{n})` です。 47 """ 48 assert self._len > 0 49 self._delete() 50 return self.hq.get_min()
51
[docs] 52 def pop_min(self) -> T: 53 """最小の要素を削除して返します。 54 :math:`O(\\log{n})` です。 55 """ 56 assert self._len > 0 57 self._len -= 1 58 self._delete() 59 return self.hq.pop_min()
60 61 def __len__(self) -> int: 62 return self._len