Структура данных "Пирамида" C++

148
13 июня 2022, 05:20

Реализую структура данных "Пирамида" и некоторые методы к ней. Все работает, но беда в том, что очень медленно. А я не понимаю, где копать, где программа может тормозить, ведь все методы довольно скростные. Прикрепляю свой код. Ни у кого нет идей, что переделать?

#include <iostream>
#include <cstring>
using namespace std;
struct Node {
    int data;
    int num;
};
struct Heap {
    Node* nodes;
    int* helpNodes;
    int h_size;
    void Down(int index) {
        int left = 2 * index + 1;
        int right = 2 * index + 2;
        int imin = index;
        if (left < this->h_size && nodes[left].data < nodes[imin].data) {
            imin = left;
        }
        if (right < this->h_size && nodes[right].data < nodes[imin].data) {
            imin = right;
        }
        if (index != imin) {
            swap(nodes[index], nodes[imin]);
            Down(imin);
        }
    }
    void Up(int index) {
        while (index > 0) {
            int parent = (index - 1) / 2;
            if (nodes[index].data < nodes[parent].data) {
                swap(nodes[index], nodes[parent]);
                index = parent;
            }
            else {
                return;
            }
        }
    }
    void Insert(int x, int n) {
        nodes[h_size].data = x;
        nodes[h_size].num = n;
        helpNodes[nodes[h_size].num] = x;
        this->Up(h_size);
        ++this->h_size;
    }
    void extract_min() {
        helpNodes[nodes[0].num] = -1;
        swap(nodes[0], nodes[h_size - 1]);
        --this->h_size;
        this->Down(0);
    }
    void Change(int i, int x) {
        if (helpNodes[i] == -1) {
            cout << "error" << endl;
            return;
        }
        int q = 0;
        for (; q < h_size && nodes[q].num != i; ++q) {}
        if (h_size != 0 && q < h_size && nodes[q].num == i) {
            nodes[q].data = x;
            helpNodes[nodes[q].num] = x;
            this->Up(q);
            this->Down(q);
            cout << "ok" << endl;
        }
        else {
            cout << "error" << endl;
        }
    }
    void Delete(int i) {
        if (helpNodes[i] == -1) {
            cout << "error" << endl;
            return;
        }
        int q = 0;
        for (; q < h_size && nodes[q].num != i; ++q) {}
        if (h_size != 0 && q < h_size && nodes[q].num == i) {
            nodes[q].data = -1;
            helpNodes[nodes[q].num] = -1;
            this->Up(q);
            swap(nodes[0], nodes[h_size - 1]);
            --h_size;
            this->Down(0);
            cout << "ok" << endl;
        }
        else {
            cout << "error" << endl;
        }
    }
    void Clear() {
        while (h_size) {
            this->extract_min();
        }
    }
};
void Initheap(Heap* h)
{
    h->helpNodes = new int[200000];
    h->nodes = new Node[200000];
    h->h_size = 0;
}
READ ALSO
Форматированный ввод бинарного файла

Форматированный ввод бинарного файла

Открываю файл в бинарном режиме, но при этом форматированный ввод с помощью >> компилируетсяКакое поведение ожидать от такого кода с т

155
Читает строки из файла через раз [дубликат]

Читает строки из файла через раз [дубликат]

Проблема такая: есть файл, где данные записаны сплошным столбикомСначала имя, потом возраст

156
с++ вывод в виде таблицы

с++ вывод в виде таблицы

Никак не могу понять, почему таблица отображается некорректно

272
regex - как правильно убрать вложенные скобки?

regex - как правильно убрать вложенные скобки?

Есть строка, в которой встречаются такие вещи, как ((число)

272