簡體   English   中英

下面的比較器在建立最小堆時如何工作?

[英]How does the following comparator even works while building up the min heap?

我知道,如果我使用STL構建堆,則會生成max_heap。 如果要創建min_heap,則必須編寫自己的自定義比較器。 現在,下面的比較器

struct greater1{
  bool operator()(const long& a,const long& b) const{
    return a>b;
  }
};

int main() {
  std::vector<long> humble;
  humble.push_back(15);
  humble.push_back(15);
  humble.push_back(9);
  humble.push_back(25);

  std::make_heap(humble.begin(), humble.end(), greater1());
  while (humble.size()) {
    std::pop_heap(humble.begin(),humble.end(),greater1());
    long min = humble.back();
    humble.pop_back();  
    std::cout << min << std::endl;
  }

  return 0;
}

上面的代碼是我從互聯網上獲得的。 我只是有一個疑問。 比較器實際上如何工作。 據我了解,不應該這樣, return a < b因為我們希望最小的元素在前面,然后在堆中更大的元素。 為什么return a > b 這不是意味着, if (a>b) ,則返回true,並且a將在b之前放入堆中,因此將較大的元素放在較小的元素之前?

我認為您對比較器語義和堆語義之間的聯系了解得太多了。 請記住,容器的內部細節和結構是故意從您那里抽象出來的,因此,當您開始嘗試根據您認為max_heap的內部結構的外觀對此進行合理化時,您就被帶走了。

在標准庫中,默認比較器始終 less-than 如果要在特定容器/算法中進行排序的元素之間的關系不less-than ,則容器/算法將足夠聰明以進行該轉換(在這種情況下,對於通常的實現,只需簡單地以相反的順序傳遞操作數,像cmp(b,a) !)。 但是,從根本上講,它將始終以less-than順序開頭,因為這是所采用的一致慣例。

因此,要反轉容器的順序,無論容器實現的物理布局(您認為)是什么,您都將使用less-than比較器並將其變為greater-than比較器。

此外,順便說一句,為了回應新月形面包的評論,我會花long的時間…,實際上,僅使用std::greater而不是重新創建它。

標准堆的構建方式是,對於每個元素a及其子b ,比較cmp(b,a)成立,其中cmp是提供的比較器。 請注意, cmp的第一個參數是child (或者,從內部表示抽象,標准的方法是,使cmp(top, other)是用於第一元件真top和任何其他other )。

顯然,這樣做是為了使默認比較器(“較少”)建立最大堆。

因此,您需要提供一個比較器,當提供第一個參數作為子代時,您想返回true。 對於最小堆,這將是“更大”的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM