Назад к вопросам
Junior
96
questionbank

Какова сложность операций с кучей?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Операции с двоичной кучей (обычно используемой реализацией) имеют следующую сложность:

  • Вставка элемента (Insert): O(log n). Новый элемент добавляется в конец, а затем выполняется операция "всплывания" (heapify up) для восстановления свойств кучи. В худшем случае всплывание происходит до корня, что логарифмично по высоте дерева.

  • Удаление минимального/максимального элемента (Extract-Min/Max): O(log n). Корневой элемент (минимальный/максимальный) удаляется, последний элемент помещается на его место, а затем выполняется операция "просеивания вниз" (heapify down) для восстановления свойств кучи. В худшем случае просеивание происходит до листа.

  • Просмотр минимального/максимального элемента (Peek/Top): O(1). Минимальный/максимальный элемент находится в корне кучи и доступен напрямую.

  • Построение кучи из массива (BuildHeap): O(n). Несмотря на то, что каждый вызов heapifyDown занимает O(log n), оптимизированный алгоритм построения кучи, применяющий heapifyDown ко всем нелистовым узлам снизу вверх, имеет линейную сложность.

// Пример псевдокода для Insert
void Insert(Heap& heap, int value) {
    heap.array.push_back(value);
    heapifyUp(heap.array, heap.array.size() - 1); // Восстановление свойств кучи
}

// Пример псевдокода для Extract-Min
int ExtractMin(Heap& heap) {
    if (heap.array.empty()) {
        // Обработка ошибки или пустой кучи
        return -1;
    }
    int minValue = heap.array[0];
    heap.array[0] = heap.array.back();
    heap.array.pop_back();
    heapifyDown(heap.array, 0); // Восстановление свойств кучи
    return minValue;
}

// Пример псевдокода для Peek/Top
int PeekMin(const Heap& heap) {
    if (heap.array.empty()) {
        // Обработка ошибки или пустой кучи
        return -1;
    }
    return heap.array[0];
}