Наиболее эффективный способ реализации операции trickledown в троичной куче

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

Во всяком случае, в настоящее время я работаю над лабораторией в классе структур данных (с использованием C ++), где мне нужно построить тернарную кучу и сравнить ее с уже предоставленной нам двоичной кучей. Поскольку у меня есть дополнительное время, я хотел сгладить некоторые детали в моем коде, чтобы он работал максимально эффективно.

Больше всего меня беспокоит количество утверждений if-else, которые я использую. Мне действительно потребовалось десять минут, чтобы организовать их макет на бумаге, чтобы не запутаться. (Я не жалуюсь, я просто не знаю, лучший ли это подход к проблеме или нет.)

template<class T>
void TernaryHeap<T>::trickleDown(int i) {
do {
int j = -1;

int r = right(i);
if (r < n && compare(a[r], a[i]) < 0) {

int l = left(i);
if (compare(a[l], a[r]) < 0) {
j = l;
} else {
j = r;
}

int m = mid(i);
if (compare(a[m], a[r]) < 0) {
j = m;
} else {
j = r;
}

} else {

int l = left(i);
if (l < n && compare(a[l], a[i]) < 0) {

int m = mid(i);
if (compare(a[m], a[l]) < 0) {
j = m;
} else {
j = l;
}
}
}
if (j >= 0) a.swap(i, j);
i = j;
} while (i >= 0);
}

1

Решение

Как бы вы нашли самый маленький элемент в массиве из 2 элементов? Вы, вероятно, обнаружите, что один if-else достаточно.

Теперь сделайте то же самое для массива из 3 элементов. Вы просто добавляете больше условных выражений? Или вы просто пишете универсальный алгоритм, который обрабатывает массивы любого размера?

Ваш алгоритм sift-down выполняется в два этапа: найдите самый маленький элемент, а затем поменяйте его местами с текущим элементом. Вы преобразовали двоичную кучу в троичную кучу, просто добавив больше тестов, когда вам, вероятно, следовало бы пойти с более общим решением. Что делать, если вы идете в 4-арную кучу? Будете ли вы добавить еще больше if-else тесты?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]