• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            ACM___________________________

            ______________白白の屋
            posts - 182, comments - 102, trackbacks - 0, articles - 0
            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(24)

            隨筆分類(332)

            隨筆檔案(182)

            FRIENDS

            搜索

            積分與排名

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            學習筆記 -- 關于 STL 中的 heap ( 堆 )

            Posted on 2010-09-01 17:18 MiYu 閱讀(4201) 評論(3)  編輯 收藏 引用 所屬分類: ACM_資料

            MiYu原創(chuàng), 轉(zhuǎn)帖請注明 : 轉(zhuǎn)載自 ______________白白の屋    

             

            C ++  STL 中與heap 有關的操作有 如下幾個 :

             

            make_heap(),   pop_heap(),  push_heap(),  sort_heap(),  is_heap; 

             

            is_heap() :

             

            原型如下 :

                 1. bool is_heap(iterator start, iterator end); 

               ->判斷迭代器[start, end] 區(qū)間類的元素是否構(gòu)成一個堆.  是返回true ,否則返回 false.

            2. bool is_heap(iterator start, iterator end, StrictWeakOrdering cmp); 

                ->判斷迭代器[start, end] 區(qū)間類的元素在cmp條件下是否構(gòu)成一個堆. 是返回true ,否則返回 false.

             

            make_heap() :

             

             原型如下 :

            1. void make_heap( random_access_iterator start, random_access_iterator end );

            2. void make_heap( random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp ); 

              ->以 迭代器[start , end] 區(qū)間內(nèi)的元素生成一個堆. 默認使用 元素類型 的 操作符 進行判斷堆的類型, 因此生成的是大頂堆 .

            ->當使用了 版本2時, 系統(tǒng)使用 用戶定義的 cmp 函數(shù)來構(gòu)建一個堆 

              ->值得注意的是,  make_heap 改變了 迭代器所指向的 容器 的值.

             

             pop_heap() :

             

             原型如下 :

            1.  void pop_heap( random_access_iterator start, random_access_iterator end );

            2.  void pop_heap( random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp );

               ->pop_heap() 并不是真的把最大(最小)的元素從堆中彈出來. 而是重新排序堆. 它首元素末元素交換,然后將[first,last-1)的數(shù)據(jù)再做成一個堆。 

                 此時, 原來的 首元素 位于迭代器 end-1 的位置,  它已不再屬于堆的一員!  

               ->如果使用了 版本2 , 在交換了 首元素末元素后 ,使用 cmp 規(guī)則 重新構(gòu)建一個堆.

             

             push_heap() :

             

            原型如下 :

            1.   void push_heap( random_access_iterator start, random_access_iterator end );

              2.   void push_heap( random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp ); 

                -> 算法假設迭代器區(qū)間[start, end-1)內(nèi)的元素已經(jīng)是一個有效堆, 然后把 end-1 迭代器所指元素加入堆. 

                -> 如果使用了 cmp 參數(shù), 將使用 cmp 規(guī)則構(gòu)建堆.

             

            sort_heap() : 

             

            原型如下 :

              1. void sort_heap (random_access_iterator start, random_access_iterator end);

            2. void sort_heap (random_access_iterator start, random_access_iterator end, StrictWeakOrdering cmp); 

              -> 堆結(jié)構(gòu)被完全破壞, 相當于對元素進行排序, 效果和排序算法類似.  

            -> 如果使用了 cmp 參數(shù), 將使用 cmp 規(guī)則排序堆. 

             

            代碼示例 : 

             代碼

            /*
            MiYu原創(chuàng), 轉(zhuǎn)帖請注明 : 轉(zhuǎn)載自 ______________白白の屋
                      
            http://www.cnblog.com/MiYu
            Author By : MiYu
            Test      : 1
            Program   : heap_test
            */

            #include 
            <iostream>
            #include 
            <algorithm>
            #include 
            <vector>
            using namespace std;
            int main ()
            {
                vector 
            <int> vec;
                
            for ( int i = 1; i <= 10++i ) vec.push_back(i);
                
            for ( int i = 0; i < 10++ i ){
                     cout 
            << vec[i] << " ";   
                } cout 
            << endl;
                make_heap ( vec.begin(), vec.end() );
                cout 
            << "\nAfter Make_Heap: " << endl;
                
            for ( int i = 0; i < 10++i ){
                     cout 
            << vec[i] << " ";   
                } cout 
            << endl;
                vec.push_back ( 
            11 );
                cout 
            << "\nAfter Push_Heap: " << endl;
                push_heap (  vec.begin(), vec.end() );
                
            for ( int i = 0; i < 10++i ){
                     cout 
            << vec[i] << " ";   
                } cout 
            << endl;
                cout 
            << "\nAfter Pop_Heap: " << endl;
                pop_heap ( vec.begin(), vec.end() );
                
            for ( int i = 0; i < 11++i ){
                     cout 
            << vec[i] << " ";   
                } cout 
            << endl;
                cout 
            << "\nMake_heap Again! " << endl;
                make_heap ( vec.begin(), vec.end() );
                cout 
            << "\nAfter Sort_Heap: " << endl;
                sort_heap ( vec.begin(), vec.end() );
                
            for ( int i = 0; i < 11++i ){
                     cout 
            << vec[i] << " ";   
                } cout 
            << endl;
                system ( 
            "pause" );
                
            return 0;    

             

            OutPut:

            1 2 3 4 5 6 7 8 9 10

            After Make_Heap:
            10 9 7 8 5 6 3 1 4 2

            After Push_Heap:
            11 10 7 8 9 6 3 1 4 2

            After Pop_Heap:
            10 9 7 8 5 6 3 1 4 2 11

            Make_heap Again!

            After Sort_Heap:
            1 2 3 4 5 6 7 8 9 10 11

             

             

             

             

            #include <iostream>
            #include <algorithm>
            #include <vector>
            using namespace std;
             
            int main () {
              int myints[] = {10,20,30,5,15};
              vector<int> v(myints,myints+5);
              vector<int>::iterator it;
             
              make_heap (v.begin(),v.end());
              cout << "initial max heap   : " << v.front() << endl;
             
              pop_heap (v.begin(),v.end()); v.pop_back();
              cout << "max heap after pop : " << v.front() << endl;
             
              v.push_back(99); push_heap (v.begin(),v.end());
              cout << "max heap after push: " << v.front() << endl;
             
              sort_heap (v.begin(),v.end());
             
              cout << "final sorted range :";
              for (unsigned i=0; i<v.size(); i++) cout << " " << v[i];
             
              cout << endl;
             
              return 0
            
            } 
            OutPut :

            initial max heap : 30

            max heap after pop : 20

            max heap after push: 99

            final sorted range : 5 10 15 20 99


            Feedback

            # re: 學習筆記 -- 關于 STL 中的 heap ( 堆 )  回復  更多評論   

            2010-09-08 16:28 by Tanky Woo
            小白啊。你最近不行了。。。

            墮落了啊。。。

            最近怎么不A題了。。。

            害哥把你越甩越遠了。。。

            # re: 學習筆記 -- 關于 STL 中的 heap ( 堆 )  回復  更多評論   

            2010-09-10 22:31 by MiYu
            題目都好難 做不出來 , 我在看數(shù)據(jù)結(jié)構(gòu)方面的 T.T

            # re: 學習筆記 -- 關于 STL 中的 heap ( 堆 )  回復  更多評論   

            2011-05-12 14:37 by 呢喃的歌聲
            這篇異常給力
            轉(zhuǎn)走了。
            久久久噜噜噜久久中文字幕色伊伊| 久久久国产亚洲精品| WWW婷婷AV久久久影片| 国产福利电影一区二区三区久久久久成人精品综合 | 精品国产青草久久久久福利| 久久精品中文字幕无码绿巨人| 久久免费视频观看| 久久久久波多野结衣高潮| 亚洲国产精品婷婷久久| 久久精品国产免费观看 | 亚洲狠狠久久综合一区77777| 亚洲国产成人精品久久久国产成人一区二区三区综 | 婷婷久久综合九色综合九七| 精品国产一区二区三区久久久狼| 久久综合九色综合欧美就去吻| 久久夜色精品国产噜噜亚洲AV| 久久综合视频网站| 久久精品a亚洲国产v高清不卡| 亚洲国产精品成人久久蜜臀 | 女同久久| 国产精品成人久久久久久久| 国内精品久久久久影院一蜜桃| 国内精品人妻无码久久久影院导航| 国产综合成人久久大片91| 精品免费tv久久久久久久| 久久ZYZ资源站无码中文动漫| 狠狠色丁香久久婷婷综合| 久久人人爽人人爽人人片AV高清 | 91精品国产9l久久久久| 久久久无码精品亚洲日韩按摩| 国产成人精品综合久久久| 色婷婷综合久久久久中文字幕| 久久九色综合九色99伊人| 久久久青草久久久青草| 久久99热狠狠色精品一区| 亚洲成人精品久久| 青青草原综合久久大伊人导航| 欧美一级久久久久久久大| 久久天天躁狠狠躁夜夜2020一| 久久WWW免费人成一看片| 久久国产乱子伦免费精品|