青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-162  評(píng)論-223  文章-30  trackbacks-0
   本文講述雙端堆的5個(gè)公開泛型操作算法:make_dheap(原位構(gòu)造雙端堆)、push_dheap(插入元素)、pop_max_dheap(刪除最大元素)、pop_min_dheap(刪除最小元素),is_dheap(堆驗(yàn)證),每個(gè)算法都提供<小于運(yùn)算符和仿函數(shù)比較2個(gè)版本,要注意的是比較必須是嚴(yán)格弱序的,即對(duì)于<版本存在a<b為真且b<a為假;對(duì)于仿函數(shù)版本,則存在comp(a,b)為真且comp(b,a)為假。而基于雙端堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列只是調(diào)用對(duì)應(yīng)的泛型算法而已。代碼如下:
1、構(gòu)造堆
 1template<typename _RandIt>
 2inline void make_dheap(_RandIt _first,_RandIt _last)
 3{
 4    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
 5    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
 6
 7    _Distance _len = _last - _first;
 8    if (2 > _len) return;
 9
10    _Distance _bottom = _len - 1,_half = _bottom >> 1,_index,_part;
11    _index = __partner_dheap(_bottom);
12    _index > _bottom ? _index = ((_index - 2>> 1+ 1 : _index += 1;
13
14    for (;_index <= _bottom;++_index)
15    {
16        _part = __partner_dheap(_index);
17        if (__is_max_dheap(_index))
18        {
19            if (*(_first + _index) < *(_first + _part))
20                std::swap(*(_first + _index),*(_first + _part));
21        }

22        else
23        {
24            if (_part > _bottom) _part = (_part - 2>> 1;
25            if (*(_first + _part) < *(_first + _index))
26                std::swap(*(_first + _index),*(_first + _part));
27        }

28    }

29    if (0 >= _half) return;
30
31    for (_index = _half - 1; _index >= 0--_index)
32    {    
33        __adjust_dheap(_first,_len,_index,*(_first + _index),false);
34    }

35}

36
37template<typename _RandIt,typename _Compare>
38inline void make_dheap(_RandIt _first,_RandIt _last,_Compare _comp)
39{
40    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
41    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
42
43    _Distance _len = _last - _first;
44    if (2 > _len) return;
45
46    _Distance _bottom = _len - 1,_half = _bottom >> 1,_index,_part;
47    _index = __partner_dheap(_bottom);
48    _index > _bottom ? _index = ((_index - 2>> 1+ 1 : _index += 1;
49
50    for (;_index <= _bottom;++_index)
51    {
52        _part = __partner_dheap(_index);
53        if (__is_max_dheap(_index))
54        {
55            if (_comp(*(_first + _index),*(_first + _part)))
56                std::swap(*(_first + _index),*(_first + _part));
57        }

58        else
59        {
60            if (_part > _bottom) _part = (_part - 2>> 1;
61            if (_comp(*(_first + _part),*(_first + _index)))
62                std::swap(*(_first + _index),*(_first + _part));
63        }

64    }

65    if (0 >= _half) return;
66
67    for (_index = _half - 1; _index >= 0--_index)
68    {    
69        __adjust_dheap(_first,_len,_index,*(_first + _index),_comp,false);
70    }

71}
   2、插入元素
 1template<typename _RandIt>
 2inline void push_dheap(_RandIt _first,_RandIt _last)
 3{
 4    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
 5    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
 6
 7    _Distance _dist = _last - _first;
 8    if (2 > _dist) return;
 9
10    _Value _val = *(_last - 1);
11    _Distance _bottom = _dist - 1, _part = __partner_dheap(_bottom);
12    if (__is_max_dheap(_bottom))
13    {
14        if (*(_first + _bottom) < *(_first + _part))
15        {
16            *(_first + _bottom) = *(_first + _part);
17            __push_min_dheap(_first,_part,(_Distance)0,_val);
18        }

19        else
20        {
21            __push_max_dheap(_first,_bottom,(_Distance)1,_val);
22        }

23    }

24    else
25    {
26        if (_part > _bottom) _part = (_part - 2>> 1
27        if (*(_first + _bottom) < *(_first + _part))
28        {
29            __push_min_dheap(_first,_bottom,(_Distance)0,_val);
30        }

31        else
32        {
33            *(_first + _bottom) = *(_first + _part);
34            __push_max_dheap(_first,_part,(_Distance)1,_val);
35        }

36    }

37}

38
39template<typename _RandIt,typename _Compare>
40inline void push_dheap(_RandIt _first,_RandIt _last,_Compare _comp)
41{
42    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
43    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
44
45    _Distance _dist = _last - _first;
46    if (2 > _dist) return;
47
48    _Value _val = *(_last - 1);
49    _Distance _bottom = _dist - 1, _part = __partner_dheap(_bottom);
50    if (__is_max_dheap(_bottom))
51    {
52        if (_comp(*(_first + _bottom),*(_first + _part)))
53        {
54            *(_first + _bottom) = *(_first + _part);
55            __push_min_dheap(_first,_part,(_Distance)0,_val,_comp);
56        }

57        else
58        {
59            __push_max_dheap(_first,_bottom,(_Distance)1,_val,_comp);
60        }

61    }

62    else
63    {
64        if (_part > _bottom) _part = (_part - 2>> 1
65        if (_comp(*(_first + _bottom),*(_first + _part)))
66        {
67            __push_min_dheap(_first,_bottom,(_Distance)0,_val,_comp);
68        }

69        else
70        {
71            *(_first + _bottom) = *(_first + _part);
72            __push_max_dheap(_first,_part,(_Distance)1,_val,_comp);
73        }

74    }

75}
   3、刪除最小元素  
 1template<typename _RandIt>
 2inline void pop_min_dheap(_RandIt _first,_RandIt _last)
 3{
 4    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
 5    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
 6
 7    _Distance _len = _last - _first;
 8    if (2 > _len) return;
 9
10    _Value _val = *(_last - 1); *(_last - 1= *_first;
11    __adjust_min_dheap(_first,_len - 1,0,_val);
12}

13
14template<typename _RandIt,typename _Compare>
15inline void pop_min_dheap(_RandIt _first,_RandIt _last,_Compare _comp)
16{
17    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
18    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
19
20    _Distance _len = _last - _first;
21    if (2 > _len) return;
22
23    _Value _val = *(_last - 1); *(_last - 1= *_first;
24    __adjust_min_dheap(_first,_len - 1,0,_val,_comp);
25}
   4、刪除最大元素

 1template<typename _RandIt>
 2inline void pop_max_dheap(_RandIt _first,_RandIt _last)
 3{
 4    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
 5    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
 6
 7    _Distance _len = _last - _first;
 8    if (2 > _len) return;
 9
10    _Value _val = *(_last - 1); *(_last - 1= *(_first + 1);
11    __adjust_max_dheap(_first,_len - 1,1,_val);
12}

13
14template<typename _RandIt,typename _Compare>
15inline void pop_max_dheap(_RandIt _first,_RandIt _last,_Compare _comp)
16{
17    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
18    typedef typename std::iterator_traits<_RandIt>::value_type _Value;
19
20    _Distance _len = _last - _first;
21    if (2 > _len) return;
22
23    _Value _val = *(_last - 1); *(_last - 1= *(_first + 1);
24    __adjust_max_dheap(_first,_len - 1,1,_val,_comp);
25}

   5、堆驗(yàn)證
  1template<typename _RandIt>
  2inline bool is_dheap(_RandIt _first,_RandIt _last)
  3{
  4    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
  5
  6    _Distance _parent, _child, _part,_dist = _last - _first;
  7    if (2 > _dist) return true;
  8
  9    _Distance _bottom = _dist - 1, _half = _bottom >> 1;
 10    for (_parent = 0; _parent < _half; ++_parent)
 11    {
 12        _child = (_parent + 1<< 1;
 13        if (__is_max_dheap(_parent))
 14        {
 15            if (*(_first + _parent) < *(_first + _child))
 16                return false;
 17            if (_child < _bottom)
 18            {
 19                if (++_child <= _bottom && *(_first + _parent) < *(_first + _child))
 20                    return false;
 21            }

 22        }

 23        else
 24        {
 25            if (*(_first + _child) < *(_first + _parent))
 26                return false;
 27            if (_child < _bottom)
 28            {
 29                if (++_child <= _bottom && *(_first + _child) < *(_first + _parent))
 30                    return false;
 31            }

 32            _part = __partner_dheap(_parent);
 33            if (_part > _bottom) _part = ( _part - 2>> 1;
 34            if (*(_first + _part) < *(_first + _parent))
 35                return false;
 36        }

 37    }

 38    _parent = __partner_dheap(_bottom);
 39    if (_parent > _bottom) _parent = ((_parent - 2>> 1+ 1;
 40    else _parent += 1;
 41
 42    for (; _parent <= _bottom; ++_parent)
 43    {
 44        _part = __partner_dheap(_parent);
 45        if (__is_max_dheap(_parent))
 46        {
 47            if (*(_first + _parent) < *(_first + _part))
 48                return false;
 49        }

 50        else
 51        {
 52            if (_part > _bottom) _part = (_part - 2>> 1;
 53            if (*(_first + _part) < *(_first + _parent))
 54                return false;
 55        }

 56    }

 57    return true;
 58}

 59
 60template<typename _RandIt,typename _Compare>
 61inline bool is_dheap(_RandIt _first,_RandIt _last,_Compare _comp)
 62{
 63    typedef typename std::iterator_traits<_RandIt>::difference_type _Distance;
 64
 65    _Distance _parent, _child, _part,_len = _last - _first;
 66    if (2 > _len) return true;
 67
 68    _Distance _bottom = _len - 1, _half = _bottom >> 1;
 69    for (_parent = 0; _parent < _half; ++_parent)
 70    {
 71        _child = (_parent + 1<< 1;
 72        if (__is_max_dheap(_parent))
 73        {
 74            if (_comp(*(_first + _parent),*(_first + _child)))
 75                return false;
 76            if (_child < _bottom)
 77            {
 78                if (++_child <= _bottom && _comp(*(_first + _parent),*(_first + _child)))
 79                    return false;
 80            }

 81        }

 82        else
 83        {
 84            if (_comp(*(_first + _child),*(_first + _parent)))
 85                return false;
 86            if (_child < _bottom)
 87            {
 88                if (++_child <= _bottom && _comp(*(_first + _child),*(_first + _parent)))
 89                    return false;
 90            }

 91            _part = __partner_dheap(_parent);
 92            if (_part > _bottom) _part = ( _part - 2>> 1;
 93            if (_comp(*(_first + _part),*(_first + _parent)))
 94                return false;
 95        }

 96    }

 97    _parent = __partner_dheap(_bottom);
 98    if (_parent > _bottom) _parent = ((_parent - 2>> 1+ 1;
 99    else _parent += 1;
100
101    for (; _parent <= _bottom; ++_parent)
102    {
103        _part = __partner_dheap(_parent);
104        if (__is_max_dheap(_parent))
105        {
106            if (_comp(*(_first + _parent),*(_first + _part)))
107                return false;
108        }

109        else
110        {
111            if (_part > _bottom) _part = (_part - 2>> 1;
112            if (_comp(*(_first + _part),*(_first + _parent)))
113                return false;
114        }

115    }

116    return true;
117}
   6、優(yōu)先級(jí)隊(duì)列  
 1template<typename _Ty,
 2    class _Container= std::vector<_Ty>,
 3    class _Compare = std::less<typename _Container::value_type> 
 4    > 
 5class priority_queue
 6{
 7    typedef typename _Container::iterator iterator;
 8    typedef typename _Container::const_iterator const_iterator;
 9
10public:
11    typedef typename _Container::value_type value_type;
12    typedef typename _Container::reference reference;
13    typedef typename _Container::const_reference const_reference;
14    typedef typename _Container::size_type size_type;
15    typedef typename _Container::difference_type difference_type; 
16
17public:
18    priority_queue(const _Container& _c =_Container(),const _Compare& _comp = _Compare())
19        :c_(_c),comp_(_comp)
20    {
21        make_dheap(c_.begin(),c_.end(),comp_);
22    }

23    template<typename _Iter>
24    priority_queue(_Iter _first,_Iter _last,const _Compare& _comp = _Compare())
25        :c_(_first,_last),comp_(_comp)
26    {
27        make_dheap(c_.begin(),c_.end(),comp_);
28    }

29    template<typename _Iter>
30    priority_queue(_Iter _first,_Iter _last,const _Container& _c =_Container(),const _Compare& _comp = _Compare())
31        :c_(_c),comp_(_comp)
32    {
33        c_.insert(c_.end(),_first,_last);
34        make_dheap(c_.begin(),c_.end(),comp_);
35    }

36    void push(const value_type& val)
37    {
38        c_.push_back(val);        
39        push_dheap(c_.begin(),c_.end(),comp_);
40    }

41    void pop_min()
42    {
43        pop_min_dheap(c_.begin(),c_.end(),comp_);
44        c_.pop_back();
45    }

46    void pop_max()
47    {
48        pop_max_dheap(c_.begin(),c_.end(),comp_);
49        c_.pop_back();
50    }

51    const_reference top_min() const
52    {
53        return c_.front();
54    }

55    const_reference top_max() const
56    {
57        if (1==c_.size()) return c_.front();
58        return *(c_.begin()+1);
59    }

60    size_type size() const
61    {
62        return c_.size();
63    }

64    bool empty() const
65    {
66        return c_.empty();
67    }

68
69private:
70    _Container  c_;
71    _Compare   comp_;
72}
;
posted on 2011-10-05 13:24 春秋十二月 閱讀(2641) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Algorithm

評(píng)論:
# re: 基于順序存儲(chǔ)實(shí)現(xiàn)的多叉樹:(7) 深度遍歷 2011-10-06 17:10 | 雙星休閑鞋
一段時(shí)間沒有接觸,都是迷迷糊糊的。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久一区二区三区国产精品| 欧美福利精品| 亚洲影视九九影院在线观看| 香蕉av福利精品导航| 亚洲欧洲日本国产| 午夜久久tv| 国产精品久久久久久久久免费| 亚洲人体影院| 欧美国产日韩精品| 91久久久久久| 欧美国产先锋| 艳妇臀荡乳欲伦亚洲一区| 日韩一级黄色大片| 欧美一级理论性理论a| 欧美人与性禽动交情品| 亚洲国产精品成人一区二区| 久久久久成人精品| 欧美一区二区免费视频| 国产精品麻豆成人av电影艾秋| 日韩一级不卡| 亚洲精品永久免费精品| 欧美日韩成人网| 亚洲久久一区二区| 亚洲欧洲日本mm| 欧美电影打屁股sp| 夜夜嗨av一区二区三区网站四季av | 老司机精品视频网站| 激情综合亚洲| 久久亚洲视频| 免费观看一区| 在线亚洲成人| 亚洲综合丁香| 国产主播一区| 欧美成人免费va影院高清| 欧美高清hd18日本| 一区二区免费在线视频| 中文国产成人精品| 国产一区二区三区四区五区美女| 久久免费视频观看| 欧美日本二区| 欧美一区二区三区精品| 久久性天堂网| 亚洲一区在线直播| 久久久久9999亚洲精品| 亚洲精品中文字| 中日韩高清电影网| 在线观看日韩av| 99riav久久精品riav| 国产一区二区三区成人欧美日韩在线观看| 久久一区二区三区av| 欧美日韩精品| 麻豆国产精品777777在线| 欧美成人在线影院| 欧美一区二区精品在线| 牛牛影视久久网| 西西裸体人体做爰大胆久久久| 久久久久九九九| 亚洲免费视频成人| 免费人成精品欧美精品| 午夜老司机精品| 欧美成人网在线| 久久久久综合| 国产精品日韩专区| 亚洲人成网站影音先锋播放| 国产婷婷一区二区| 亚洲国产成人av| 久久久久久夜精品精品免费| 久久综合色综合88| 欧美一区二区三区久久精品茉莉花| 久久久久久久久久久一区| 亚洲一区久久久| 亚洲精品孕妇| 亚洲精品国产欧美| 欧美极品影院| 在线综合亚洲欧美在线视频| 一本在线高清不卡dvd| 国产精品家教| 久久久xxx| 久久综合网hezyo| 日韩性生活视频| 日韩一级视频免费观看在线| 国产精品日韩欧美一区| 久久久久欧美精品| 免费在线看成人av| 中文日韩电影网站| 亚洲午夜精品一区二区三区他趣| 国产欧美日韩一区二区三区| 久久一区中文字幕| 欧美国产视频一区二区| 亚洲欧美国产另类| 久久精品女人的天堂av| 日韩视频免费大全中文字幕| 亚洲小说春色综合另类电影| 韩国av一区二区三区| 亚洲精品国产精品乱码不99按摩| 国产精品二区在线| 欧美大片一区二区| 国产精品青草久久| 欧美黄色影院| 国产欧美日韩免费| 亚洲人妖在线| 黑丝一区二区三区| 一区二区三区四区在线| 亚洲福利视频免费观看| 亚洲一区国产视频| 亚洲欧洲另类国产综合| 亚洲女女女同性video| 亚洲日本aⅴ片在线观看香蕉| 亚洲性图久久| 亚洲三级视频| 久久午夜电影| 久久黄色网页| 欧美午夜国产| 亚洲欧洲日产国码二区| 精品91视频| 午夜日韩在线观看| 亚洲影院免费观看| 欧美激情在线播放| 欧美黑人国产人伦爽爽爽| 国产亚洲精品久久久久动| 日韩亚洲视频| 日韩视频一区二区三区在线播放| 欧美在线日韩| 欧美在线观看你懂的| 欧美视频网址| 亚洲毛片在线观看.| 亚洲日本成人在线观看| 久久亚洲欧美国产精品乐播| 久久久久久久久久久成人| 亚洲亚洲精品三区日韩精品在线视频| 欧美啪啪一区| 欧美国产精品中文字幕| 国产一区二区三区黄视频| 中日韩美女免费视频网站在线观看| 亚洲精品国产精品乱码不99按摩| 欧美专区在线| 久久女同互慰一区二区三区| 国产麻豆一精品一av一免费| 一区二区三区国产| 中文日韩电影网站| 国产精品伦一区| 亚洲欧美精品在线| 久久大逼视频| 国产一区二区精品久久99| 亚洲欧美日韩成人高清在线一区| 午夜精品视频| 国产有码在线一区二区视频| 久久精品一区二区三区中文字幕| 美女黄毛**国产精品啪啪| 亚洲高清av| 欧美日韩精品是欧美日韩精品| 亚洲精选国产| 性18欧美另类| 伊人久久综合| 欧美日韩福利在线观看| 亚洲一本视频| 美女视频黄a大片欧美| 亚洲国产精品久久久久婷婷老年| 欧美刺激午夜性久久久久久久| 亚洲另类在线视频| 欧美一区二区三区免费看| 狠狠噜噜久久| 欧美人与性动交cc0o| 性色av一区二区三区在线观看| 老司机成人在线视频| 日韩视频在线免费观看| 国产精品日本一区二区| 久久久久国产一区二区| 亚洲精品一品区二品区三品区| 亚洲综合精品一区二区| 伊人久久久大香线蕉综合直播| 欧美另类一区| 欧美主播一区二区三区美女 久久精品人| 久久婷婷av| 一区二区三区成人| 国语自产精品视频在线看抢先版结局 | 有码中文亚洲精品| 欧美精选午夜久久久乱码6080| 宅男噜噜噜66一区二区66| 久久精品一区二区| 99这里有精品| 伊人久久av导航| 国产欧美精品国产国产专区| 欧美成人免费小视频| 欧美亚洲三区| 一本色道久久综合狠狠躁篇怎么玩| 久久久综合网| 欧美亚洲色图校园春色| 日韩亚洲欧美高清| 伊人久久婷婷色综合98网| 国产精品福利片| 欧美sm视频| 久久久国产一区二区三区| 欧美一区二区三区精品电影| 日韩一二三区视频| 伊人婷婷欧美激情| 欧美日韩一二三区| 裸体丰满少妇做受久久99精品| 亚洲一区久久久| 亚洲激情六月丁香|