2013-10-15 4 views
1

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

ответ

0

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

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

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

Смежные вопросы