Exemple #1
0
 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)
Exemple #2
0
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()
Exemple #4
0
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()
Exemple #5
0
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()