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

Daly的游戲人生

動態(tài)優(yōu)先隊列

    很多圖算法實現(xiàn)中都需要用到優(yōu)先隊列,這些優(yōu)先隊列需要能動態(tài)改變堆內(nèi)對應(yīng)元素的值,并更新堆。比如在dijkstra算法中,每次松弛都要更新頂點的權(quán)值,但一般的優(yōu)先隊列無法找到頂點在堆中的位置。本文實現(xiàn)一種數(shù)據(jù)結(jié)構(gòu)"動態(tài)優(yōu)先隊列",利用兩個數(shù)組保存了原數(shù)據(jù)數(shù)組位置----堆位置的映射,能實現(xiàn)快速修改。該數(shù)據(jù)結(jié)構(gòu)的大部分應(yīng)用場合中,元素個數(shù)是固定的,因此代碼中沒有追加新元素的操作。
     代碼和大部分堆操作一樣,m_indices數(shù)組保存了原數(shù)組 到 堆位置映射, m_pmap保存了逆向映射。堆調(diào)整時,原數(shù)組的數(shù)據(jù)位置不變,只改變m_pmap映射。該實現(xiàn)是最小優(yōu)先隊列,在模板參數(shù)添加用于比較的Functor可改造為任意堆。

  1template<typename _Type>
  2static void gs_swap(_Type &x, _Type &y)
  3{    
  4   static _Type tmp;
  5   tmp = x;
  6   x = y;
  7   y = tmp;
  8}

  9
 10
 11/*
 12* DynamicPQ : dynamic priority queue (with indices mapping to original array position)
 13*   It's a min-heap and has following feature
 14*  1. detemine the min value
 15*  2. modify the corresponding k in original array
 16*  3. pop the top value
 17*  it can't be append new value
 18*/
 
 19template<typename _Type>
 20class DynamicPQ
 21{
 22public:
 23     /*
 24     *  @param  array   the original array to processed
 25     *  @param  max_n   the original size of the array
 26     */

 27    DynamicPQ(_Type *array, unsigned int max_n)
 28        : m_array(array), m_size(max_n)
 29    {
 30        unsigned int i;
 31        m_indices = new unsigned int[max_n];
 32        m_pmap = new unsigned int[max_n];
 33        for (i=0; i<m_size; i++{
 34            m_indices[i] = m_pmap[i] = i;
 35        }

 36        //make_heap
 37        for (i=m_size/2; i>0; i--{
 38            adjust_down(i);
 39        }

 40        adjust_down(0);
 41    }

 42
 43    ~DynamicPQ() {
 44        delete[] m_indices;
 45        delete[] m_pmap;
 46    }

 47    /*
 48    * change the key
 49    * @param k      the original index, not the position of the min-heap
 50    * @param value  new value
 51    */

 52    void modify_key(unsigned int k, _Type value)
 53    {
 54        unsigned int idx = m_indices[k];  //find the coresponding position of the heap
 55        if (value < m_array[ m_pmap[idx] ]) {
 56            m_array[ m_pmap[idx] ] = value;    //decrease key
 57            adjust_up(idx);
 58        }

 59        else {
 60            m_array[ m_pmap[idx] ] = value;    //increase key
 61            adjust_down(idx);
 62        }

 63    }

 64    _Type top() return m_array[ m_pmap[0] ];}
 65    /*
 66    * extract the min value
 67    */

 68    _Type pop_top() {
 69        gs_swap(m_pmap[0], m_pmap[m_size-1]);
 70        m_indices[ m_pmap[0] ] = m_size - 1;
 71        m_indices[ m_pmap[m_size-1] ] = 0;
 72        --m_size;
 73        adjust_down(0);    
 74        return m_array[ m_pmap[m_size]];
 75    }

 76    inline unsigned int size() return m_size; }
 77
 78protected:
 79    //update the value. up to the root
 80    void adjust_up(unsigned int i)
 81    {
 82        unsigned int parent = (i-1/ 2;
 83        while (i>0 && m_array[ m_pmap[i] ] < m_array[ m_pmap[parent] ]) {
 84            gs_swap(m_pmap[i], m_pmap[parent]);
 85            m_indices[ m_pmap[i]] = i;       //update index mapping after exchange
 86            i = parent;
 87            parent = (i-1/ 2;
 88        }

 89        m_indices[ m_pmap[i] ] = i;     //update the final position of i
 90    }

 91    //min-heapify
 92    void adjust_down(unsigned int i)
 93    {
 94        unsigned int lf = i*2 + 1;    //left child
 95        unsigned int rt = i*2 + 2;    //right child
 96        unsigned int min_pos;
 97        unsigned int tmp_i = m_pmap[i];
 98        while(lf < m_size) {            
 99            if (m_array[ m_pmap[lf] ] < m_array[ m_pmap[i] ]) 
100                min_pos = lf;
101            else 
102                min_pos = i;
103            if (rt < m_size && m_array[ m_pmap[rt] ] < m_array[ m_pmap[min_pos] ]) {
104                min_pos = rt;
105            }

106            if (min_pos != i) {
107                gs_swap(m_pmap[min_pos], m_pmap[i]);
108                m_indices[ m_pmap[i]] = i;       //update after exchange
109                i = min_pos;            //next loop
110                lf = i*2 + 1;
111                rt = i*2 + 2;
112                continue;
113            }

114            else {
115                m_indices[tmp_i] = i;   //update index
116                break;
117            }

118        }

119    }

120    
121protected:
122    _Type *m_array;       
123    unsigned int *m_indices;    //index mapping(array[k] --> heap position)
124    unsigned int *m_pmap;       //pointer mapping(heap position --> array[k])
125    unsigned int m_size;
126}
;
127


posted on 2009-11-17 11:38 Daly 閱讀(1019) 評論(0)  編輯 收藏 引用 所屬分類: 數(shù)據(jù)結(jié)構(gòu)與算法

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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精品国产福利在线观看免费 | 亚洲啪啪91| 亚洲一级高清| 国内精品免费午夜毛片| 欧美激情成人在线| 午夜精品久久久久影视 | 伊人激情综合| 国产精品jvid在线观看蜜臀| 性久久久久久久久久久久| 亚洲福利视频一区二区| 亚洲欧美激情视频| 亚洲欧洲精品一区二区三区| 国产精品欧美在线| 欧美精品久久久久久久久老牛影院| 亚洲女人天堂成人av在线| 亚洲国产精品一区二区久 | 中文日韩在线视频| 亚洲成人在线视频播放 | 久久久久国产精品人| 一本大道久久a久久精二百| 国产一区二区三区久久精品| 欧美日韩另类视频| 老**午夜毛片一区二区三区| 午夜精品影院| 亚洲无限av看| 亚洲免费观看在线观看| 欧美国产第一页| 久久久亚洲高清| 午夜视频在线观看一区二区三区| 亚洲乱码精品一二三四区日韩在线| 国产午夜精品理论片a级探花| 欧美日韩综合久久| 欧美精品日日鲁夜夜添| 毛片一区二区三区| 欧美一区免费视频| 亚洲男人第一av网站| 一区二区国产精品| 亚洲精品少妇| 亚洲精品久久久久久久久久久久 | 欧美日本韩国一区| 男男成人高潮片免费网站| 久久精品中文| 久久久国产视频91| 久久国产欧美日韩精品| 欧美在线亚洲一区| 午夜综合激情| 亚洲欧美中文日韩v在线观看| 99日韩精品| 亚洲网站视频福利| 亚洲视频在线观看网站| 亚洲深夜av| 亚洲欧美日韩另类| 亚洲欧美日韩天堂| 欧美一二三区精品| 久久狠狠久久综合桃花| 久久亚洲精选| 美女图片一区二区| 欧美成人性生活| 欧美激情一区二区三区| 欧美精品偷拍| 欧美体内谢she精2性欧美| 国产精品第三页| 国产精品日本一区二区| 国产欧美综合一区二区三区| 国产欧美一区二区视频| 狠色狠色综合久久| 亚洲国产成人精品女人久久久| 亚洲国产天堂久久综合| 亚洲精品免费在线| 亚洲一区二区免费视频| 午夜精品久久| 久久久精品一品道一区| 欧美va亚洲va香蕉在线| 亚洲国产婷婷| 亚洲视频欧洲视频| 久久激情视频免费观看| 免费一级欧美片在线观看| 欧美激情在线有限公司| 国产精品乱码妇女bbbb| 激情综合色综合久久| 亚洲人成人99网站| 亚洲欧美日韩一区在线| 两个人的视频www国产精品| 亚洲大胆人体在线| 正在播放亚洲一区| 久久xxxx精品视频| 欧美精品激情在线| 国产亚洲人成网站在线观看 | 一区二区欧美亚洲| 欧美一区亚洲二区| 亚洲国产精品久久久久婷婷884 | 国语自产在线不卡| 99re热这里只有精品免费视频| 午夜在线视频一区二区区别| 欧美高清视频一区二区三区在线观看| 亚洲精品女人| 亚洲香蕉视频| 欧美jizz19性欧美| 国产欧美亚洲一区| 一本一本久久| 蜜桃av综合| 亚洲一级网站| 欧美成人国产| 国产视频一区在线| 一区二区日本视频| 免费观看成人网| 亚洲在线成人| 欧美精品九九99久久| 国产一区二区三区最好精华液| 一本色道久久综合亚洲精品小说| 欧美一级网站| 99精品视频免费全部在线| 久久久久免费观看| 国产欧美韩国高清| 亚洲少妇自拍| 亚洲成色最大综合在线| 午夜精品一区二区三区在线| 欧美日韩亚洲高清| 亚洲精品黄色| 欧美高清自拍一区| 久久精品国产精品亚洲| 国产欧美亚洲日本| 亚洲亚洲精品在线观看| 亚洲国产小视频在线观看| 久久琪琪电影院| 狠狠色综合一区二区| 久久成人国产| 99精品国产在热久久| 欧美剧在线免费观看网站| 亚洲电影免费观看高清完整版| 久久精品盗摄| 午夜日本精品| 国产三级欧美三级日产三级99| 亚洲欧美久久| 亚洲一区在线视频| 国产精品vvv| 亚洲一区二区免费看| 洋洋av久久久久久久一区| 欧美片在线播放| 这里只有精品电影| 亚洲精品一区二区三区樱花| 欧美国产精品日韩| 亚洲理论电影网| 亚洲精品一区二区三区蜜桃久| 欧美精品九九| 亚洲午夜激情免费视频| 亚洲图片在区色| 国产欧美在线观看一区| 久久理论片午夜琪琪电影网| 欧美一区二区大片| 激情综合电影网| 欧美黄色成人网| 欧美成人在线影院| 夜夜爽99久久国产综合精品女不卡| 亚洲欧洲一区| 欧美视频在线观看 亚洲欧| 亚洲视频一区二区免费在线观看| 亚洲毛片av| 国产精品多人| 久久九九99| 麻豆九一精品爱看视频在线观看免费 | 欧美伊人久久大香线蕉综合69| 西瓜成人精品人成网站| 尹人成人综合网| 亚洲国产高清在线| 欧美日韩在线播放一区二区| 亚洲女人天堂成人av在线| 欧美在线高清| 亚洲精品视频在线观看免费| 一区二区三区欧美亚洲| 国产亚洲精品一区二555| 欧美 日韩 国产一区二区在线视频| 欧美成人免费在线视频| 午夜国产精品视频| 久久在线视频| 亚洲午夜电影在线观看| 久久精品国产96久久久香蕉| 亚洲欧洲美洲综合色网| 在线中文字幕日韩| 亚洲第一精品福利| 亚洲调教视频在线观看| 在线精品亚洲一区二区| 99国产一区二区三精品乱码| 国内精品久久久久影院优| 亚洲精品一区二区三区在线观看|