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

隨筆-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>
            欧美激情视频在线播放 | 久久久久成人精品免费播放动漫| 91久久夜色精品国产网站| 久久综合99re88久久爱| 免费h精品视频在线播放| 亚洲二区免费| av成人黄色| 久久国产精品亚洲va麻豆| 久久永久免费| 欧美人成网站| 国产日产欧产精品推荐色 | 一本色道久久88综合亚洲精品ⅰ| 亚洲图片在区色| 国内揄拍国内精品久久| 久久福利精品| 欧美va亚洲va日韩∨a综合色| 欧美精品日韩综合在线| 国产精品永久| 91久久精品国产| 亚洲综合欧美日韩| 欧美**人妖| 亚洲在线观看视频| 欧美sm视频| 国产一区二区三区免费观看| 最新国产成人在线观看| 欧美一区二区三区在线看| 亚洲第一伊人| 欧美中文字幕| 欧美视频在线不卡| 亚洲人久久久| 久久人人爽人人爽| 夜夜夜久久久| 欧美高清在线一区| 狠狠做深爱婷婷久久综合一区| 一区二区精品| 亚洲第一页在线| 久久精品视频99| 国产日韩av在线播放| aa亚洲婷婷| 欧美激情中文不卡| 久久久亚洲一区| 国产亚洲视频在线| 欧美一级淫片播放口| 日韩网站在线观看| 欧美精品久久一区二区| 亚洲激情精品| 欧美激情va永久在线播放| 久久大综合网| 激情六月婷婷久久| 久久久综合网站| 亚洲欧美另类在线| 国产精品乱人伦中文| 亚洲午夜精品久久久久久app| 亚洲人成久久| 欧美日韩国内自拍| 一区二区三区高清不卡| 亚洲国产精品一区二区三区| 久久伊人精品天天| 亚洲高清123| 欧美国产三区| 欧美精品自拍| 亚洲一区二区黄色| 亚洲尤物视频网| 国产日韩在线视频| 久久国产欧美精品| 久久精品亚洲一区| 亚洲高清视频在线观看| 欧美成人午夜视频| 欧美精品七区| 亚洲一区在线播放| 亚洲永久免费观看| 在线精品国精品国产尤物884a| 国产精品日日做人人爱| 欧美午夜片在线观看| 亚洲国产欧美一区二区三区久久 | 一区二区三区欧美视频| 亚洲日韩视频| 欧美亚一区二区| 久久久97精品| 欧美.com| 午夜老司机精品| 欧美在线影院| 亚洲精品一二三| 亚洲愉拍自拍另类高清精品| 狠狠爱www人成狠狠爱综合网| 欧美jizzhd精品欧美巨大免费| 免费人成网站在线观看欧美高清| 中文av一区二区| 久久爱www.| 99成人在线| 欧美一级在线播放| 日韩视频在线观看国产| 亚洲男同1069视频| 亚洲精品一二区| 欧美影院精品一区| 一本色道久久加勒比88综合| 亚洲欧美福利一区二区| 亚洲国产激情| 亚洲欧美日韩人成在线播放| 亚洲黄色成人| 性色av香蕉一区二区| 亚洲精品你懂的| 欧美一区在线直播| 亚洲神马久久| 久久全国免费视频| 午夜视频在线观看一区二区三区| 老牛国产精品一区的观看方式| 亚洲网站视频福利| 免费日韩av片| 老牛国产精品一区的观看方式| 欧美性片在线观看| 亚洲国产一区二区三区高清| 国产一区二区三区四区hd| 日韩一级大片在线| 亚洲黄色免费电影| 久久天堂av综合合色| 性欧美长视频| 欧美性感一类影片在线播放 | 久久久久国色av免费看影院| 亚洲无玛一区| 欧美日韩中文精品| 亚洲激情在线| 最新日韩在线| 欧美福利一区二区| 欧美二区乱c少妇| 激情另类综合| 久久久不卡网国产精品一区| 久久精品成人欧美大片古装| 国产伦精品一区二区三| 亚洲一区精品在线| 午夜久久电影网| 国产精品日韩高清| 欧美色视频在线| 久久精品国产久精国产一老狼| 欧美日韩综合视频| 日韩视频三区| 亚洲一二三区精品| 欧美日韩在线一区| 99成人在线| 先锋影音国产一区| 久久精品国产在热久久 | 欧美激情影音先锋| 亚洲激情图片小说视频| 夜夜狂射影院欧美极品| 欧美日韩一级大片网址| 日韩视频在线永久播放| 亚洲视频在线看| 国产精品丝袜白浆摸在线| 亚洲综合日韩| 久久亚洲二区| 亚洲精品视频免费观看| 欧美系列一区| 性亚洲最疯狂xxxx高清| 另类酷文…触手系列精品集v1小说| 在线电影国产精品| 欧美激情一区二区三区在线 | 免费在线看成人av| 亚洲精品日韩欧美| 午夜视频久久久久久| 国内一区二区三区在线视频| 蜜臀av国产精品久久久久| 亚洲乱码精品一二三四区日韩在线| 中文在线不卡视频| 国产日韩欧美一区| 欧美不卡视频| 亚洲免费视频在线观看| 欧美大片在线观看一区二区| 一区二区三区四区五区视频| 国产偷久久久精品专区| 免费成人高清视频| 亚洲尤物影院| 欧美激情bt| 久久精品成人一区二区三区蜜臀 | 亚洲天堂成人| 在线观看欧美日本| 欧美日韩一视频区二区| 久久精品人人做人人爽电影蜜月 | 99视频精品在线| 久久综合久久综合九色| 日韩一级在线| 精品二区视频| 国产精品综合av一区二区国产馆| 蜜乳av另类精品一区二区| 午夜精品理论片| 99热在这里有精品免费| 狂野欧美一区| 久久成人这里只有精品| 9国产精品视频| 亚洲东热激情| 黑人巨大精品欧美黑白配亚洲| 欧美午夜激情视频| 欧美成人精品一区二区三区| 久久不见久久见免费视频1| 在线午夜精品自拍| 亚洲精品护士| 亚洲人精品午夜| 亚洲福利视频二区| 欧美国产丝袜视频| 美女久久一区| 夜夜精品视频一区二区|