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

隨筆-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一区二区三区网站四季av| 亚洲国产成人精品视频| 欧美1区2区| 亚洲一区亚洲二区| 亚洲一区在线免费观看| 黑人操亚洲美女惩罚| 欧美黑人一区二区三区| 国产精品大片wwwwww| 久久精品综合一区| 欧美极品在线视频| 久久不射网站| 欧美激情一区二区三区在线视频观看 | 久久中文字幕一区| 欧美精品国产一区二区| 欧美一区二区播放| 欧美va亚洲va香蕉在线| 午夜在线一区| 欧美大片18| 久久不见久久见免费视频1| 蜜臀99久久精品久久久久久软件| 日韩一区二区精品| 久久久久久久网站| 亚洲男人第一网站| 欧美成人伊人久久综合网| 午夜精品三级视频福利| 欧美11—12娇小xxxx| 久久久99久久精品女同性| 欧美日韩国产色站一区二区三区 | 一区二区三区在线观看国产| 一区二区三区**美女毛片| 亚洲高清在线视频| 欧美在线二区| 亚洲在线视频观看| 欧美国产91| 免费日本视频一区| 国产午夜精品一区二区三区视频| 亚洲美女网站| 亚洲三级网站| 久久综合亚州| 久久人人九九| 国产一区二区三区精品欧美日韩一区二区三区 | 久久亚洲欧美国产精品乐播| 欧美日韩专区在线| 亚洲久久一区二区| 亚洲日本免费电影| 麻豆精品在线观看| 免费看黄裸体一级大秀欧美| 狠狠88综合久久久久综合网| 亚洲欧美日韩国产一区二区三区| 亚洲一区美女视频在线观看免费| 欧美国产激情二区三区| 亚洲国产91色在线| 亚洲精品视频免费| 欧美精品一区二区三区一线天视频| 免费在线观看精品| 亚洲黄色片网站| 欧美成人国产| 亚洲精品少妇网址| 亚洲一区二区在线免费观看| 欧美三级欧美一级| 亚洲小视频在线观看| 亚洲欧美日韩电影| 国产九九精品视频| 亚洲欧美日韩综合国产aⅴ| 欧美在线观看你懂的| 国产在线视频欧美一区二区三区| 午夜一区在线| 久热精品视频在线免费观看| 曰韩精品一区二区| 免费h精品视频在线播放| 亚洲激情影院| 正在播放日韩| 国产欧美精品一区aⅴ影院| 欧美一级专区免费大片| 另类综合日韩欧美亚洲| 亚洲人成网站影音先锋播放| 欧美日韩国产综合视频在线观看中文 | 欧美天堂亚洲电影院在线播放| 一区二区三区三区在线| 久久国产88| 亚洲国产一区二区精品专区| 欧美日韩福利视频| 亚洲欧美日韩国产成人精品影院| 玖玖玖国产精品| 一区二区三区国产在线| 国产精品一区二区三区观看| 久久亚洲高清| 中日韩高清电影网| 久久人91精品久久久久久不卡 | 精品福利av| 欧美日韩xxxxx| 欧美一二三视频| 亚洲激情校园春色| 欧美中文字幕视频| 亚洲激情图片小说视频| 欧美午夜精品理论片a级大开眼界| 欧美与黑人午夜性猛交久久久| 亚洲二区在线| 久久国产88| 一本色道久久综合亚洲精品小说| 国产日韩精品在线| 欧美精品三区| 久久久久这里只有精品| 一区二区三区视频在线看| 狼人社综合社区| 亚洲——在线| 亚洲欧洲日产国码二区| 国产区精品在线观看| 欧美精品电影| 蜜臀久久99精品久久久画质超高清 | 亚洲视频碰碰| 亚洲人成高清| 国产亚洲精品v| 欧美午夜一区二区| 欧美jizzhd精品欧美巨大免费| 亚洲综合日韩在线| 亚洲美女黄网| 欧美激情一区二区久久久| 久久精品国产精品亚洲综合| 亚洲无吗在线| 日韩亚洲欧美成人| 亚洲激精日韩激精欧美精品| 国产一区二区三区在线观看精品 | 亚洲国产精品一区二区www| 国产三区二区一区久久| 国产精品v一区二区三区 | 久久精品国产亚洲高清剧情介绍| 亚洲天堂激情| 这里只有精品在线播放| 亚洲精品日产精品乱码不卡| 亚洲国产第一| 亚洲电影免费观看高清完整版在线观看| 久久网站免费| 久久女同精品一区二区| 久久精品综合网| 久久久久久精| 久久久之久亚州精品露出| 久久国产主播精品| 久久精品人人做人人爽电影蜜月| 欧美一区二区三区播放老司机| 亚洲欧美另类在线| 午夜免费久久久久| 欧美一级二级三级蜜桃| 欧美一区=区| 久久久国产成人精品| 久久午夜色播影院免费高清| 免费成人av在线| 欧美xx视频| 亚洲国产中文字幕在线观看| 亚洲国产欧美一区| 亚洲巨乳在线| 亚洲欧美一区在线| 久久精品视频一| 欧美不卡三区| 欧美日韩综合视频| 国产精品九九| 黄色成人免费观看| 亚洲精品国产视频| 亚洲欧美日韩一区| 久久久精品网| 亚洲国产精品久久久久| 亚洲久色影视| 欧美一级大片在线观看| 久久久久久一区二区| 欧美日韩成人激情| 国产日韩在线看片| 91久久精品国产91性色tv| 亚洲视频成人| 美女精品网站| 欧美激情综合色| 国产一区二区福利| 亚洲免费观看高清完整版在线观看熊 | 中国成人亚色综合网站| 久久本道综合色狠狠五月| 欧美成黄导航| 中文精品视频| 老司机精品导航| 欧美性事免费在线观看| 1024精品一区二区三区| 亚洲一区二区三区777| 久久影院亚洲| 中日韩在线视频| 免费在线播放第一区高清av| 国产精品视频yy9099| 亚洲精选视频免费看| 久久午夜国产精品| 亚洲视频 欧洲视频| 欧美xx视频| 黄色精品在线看| 亚洲欧洲av一区二区三区久久| 欧美激情一区二区三区| 欧美在线视频播放| 国产精品二区二区三区| 亚洲人成毛片在线播放| 久久久亚洲一区|