def __init__(self, array=None, capacity=None): if isinstance(array, Array): self._data = array for i in range(self._parent(array.get_size() - 1), -1, -1): self._sift_down(i) return if capacity is None: self._data = Array() else: self._data = Array(capacity=capacity)
def max_heap_test2(): ''' 测试MaxHeap代码书写是否正确 ''' array = Array() for i in range(10): array.add_last(randint(1, 100000)) max_heap = MaxHeap(array) for data in max_heap._data: print(data, end=' ') print('\n' + '-------result--------') for i in range(max_heap.get_size()): print(max_heap.extract_max()) print('-------end-----------')
class ArrayStack(StackBase): ''' 数据结构--03--栈(基于队列Array实现) ''' def __init__(self, capacity=10): self.array = Array(capacity=capacity) def get_size(self): ''' 获取栈中元素个数 ''' return self.array.get_size() def is_empty(self): ''' 判断栈是否为空 ''' return self.array.is_empty() def push(self, value): ''' 入栈,往栈中插入值为value的元素 ''' self.array.add_last(value) def pop(self): ''' 出栈,从栈中删除栈顶元素 ''' return self.array.remove_last() def top(self): ''' 返回栈顶元素的值 ''' return self.array.get_last() def get_capacity(self): ''' 获取栈的空间容量 ''' return self.array.get_capacity()
class ArrayQueue(QueueBase): ''' 数据结构--03--队列(基于数组Array实现) ''' def __init__(self, capacity=10): self._array = Array(capacity=capacity) def get_size(self): ''' 获取队列中元素个数 ''' return self._array.get_size() def is_empty(self): ''' 判断队列是否为空 ''' return self._array.is_empty() def enqueue(self, value): ''' 入队,往队列中插入值为value的元素 ''' self._array.add_last(value) def dequeue(self): ''' 出队,从队列中删除队首元素,并返回队首元素的值 ''' return self._array.remove_first() def get_front(self): ''' 获取队首的元素值 ''' return self._array.get_first() def get_capacity(self): ''' 返回队列的空间容量 ''' return self._array.get_capacity()
class MaxHeap: ''' 数据结构--08--最大堆(基于数组Array实现) ''' def __init__(self, array=None, capacity=None): if isinstance(array, Array): self._data = array for i in range(self._parent(array.get_size() - 1), -1, -1): self._sift_down(i) return if capacity is None: self._data = Array() else: self._data = Array(capacity=capacity) def get_size(self): ''' 返回最大堆MaxHeap中元素个数 ''' return self._data.get_size() def is_empty(self): ''' 判断最大堆MaxHeap是否为空 ''' return self._data.is_empty() def add(self, value): ''' 向最大堆MaxHeap中添加值为value的元素,共分为两步: 1. 将元素添加在数组Array的末尾 2. 对末尾元素进行Sift UP操作 ''' self._data.add_last(value) self._sift_up(self.get_size() - 1) def _sift_up(self, index): ''' Sift UP 上浮,若子节点的值大于父节点的值,则Sift UP ''' while index > 0 and self._data.get(index) > self._data.get( self._parent(index)): self._data.swap(index, self._parent(index)) index = self._parent(index) def _sift_down(self, index): ''' Sift Down下沉,若父节点小于子节点的值,则Sift Down ''' while self._left_child(index) < self.get_size(): left_child_index = self._left_child(index) right_child_index = self._right_child(index) # 获取左子节点和右子节点中最大值所在的索引,为max_index max_index = left_child_index if right_child_index < self.get_size() and self._data.get( left_child_index) < self._data.get(right_child_index): max_index = right_child_index # 如果当前index的值大于左右子节点中的最大值,那么直接break if self._data.get(index) > self._data.get(max_index): break self._data.swap(index, max_index) index = max_index def find_max(self): ''' 找到最大堆MaxHeap中的最大元素 ''' if self.is_empty(): raise ValueError("can not find max, MaxHeap is Empty") return self._data.get_first() def extract_max(self): ''' 取出最大堆MaxHeap中的最大元素,总共分两步: 1. 将第一个元素(最大值)于最后一个元素交换 2. 对交换后的第一个元素进行Sfit Down操作 ''' ret = self.find_max() self._data.swap(0, self.get_size() - 1) self._data.remove_last() self._sift_down(0) return ret def replace(self, value): ''' 取出最大堆MaxHeap中的最大元素,并放入一个新的元素(替换掉最大元素) ''' ret = self.find_max() self._data.set(0, value) self._sift_down(0) return ret def _parent(self, index): ''' 返回索引为index的父亲节点所在的索引 ''' if index == 0: raise ValueError("index 0 has no parent") return (index - 1) // 2 def _left_child(self, index): ''' 返回索引为index的左子节点所在的索引 ''' return 2 * index + 1 def _right_child(self, index): ''' 返回索引为index的右子节点所在的索引 ''' return 2 * index + 2
def __init__(self, capacity=10): self.array = Array(capacity=capacity)
def __init__(self, M): self._M = M self._size = 0 self._hashtable = Array() for i in range(self._M): self._hashtable[i] = AVLMap()