2013-10-15 27 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測試嗎?