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

隨筆-162  評(píng)論-223  文章-30  trackbacks-0
   在《基于雙端堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列(1):原理》一文中講述了雙端堆的相關(guān)原理,本文則詳細(xì)講述具體的內(nèi)部實(shí)現(xiàn),便于區(qū)分,內(nèi)部函數(shù)名稱都以雙下劃線作為前綴,在這里,有幾個(gè)關(guān)鍵問題需要說明
   1)怎么求一個(gè)結(jié)點(diǎn)的對(duì)稱結(jié)點(diǎn):如果完全二叉樹根結(jié)點(diǎn)從索引1開始但不存儲(chǔ)元素,那么最小堆根結(jié)點(diǎn)則在索引2,最大堆根結(jié)點(diǎn)則在索引3,4和5為2的左右孩子,6和7為3的左右孩子,依次排下來,可以發(fā)現(xiàn)2(00000010)^1(00000001)=3(000000011),3(00000011)^1(00000001)=2,4(00000100)^2(00000010)=6(00000110),6(00000110)^2(00000010)=4(00000100),......因此,使用異或運(yùn)算就可求得對(duì)稱結(jié)點(diǎn),問題的關(guān)鍵變?yōu)槿绾吻蟮昧硪徊僮鲾?shù)如 和2,3異或的1,和4,6異或的2,這個(gè)1,2正是2(3),4(6)的以2為底的整數(shù)對(duì)數(shù)(向下取整)值,而這個(gè)值可以使用位運(yùn)算來高效地完成。這里的索引有效范圍是非負(fù)數(shù)。
   2)怎么判斷結(jié)點(diǎn)在最小堆或最大堆內(nèi):由1)分析,顯而易見可得,2(00000010)&1(00000001)=0,3(00000011)&1(00000001)=1,4(00000100)&2(00000010)=0,6(00000110)&2(00000010)=2,......因此,可以使用與運(yùn)算來高效地判斷。
   3)為了充分利用空間,我的實(shí)現(xiàn)是最小堆根結(jié)點(diǎn)在索引0,最大堆根結(jié)點(diǎn)在索引1處,那么在這種情況下,解決以上問題1),就需要將結(jié)點(diǎn)索引先加2,再從結(jié)果中減去2;解決以上問題2)需要將結(jié)點(diǎn)索引加2即可。當(dāng)雙端堆元素?cái)?shù)量占盡全部空間容量時(shí),次最大索引為空間容量減2,加2可能導(dǎo)致整數(shù)溢出,因此在實(shí)現(xiàn)中須區(qū)分處理。

   下面是雙端堆操作算法的內(nèi)部函數(shù)實(shí)現(xiàn)
  1、 以2為底的整數(shù)對(duì)數(shù)(向下取整)
 1struct _64bit_int{};
 2struct _no_64bit_int{};
 3
 4template<typename _Distance>
 5inline _Distance __log2(_Distance _val,_no_64bit_int)
 6{
 7    assert(_val > 0);
 8
 9    _Distance _ret = 0, _tmp;
10    _tmp = _val >> 16if (_tmp) { _ret += 16; _val = _tmp;}
11    _tmp = _val >> 8;  if (_tmp) { _ret += 8; _val = _tmp; }
12    _tmp = _val >> 4;  if (_tmp) { _ret += 4; _val = _tmp; }
13    _tmp = _val >> 2;  if (_tmp) { _ret += 2; _val = _tmp; }
14    _ret += (_val >> 1);
15
16    return _ret;
17}

18
19template<typename _Distance>
20inline _Distance __log2(_Distance _val,_64bit_int)
21{
22    assert(_val > 0);
23
24    _Distance _ret = 0, _tmp;
25    _tmp = _val >> 32if (_tmp) { _ret += 32; _val = _tmp;}
26    _tmp = _val >> 16if (_tmp) { _ret += 16; _val = _tmp;}
27    _tmp = _val >> 8;  if (_tmp) { _ret += 8; _val = _tmp; }
28    _tmp = _val >> 4;  if (_tmp) { _ret += 4; _val = _tmp; }
29    _tmp = _val >> 2;  if (_tmp) { _ret += 2; _val = _tmp; }
30    _ret += (_val >> 1);
31
32    return _ret;
33}

34
35template<typename _Distance>
36inline _Distance __log2(_Distance val)
37{
38    return __log2(val,typename cppext::mpl::if_then_else<8==sizeof(_Distance),_64bit_int,_no_64bit_int>::type());
39}
   2、對(duì)稱結(jié)點(diǎn)計(jì)算和判斷函數(shù)
 1template<typename _Distance>
 2inline bool __is_max_dheap_until(_Distance _dist) 
 3{
 4    assert(_dist > 1);
 5    return 0!=(_dist&(((_Distance)1)<<(__log2(_dist)-1)));
 6}

 7
 8template<typename _Distance>
 9inline bool __is_max_dheap(_Distance _dist) 
10{
11    _Distance _tmp = _dist + 2;
12    return _tmp > _dist ?  __is_max_dheap_until(_tmp) : __is_max_dheap_until((_dist>>1- 1);
13}

14
15template<typename _Distance>
16inline _Distance __partner_dheap_until(_Distance _dist)
17{
18    assert(_dist > 1);
19    return _dist^(((_Distance)1)<<(__log2(_dist)-1));
20}

21
22template<typename _Distance>
23inline _Distance __partner_dheap(_Distance _dist)
24{
25    _Distance _tmp = _dist + 2;
26    return _tmp > _dist ?  __partner_dheap_until(_tmp) - 2 : __partner_dheap_until((_dist>>1- 1- 2;
27}
   3、最大堆最小堆的插入
 1template<typename _RandIt,typename _Distance,typename _Ty>
 2inline void __push_min_dheap(_RandIt _first,_Distance _hole,_Distance _top,_Ty _val,bool _flag = true)
 3{
 4    for (_Distance _parent;_hole > _top;)
 5    {
 6        _parent = (_hole - 2>> 1;
 7        if (!_flag && _parent == _top || *(_first + _parent) < _val) 
 8            break;
 9        *(_first + _hole) = *(_first + _parent);
10        _hole = _parent;
11    }

12    *(_first + _hole) = _val;
13}

14
15template<typename _RandIt,typename _Distance,typename _Ty,typename _Compare>
16inline void __push_min_dheap(_RandIt _first,_Distance _hole,_Distance _top,_Ty _val,_Compare _comp,bool _flag = true)
17{
18    for (_Distance _parent;_hole > _top;)
19    {
20        _parent = (_hole - 2>> 1;
21        if (!_flag && _parent == _top || _comp(*(_first + _parent),_val))
22            break;
23        *(_first + _hole) = *(_first + _parent);
24        _hole = _parent;
25    }

26    *(_first + _hole) = _val;
27}

28
29template<typename _RandIt,typename _Distance,typename _Ty>
30inline void __push_max_dheap(_RandIt _first,_Distance _hole,_Distance _top,_Ty _val,bool _flag = true)
31{
32    for (_Distance _parent;_hole > _top;)
33    {
34        _parent = (_hole - 2>> 1;
35        if (!_flag && _parent == _top || _val < *(_first + _parent))
36            break;
37        *(_first + _hole) = *(_first + _parent);
38        _hole = _parent;
39    }

40    *(_first + _hole) = _val;
41}

42
43template<typename _RandIt,typename _Distance,typename _Ty,typename _Compare>
44inline void __push_max_dheap(_RandIt _first,_Distance _hole,_Distance _top,_Ty _val,_Compare _comp,bool _flag = true)
45{
46    for (_Distance _parent;_hole > _top;)
47    {
48        _parent = (_hole - 2>> 1;
49        if (!_flag && _parent == _top || _comp(_val,*(_first + _parent)))
50            break;
51        *(_first + _hole) = *(_first + _parent);
52        _hole = _parent;
53    }

54    *(_first + _hole) = _val;
55}
   4、最大堆調(diào)整
  1template<typename _RandIt,typename _Distance,typename _Ty>
  2inline void __adjust_max_dheap(_RandIt _first,_Distance _len,_Distance _hole,_Ty _val,bool _flag = true)
  3{
  4    assert(_len > 0);
  5
  6    _Distance _parent,_child,_tmp,_part,_min,_max,_bottom = _len - 1, _half = _bottom >> 1;
  7    for(_parent = _hole;_parent < _half;)
  8    {
  9        _child = (_parent + 1<< 1;
 10        if (_child < _bottom)
 11        {
 12            _tmp = _child;
 13            if (++_tmp <= _bottom && *(_first + _child) < *(_first + _tmp))
 14                ++_child;
 15        }

 16        *(_first + _parent) = *(_first + _child);
 17        _parent = _child;
 18    }

 19
 20    _part = __partner_dheap(_parent),_tmp = (_part + 1<< 1;
 21    if(_tmp != _bottom)
 22    {
 23        if (_tmp < _bottom)
 24            _part = _tmp, ++_tmp ;
 25        else
 26            (_part&1)==0 ? _tmp = _part + 1 : _tmp = _part - 1;
 27
 28        if (*(_first + _part) < *(_first + _tmp))
 29            _min = _part,_max = _tmp;
 30        else 
 31            _min = _tmp,_max = _part;
 32    }

 33    else
 34    {
 35        _min = _max = _tmp;
 36    }

 37
 38    if (*(_first + _min) < _val)
 39    {
 40        if (_val < *(_first + _max))
 41        {
 42            if (*(_first + _parent) < *(_first + _max))
 43                *(_first + ((_parent - 2>> 1)) = *(_first + _max);    
 44            else
 45                *(_first + _parent) = *(_first + _max);
 46            *(_first + _max) = _val; 
 47        }

 48        else
 49        {
 50            __push_max_dheap(_first,_parent,_hole,_val);
 51        }

 52    }

 53    else
 54    {
 55        if (*(_first + _parent) < *(_first + _max))
 56            *(_first + ((_parent - 2>> 1)) = *(_first + _max);    
 57        else
 58            *(_first + _parent) = *(_first + _max);
 59        *(_first + _max) = *(_first + _min); 
 60        __push_min_dheap(_first,_min,__partner_dheap(_hole),_val,_flag);
 61    }

 62}

 63
 64template<typename _RandIt,typename _Distance,typename _Ty,typename _Compare>
 65inline void __adjust_max_dheap(_RandIt _first,_Distance _len,_Distance _hole,_Ty _val,_Compare _comp,bool _flag = true)
 66{
 67    assert(_len > 0);
 68
 69    _Distance _parent,_child,_tmp,_part,_min,_max,_bottom = _len - 1, _half = _bottom >> 1;
 70    for(_parent = _hole;_parent < _half;)
 71    {
 72        _child = (_parent + 1<< 1;
 73        if (_child < _bottom)
 74        {
 75            _tmp = _child;
 76            if (++_tmp <= _bottom && _comp(*(_first + _child),*(_first + _tmp)))
 77                ++_child;
 78        }

 79        *(_first + _parent) = *(_first + _child);
 80        _parent = _child;
 81    }

 82
 83    _part = __partner_dheap(_parent),_tmp = (_part + 1<< 1;
 84    if(_tmp != _bottom)
 85    {
 86        if (_tmp < _bottom)
 87            _part = _tmp, ++_tmp;
 88        else
 89            (_part&1)==0 ? _tmp = _part + 1 : _tmp = _part - 1;
 90
 91        if (_comp(*(_first + _part),*(_first + _tmp)))
 92            _min = _part,_max = _tmp;
 93        else 
 94            _min = _tmp,_max = _part;
 95    }

 96    else
 97    {
 98        _min = _max = _tmp;
 99    }

100
101    if (_comp(*(_first + _min),_val))
102    {
103        if (_comp(_val,*(_first + _max)))
104        {
105            if (_comp(*(_first + _parent),*(_first + _max)))
106                *(_first + ((_parent - 2>> 1)) = *(_first + _max);    
107            else
108                *(_first + _parent) = *(_first + _max);
109            *(_first + _max) = _val; 
110        }

111        else
112        {
113            __push_max_dheap(_first,_parent,_hole,_val,_comp);
114        }

115    }

116    else
117    {
118        if (_comp(*(_first + _parent),*(_first + _max)))
119            *(_first + ((_parent - 2>> 1)) = *(_first + _max);    
120        else
121            *(_first + _parent) = *(_first + _max);
122        *(_first + _max) = *(_first + _min); 
123        __push_min_dheap(_first,_min,__partner_dheap(_hole),_val,_comp,_flag);
124    }

125}
   5、最小堆調(diào)整
 1template<typename _RandIt,typename _Distance,typename _Ty>
 2inline void __adjust_min_dheap(_RandIt _first,_Distance _len,_Distance _hole,_Ty _val)
 3{
 4    assert(_len > 0);
 5
 6    _Distance _parent,_child,_tmp,_part,_bottom = _len - 1, _half = _bottom >> 1;
 7    for(_parent = _hole;_parent < _half;)
 8    {
 9        _child = (_parent + 1<< 1;
10        if (_child < _bottom)
11        {
12            _tmp = _child;
13            if (++_tmp <= _bottom && *(_first + _tmp) < *(_first + _child))
14                ++_child;
15        }

16        *(_first + _parent) = *(_first + _child);
17        _parent = _child;
18    }

19
20    _part = __partner_dheap(_parent);
21    if (_part > 1 && _part > _bottom) _part = (_part - 2>> 1;
22
23    if (1 != _part && *(_first + _part) < _val)
24    {
25        *(_first + _parent) = *(_first + _part);
26        __push_max_dheap(_first,_part,__partner_dheap(_hole),_val);
27    }

28    else
29    {
30        __push_min_dheap(_first,_parent,_hole,_val);
31    }

32}

33
34template<typename _RandIt,typename _Distance,typename _Ty,typename _Compare>
35inline void __adjust_min_dheap(_RandIt _first,_Distance _len,_Distance _hole,_Ty _val,_Compare _comp)
36{
37    assert(_len > 0);
38
39    _Distance _parent,_child,_tmp,_part,_bottom = _len - 1, _half = _bottom >> 1;
40    for(_parent = _hole;_parent < _half;)
41    {
42        _child = (_parent + 1<< 1;
43        if (_child < _bottom)
44        {
45            _tmp = _child;
46            if (++_tmp <= _bottom && _comp(*(_first + _tmp),*(_first + _child)))
47                ++_child;
48        }

49        *(_first + _parent) = *(_first + _child);
50        _parent = _child;
51    }

52
53    _part = __partner_dheap(_parent);
54    if (_part > 1 && _part > _bottom) _part = (_part - 2>> 1;
55
56    if (1 != _part && _comp(*(_first + _part),_val))
57    {
58        *(_first + _parent) = *(_first + _part);
59        __push_max_dheap(_first,_part,__partner_dheap(_hole),_val,_comp);
60    }

61    else
62    {
63        __push_min_dheap(_first,_parent,_hole,_val,_comp);
64    }

65}
   7、堆調(diào)整
 1template<typename _RandIt,typename _Distance,typename _Ty>
 2inline void __adjust_dheap(_RandIt _first,_Distance _len,_Distance _hole,_Ty _val,bool _flag = true)
 3{
 4    __is_max_dheap(_hole) ? __adjust_max_dheap(_first,_len,_hole,_val,_flag) : __adjust_min_dheap(_first,_len,_hole,_val);    
 5}

 6
 7template<typename _RandIt,typename _Distance,typename _Ty,typename _Compare>
 8inline void __adjust_dheap(_RandIt _first,_Distance _len,_Distance _hole,_Ty _val,_Compare _comp,bool _flag = true)
 9{
10    __is_max_dheap(_hole) ? __adjust_max_dheap(_first,_len,_hole,_val,_comp,_flag) : __adjust_min_dheap(_first,_len,_hole,_val,_comp);    
11}
posted on 2011-10-03 17:54 春秋十二月 閱讀(2182) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Algorithm

評(píng)論:
# re: 基于雙端堆實(shí)現(xiàn)的優(yōu)先級(jí)隊(duì)列:(3) 外觀 2011-10-04 13:07 | 博洋家紡
不錯(cuò),收藏了  回復(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>
            国产精品专区一| 欧美第十八页| 亚洲第一页中文字幕| 伊人蜜桃色噜噜激情综合| 伊人久久大香线蕉综合热线| 在线精品亚洲| 一本一道久久综合狠狠老精东影业 | 香港久久久电影| 久久久美女艺术照精彩视频福利播放 | 亚洲小说春色综合另类电影| 亚洲永久在线| 久久久久久综合| 亚洲欧洲午夜| 亚洲美女精品成人在线视频| 亚洲欧美激情一区二区| 久久香蕉精品| 欧美特黄一级| 激情丁香综合| 亚洲一区中文字幕在线观看| 久久精品99无色码中文字幕| 欧美激情欧美激情在线五月| 中日韩美女免费视频网址在线观看| 亚洲女女女同性video| 另类av一区二区| 国产精品视区| 99ri日韩精品视频| 久久亚洲风情| 亚洲一二区在线| 免费观看国产成人| 国产日本欧美视频| 宅男噜噜噜66一区二区| 久久久久欧美| 亚洲一区二区三区高清不卡| 老**午夜毛片一区二区三区| 国产精品免费看片| 亚洲日本欧美| 可以免费看不卡的av网站| 亚洲麻豆视频| 亚洲欧美一区二区视频| 亚洲第一精品夜夜躁人人爽| 亚洲一区二区三区色| 欧美精品二区| 亚洲精品日韩在线| 欧美寡妇偷汉性猛交| 香港成人在线视频| 国产精品毛片a∨一区二区三区|国| 亚洲黄色在线视频| 欧美肥婆在线| 免费在线欧美黄色| 亚洲激情婷婷| 欧美激情精品久久久| 久久免费国产精品| 黑人巨大精品欧美黑白配亚洲| 亚洲专区在线视频| 中文国产成人精品| 欧美午夜美女看片| 亚洲综合日本| 亚洲永久在线| 国产日韩视频一区二区三区| 午夜精品久久久99热福利| 在线一区亚洲| 国产日韩专区| 蜜桃精品久久久久久久免费影院| 欧美一区二区三区四区视频| 国产亚洲午夜高清国产拍精品| 欧美一区二区大片| 欧美一区二区三区婷婷月色| 国外成人在线视频| 欧美国产日韩一区二区在线观看| 毛片一区二区| 99re在线精品| 亚洲在线电影| 国产在线观看91精品一区| 久久视频在线免费观看| 卡一卡二国产精品| 中文av字幕一区| 亚洲欧美在线aaa| 国产主播喷水一区二区| 欧美不卡视频一区发布| 欧美激情综合色综合啪啪| 中文在线资源观看视频网站免费不卡| 9色精品在线| 国产一区二区三区久久悠悠色av| 久久人人爽人人| 欧美大成色www永久网站婷| 亚洲午夜av在线| 久久国产精品一区二区三区四区| 影音先锋亚洲视频| 亚洲精品一区久久久久久| 国产精品免费看片| 欧美激情精品| 国产视频一区免费看| 亚洲国产婷婷香蕉久久久久久| 欧美午夜精品久久久| 久久婷婷麻豆| 欧美日韩在线视频观看| 久久中文字幕导航| 欧美午夜激情在线| 欧美不卡高清| 国产精品系列在线| 一区二区高清| 久久国产精品99久久久久久老狼 | 欧美日韩国产丝袜另类| 欧美在线网址| 欧美精品免费播放| 久久这里有精品15一区二区三区 | 欧美视频一区二区三区四区| 久久在线免费观看| 欧美性事免费在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整 | 理论片一区二区在线| 欧美日韩视频在线一区二区| 久热精品视频在线观看| 国产精品你懂得| 亚洲激情电影在线| 精品av久久久久电影| 亚洲欧美综合国产精品一区| 一本色道久久综合一区 | 国产在线视频欧美一区二区三区| 亚洲欧洲一区二区天堂久久| 激情91久久| 欧美一级视频一区二区| 亚洲综合丁香| 欧美日韩在线播| 亚洲国产精品久久久久久女王| 国语自产偷拍精品视频偷| 亚洲欧美日韩综合aⅴ视频| 亚洲一区在线视频| 国产精品久久国产愉拍| 一区二区日韩伦理片| 亚洲无毛电影| 欧美日韩一区二区欧美激情| 亚洲精品在线视频观看| 一本大道久久a久久精品综合| 麻豆精品网站| 亚洲国产日韩欧美在线动漫| 亚洲日本免费电影| 欧美精品系列| 一本色道久久| 新67194成人永久网站| 国产精品每日更新在线播放网址| 国产精品99久久99久久久二8| 中文一区字幕| 国产乱人伦精品一区二区| 亚洲欧美视频一区| 久久久欧美一区二区| 一区二区视频在线观看| 另类春色校园亚洲| 亚洲黄一区二区| 亚洲男女自偷自拍| 久久都是精品| 欧美+亚洲+精品+三区| 91久久国产精品91久久性色| 欧美粗暴jizz性欧美20| 一本色道久久综合狠狠躁篇的优点| 亚洲欧美成人精品| 国内精品久久久久久久果冻传媒| 久久亚洲综合色一区二区三区| 欧美激情亚洲精品| 中文在线不卡视频| 国户精品久久久久久久久久久不卡| 久久一综合视频| 99热这里只有成人精品国产| 久久精品在线观看| 亚洲高清网站| 国产精品sss| 亚洲欧美影音先锋| 亚洲激情欧美激情| 欧美在线观看日本一区| 亚洲国产婷婷香蕉久久久久久| 欧美日韩日日夜夜| 久久www成人_看片免费不卡| 欧美成人一区二区三区| 亚洲综合日韩| 亚洲日本中文字幕| 国产亚洲在线| 欧美国产日韩一区| 性感少妇一区| 日韩视频免费| 欧美高清影院| 久久成年人视频| 一区二区三区久久| 亚洲电影免费观看高清| 国产精品久久国产三级国电话系列 | 国产欧美一区二区三区在线看蜜臀| 久久一区国产| 亚洲永久视频| 中国日韩欧美久久久久久久久| 免费美女久久99| 欧美在线免费一级片| 亚洲免费av观看| 亚洲大黄网站| 狠狠色狠狠色综合日日小说| 欧美网站在线观看| 欧美国产精品中文字幕| 久久夜精品va视频免费观看| 亚洲一区二区在线免费观看视频| 亚洲精品一区二区三区av| 欧美电影在线观看完整版| 久久久精品性|