База данных - Heap

Binary последовательное хранение

     Использовать массив содержит бинарное дерево, метод бинарного дерева о последовательности обход образом в массив.

В общем случае подходит только для представления двоичного дерева, потому что будет трата неполного двоичного дерева пространства. Это основные пути заключается в использовании кучи представления.

        Полное бинарное дерево с узлами между соотношением индекса массива:

  1. В случае известного родительского узла
  • Дети, оставшиеся индекс: левый = 2 * родитель + 1
  • Правильные дочерние узлы: правый = 2 * родитель = 2

     2. Известно, что оставила ребенка или детей

  • Родительский узел нижние индексы: родитель = (ребенок-1) / 2

отвал

  1. Стек логически полное бинарное дерево
  2. Стек физически хранится в массиве
  3. Большие значения двоичного дерева узлов в любой из его левого узла поддерева и правого ребенок, стек свай (сваи большого корня), в то время как небольшая куча (кучи корешкова)

Куча связанных с ними операций

  1. корректировка в сторону понижения (временная сложность O (журнал (п)))

  При условии: если левый и правый поддеревья стек упорядочены (стек) могут быть скорректированы в сторону понижения до указанного узла.

  Операция:

1. index 如果已经是叶子结点,则整个调整过程结束
   判断 index 位置有没有孩子
   因为堆是完全二叉树,没有左孩子就一定没有右孩子,所以判断是否有左孩子
   因为堆的存储结构是数组,所以判断是否有左孩子即判断左孩子下标是否越界,即 left >= size 越界
2. 确定 left 或 right,谁是 index 的最小孩子 min
   如果右孩子不存在,则 min = left
   否则,比较 array[left] 和 array[right] 值得大小,选择小的为 min
3. 比较 array[index] 的值 和 array[min] 的值,如果 array[index] <= array[min],则满足堆的性质,调整结束。否则,交换 array[index] 和 array[min] 的值
4. 然后因为 min 位置的堆的性质可能被破坏,所以把 min 视作 index,向下重复以上过程

 Код: 

public static void shiftDownSmall(int []array,int size,int index) {
        int left = 2 * index + 1;//根据下标找到左孩子
        while (left < size) {
            int right=left+1;
            int min=left;
            if(right<size) {//右孩子存在,则与左孩子进行比较 找到最小孩子
                if (array[min] > array[right]) {
                    min = right;
                }
            }
            if (array[index] > array[min]) {//如果孩子结点的值小于指定下标 进行交换
                    swap(array, index, min);
                    index = min;//更新节点的值
                    left = 2 * index + 1;//继续计算结点下标 进行向下调整
            }else
                    break;
        }
    }//对给定下标位置元素进行小堆排序

  2. Построение стека (временная сложность O (N * Log (N)))

  Необходимое условие: левое и правое поддеревья расстройство, которое не представляет собой груду

  Операция: Начать с листом узла бинарного дерева после нахождения его родительского узла для того, чтобы отрегулировать назад вниз

  Код:

    public static void createHeapSmall(int []array,int size){
        for(int i=(size-2)/2;i>=0;i--)
        {
            shiftDownSmall(array,size,i);
        }
    }//建小堆
    // 因为堆本身就是数组 而此时的堆是无序的 不是小堆 也不是大堆
    // 建堆需要从最后一个节叶子点的双亲结点开始建堆
    public static void createHeapBig(int []array,int size){
        for(int i=(size-2)/2;i>=0;i--)
        {
            shiftDownBig(array,size,i);
        }
    }//建大堆

 

Опубликовано 40 оригинальных статей · вона похвала 4 · Просмотров 870

рекомендация

отblog.csdn.net/weixin_44919969/article/details/101459720