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

隨筆-162  評(píng)論-223  文章-30  trackbacks-0
   本文講述雙端堆的5個(gè)公開(kāi)泛型操作算法: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 春秋十二月 閱讀(2640) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): Algorithm

評(píng)論:
# re: 基于順序存儲(chǔ)實(shí)現(xiàn)的多叉樹(shù):(7) 深度遍歷 2011-10-06 17:10 | 雙星休閑鞋
一段時(shí)間沒(méi)有接觸,都是迷迷糊糊的。  回復(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人在线观看导航 | 久久国产福利| 久久尤物视频| 欧美日韩一区二区免费视频| 国产精品久久久久久模特| 国产亚洲一区二区三区在线观看| 在线不卡a资源高清| 99精品热视频| 久久久久国产精品厨房| 亚洲第一在线综合在线| 亚洲区一区二| 久久国产精品99国产精| 欧美日本不卡高清| 狠狠色综合色区| 中文亚洲免费| 欧美第一黄色网| 国产女人精品视频| 亚洲一级高清| 鲁大师影院一区二区三区| 欧美天天影院| 亚洲大片免费看| 欧美尤物一区| 99精品视频一区二区三区| 欧美在线播放高清精品| 欧美视频免费在线| 亚洲人成在线观看| 久久午夜色播影院免费高清| 一区二区三区四区国产精品| 久久综合九色综合欧美就去吻| 欧美日韩在线视频观看| 在线播放中文一区| 久久久久久久综合日本| 一本色道久久加勒比精品| 米奇777超碰欧美日韩亚洲| 国产日韩欧美在线播放不卡| 亚洲一区二区精品| 亚洲精品在线二区| 久久中文字幕一区| 伊人伊人伊人久久| 久久九九99视频| 午夜国产精品视频| 国产精品五区| 欧美一区二区在线视频| 亚洲女爱视频在线| 国产女人18毛片水18精品| 欧美一区二区私人影院日本| 亚洲欧美电影在线观看| 国产精品日韩欧美综合 | 亚洲欧美日韩在线| 一区二区三区视频免费在线观看| 欧美极品在线播放| 日韩亚洲欧美成人一区| 欧美成人首页| 欧美成人乱码一区二区三区| 亚洲国产一区二区三区在线播 | 美国成人毛片| 久久免费精品日本久久中文字幕| 韩日视频一区| 亚洲国产二区| 欧美日韩亚洲一区三区| 午夜电影亚洲| 先锋亚洲精品| 亚洲国产成人精品久久| 免费亚洲电影在线| 欧美黄色一级视频| 亚洲在线视频观看| 欧美一区二区三区免费大片| 黄色一区二区在线观看| 欧美大片一区二区三区| 欧美激情亚洲综合一区| 午夜精品成人在线视频| 久久xxxx| 欧美在线三级| 久久久综合网| 亚洲精品欧洲| 亚洲制服av| 狠狠综合久久av一区二区小说| 久久综合色婷婷| 欧美人成网站| 久久精品亚洲国产奇米99| 久久天天躁狠狠躁夜夜av| 99精品视频免费| 午夜精品区一区二区三| 在线日本高清免费不卡| 91久久夜色精品国产九色| 国产精品欧美久久久久无广告| 久久亚洲私人国产精品va媚药| 欧美顶级艳妇交换群宴| 欧美中文字幕视频| 欧美人妖在线观看| 美女福利精品视频| 国产麻豆综合| 亚洲精选中文字幕| 国内一区二区三区在线视频| 亚洲伦理自拍| 一区二区三区在线高清| 一区二区三区日韩精品视频| 亚洲国产va精品久久久不卡综合| 中文欧美在线视频| 91久久精品国产91性色| 欧美一区二区精品久久911| 亚洲精品国产精品乱码不99| 午夜精品久久久久久久久久久久| 亚洲另类春色国产| 久久久久久久一区| 欧美一区二区三区啪啪| 欧美日韩国产精品一区二区亚洲 | 亚洲每日在线| 在线观看一区欧美| 欧美在线看片a免费观看| 亚洲天堂网在线观看| 免费观看成人网| 久热爱精品视频线路一| 国产日韩免费| 亚洲欧美国产高清va在线播| 亚洲一区亚洲| 欧美视频中文字幕在线| 亚洲国产精品尤物yw在线观看| 国内久久婷婷综合| 欧美一区二区大片| 久久精精品视频| 国产三区精品| 欧美中文字幕久久| 久久久久久久久岛国免费| 国产精品国产自产拍高清av| 亚洲最新在线| 午夜国产精品视频| 国产欧美成人| 欧美一区午夜视频在线观看| 欧美一区综合| 国产主播精品| 美女网站久久| 日韩视频中文| 亚洲欧美在线一区| 国产欧美在线| 久久久www成人免费毛片麻豆| 老牛影视一区二区三区| 久久久免费观看视频| 午夜欧美大片免费观看| 伊人伊人伊人久久| 久久久久久久一区| 亚洲国产精品v| 一区二区高清在线| 国产精品久久久久久久午夜| 亚洲无线一线二线三线区别av| 亚洲欧美日韩成人高清在线一区| 国产精品久久久久久久久免费| 亚洲免费视频在线观看| 开心色5月久久精品| 亚洲三级网站| 国产精品性做久久久久久| 久久久成人精品| 亚洲精品一区在线| 久久精品国产亚洲精品| 亚洲精品国产欧美| 国产精品少妇自拍| 久久亚洲电影| 一区二区三区四区国产精品| 久久综合九色99| 亚洲图片欧洲图片av| 国产在线播放一区二区三区| 欧美r片在线| 亚洲欧美制服另类日韩| 亚洲国产三级| 久久综合狠狠综合久久激情| 中国成人黄色视屏| 含羞草久久爱69一区| 欧美剧在线观看| 久久国产主播| 亚洲私人影院| 亚洲精品黄网在线观看| 久久久久久综合网天天| 亚洲午夜免费福利视频| 亚洲国产精品精华液网站| 国产精品有限公司| 欧美日韩国产综合视频在线观看中文 | 欧美一区二区三区视频免费| 亚洲人成网站在线观看播放| 久久人人97超碰精品888| 亚洲一区二区在线看| 91久久夜色精品国产九色| 国产欧美一区二区精品仙草咪| 欧美精品久久一区二区| 久久伊人精品天天| 久久久999精品| 久久国产精品毛片| 欧美一区二区三区在| 亚洲午夜影视影院在线观看|