Извините, если терминология в названии была выключена. Я пытаюсь лучше понять условия, используя их чаще.Самый эффективный способ реализации операции 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);
}