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

posts - 6, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

最小堆的實(shí)現(xiàn)

Posted on 2010-05-02 20:39 Current 閱讀(1510) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Wild Magic 引擎解析

最大堆和最小堆是二叉堆的兩種形式。

  1. 最大堆:根結(jié)點(diǎn)的鍵值是所有堆結(jié)點(diǎn)鍵值中最大者的堆。
  2. 最小堆:根結(jié)點(diǎn)的鍵值是所有堆結(jié)點(diǎn)鍵值中最小者的堆。

而最大-最小堆集結(jié)了最大堆和最小堆的優(yōu)點(diǎn),這也是其名字的由來(lái)。 最大-最小堆是最大層和最小層交替出現(xiàn)的二叉樹(shù),即最大層結(jié)點(diǎn)的兒子屬于最小層,最小層結(jié)點(diǎn)的兒子屬于最大層。 以最大(小)層結(jié)n點(diǎn)為根結(jié)點(diǎn)的子樹(shù)保有最大(小)堆性質(zhì):根結(jié)點(diǎn)的鍵值為該子樹(shù)結(jié)點(diǎn)鍵值中最大(小)項(xiàng)。

最大堆: 最小堆:

最小堆實(shí)現(xiàn):

 1#ifndef _TMINHEAP_HPP_
 2#define _TMINHEAP_HPP_
 3
 4#include "System.hpp"
 5
 6namespace PX2
 7{
 8    /// 最小堆
 9    /*
10    *  應(yīng)用二叉樹(shù)實(shí)現(xiàn)最小堆
11    */

12    template <typename Generator, typename Real> class TMinHeap;
13
14    template <typename Generator, typename Real>
15    class TMinHeapRecord
16    {
17    public:
18        TMinHeapRecord ();
19        ~TMinHeapRecord ();
20
21        Generator GetGenerator () const;
22        Real GetValue () const;
23
24    private:
25        friend class TMinHeap<Generator, Real>;
26    
27        Generator m_tGenerator;
28        Real m_fValue;
29        int m_iIndex;
30    }
;
31
32    template <typename Generator, typename Real> 
33    class TMinHeap
34    {
35        TMinHeap ( int iMaxQuantity, int iGrowBy );
36        ~TMinHeap ();
37
38        int GetMaxQuantity () const;
39        int GetGrowBy () const;
40        int GetQuantity () const;
41        const TMinHeapRecord<Generator,Real>* GetRecord ( int i ) const;
42
43        const TMinHeapRecord<Generator,Real>* Insert (Generator tGenerator,
44            Real fValue);
45
46        void Remove (Generator& rtGenerator, Real& rfValue);
47
48        void Update (const TMinHeapRecord<Generator,Real>* pkConstRecord,
49            Real fValue);
50
51        bool IsValid (int iStart, int iFinal);
52        bool IsValid ();
53        void Print (const char* acFilename);
54
55    private:
56        int m_iMaxQuantity, m_iGrowBy, m_iQuantity;
57        TMinHeapRecord<Generator,Real>* m_akRecords;
58
59        TMinHeapRecord<Generator,Real>** m_apkRecords;
60    }
;
61
62#include "TMinHeap.inl"
63}

64#endif//_TMINHEAP_HPP_
  1//----------------------------------------------------------------------------
  2template <typename Generator, typename Real>
  3TMinHeapRecord<Generator,Real> ::TMinHeapRecord ()
  4{
  5}

  6//----------------------------------------------------------------------------
  7template <typename Generator, typename Real>
  8TMinHeapRecord<Generator,Real> ::~TMinHeapRecord ()
  9{
 10}

 11//----------------------------------------------------------------------------
 12template <typename Generator, typename Real>
 13Generator TMinHeapRecord<Generator,Real> ::GetGenerator () const
 14{
 15    return m_tGenerator;
 16}

 17//----------------------------------------------------------------------------
 18template <typename Generator, typename Real>
 19Real TMinHeapRecord<Generator,Real> ::GetValue () const
 20{
 21    return m_fValue;
 22}

 23//----------------------------------------------------------------------------
 24//-------------------------------------------------------------------------------
 25template <typename Generator, typename Real>
 26TMinHeap<Generator, Real> ::TMinHeap( int iMaxQuantity, int iGrowBy )
 27{
 28    assert( iMaxQuantity > 0 && iGrowBy > 0);
 29    m_iMaxQuantity = iMaxQuantity;
 30    m_iGrowBy = iGrowBy;
 31    m_iQuantity = 0;
 32    m_akRecords = NEW TMinHeapRecord<Generator, Real>[m_iMaxQuantity];
 33    m_apkRecords = NEW TMinHeapRecord<Generator, Real>*[m_iMaxQuantity];
 34
 35    for (int i = 0; i < m_iMaxQuantity; ++i)
 36    {
 37        m_apkRecords[i] = &m_akRecords[i];
 38        m_apkRecords[i]->m_iIndex = i;
 39    }

 40}

 41//-------------------------------------------------------------------------------
 42template <typename Generator, typename Real>
 43TMinHeap<Generator, Real> ::~TMinHeap()
 44{
 45    DELETE [] m_akRecords;
 46    DELETE [] m_apkRecords;
 47}

 48//-------------------------------------------------------------------------------
 49template <typename Generator, typename Real>
 50int TMinHeap<Generator, Real> ::GetMaxQuantity() const
 51{
 52    return m_iMaxQuantity;
 53}

 54//-------------------------------------------------------------------------------
 55template <typename Generator, typename Real>
 56int TMinHeap<Generator, Real> ::GetGrowBy() const
 57{
 58    return m_iGrowBy;
 59}

 60//-------------------------------------------------------------------------------
 61template <typename Generator, typename Real>
 62int TMinHeap<Generator, Real> ::GetQuantity()
 63{
 64    return m_iQuantity;
 65}

 66//-------------------------------------------------------------------------------
 67template <typename Generator, typename Real>
 68const TMinHeapRecord<Generator, Real>* TMinHeap<Generator, Real> 
 69::GetRecord ( int i ) const
 70{
 71    if ( 0 <= i && i < m_iQuantity )
 72    {
 73        return m_apkRecords[i];
 74    }

 75
 76    return 0;
 77}

 78//-------------------------------------------------------------------------------
 79template <typename Generator, typename Real>
 80const TMinHeapRecord<Generator,Real>* TMinHeap<Generator,Real>
 81::Insert ( Generator tGenerator, Real fValue )
 82{
 83    if ( m_iQuantity == m_iMaxQuantity )
 84    {
 85        int iNewQuantity = m_iMaxQuantity + m_iGrowBy;
 86
 87        TMinHeapRecord<Generator,Real>* akNewRecords =
 88            NEW TMinHeapRecord<Generator,Real>[iNewQuantity];
 89
 90        TMinHeapRecord<Generator,Real>** apkNewRecords =
 91            NEW TMinHeapRecord<Generator,Real>*[iNewQuantity];
 92
 93        size_t uiSize = m_iMaxQuantity*sizeof(TMinHeapRecord<Generator,Real>);
 94        memcpy(akNewRecords, m_akRecords, uiSize);
 95
 96        int i;
 97        for (i = 0; i < m_iMaxQuantity; i++)
 98        {
 99            int iByteOffset = (int)(m_apkRecords[i] - m_akRecords);
100            apkNewRecords[i] = (TMinHeapRecord<Generator,Real>*)
101                ( ((char*)akNewRecords) + iByteOffset);
102            apkNewRecords[i]->m_iIndex = i;
103        }

104
105        for (i = m_iMaxQuantity; i < iNewQuantity; i++)
106        {
107            apkNewRecords[i] = &akNewRecords[i];
108            apkNewRecords[i]->m_iIndex = i;
109        }

110
111        DELETE[] m_akRecords;
112        DELETE[] m_apkRecords;
113        m_iMaxQuantity = iNewQuantity;
114        m_akRecords = akNewRecords;
115        m_apkRecords = apkNewRecords;
116    }

117
118    int iChild = m_iQuantity++;
119    TMinHeapRecord<Generator, Real>* pkRecord = m_apkRecords[iChild];
120    pkRecord->m_tGenerator = tGenerator;
121    pkRecord.m_fValue = fValue;
122
123    while (iChild > 0)
124    {
125        int iParent = ( iChild - 1/ 2;
126        if (m_apkRecords[iParent].m_fValue <= fValue)
127        {
128            break;
129        }

130
131        m_apkRecords[iChild] = m_apkRecords[iParent];
132        m_apkRecords[iChild].m_iIndex = iChild;
133
134        m_apkRecords[iParent] = pkRecord;
135        m_apkRecords[iParent].m_iIndex = iParent;
136
137        iChild = iParent;
138    }

139
140    return m_apkRecords[iChild];
141}

142//-------------------------------------------------------------------------------
143template <typename Generator, typename Real>
144void TMinHeap<Generator, Real> ::Remove(Generator& rtGenerator, Real& rfValue)
145{
146    TMinHeapRecord<Generator, Real>* pkRoot = m_apkRecords[0];
147    rtGenerator = pkRoot->m_tGenerator;
148    rfValue = pkRoot->m_fValue;
149
150    int iLast = --m_iQuantity;
151    TMinHeapRecord<Generator, Real>* pkRecord = m_apkRecords[iLast];
152    int iParent = 0, iChild = 1;
153    while (iChild <= iLast )
154    {
155        if (iChild < iLast )
156        {
157            int iChildP1 = iChild + 1;
158            if (m_apkRecords[iChild]->m_fValue >
159                m_apkRecords[iChildP1]->m_fValue)
160            {
161                iChild = iChildP1;
162            }

163        }

164
165        if (m_apkRecords[iChild]->m_fValue >= pkRecord->m_fValue)
166        {
167            break;
168        }

169
170        m_apkRecords[iParent] = m_apkRecords[iChild];
171        m_apkRecords[iParent]->m_iIndex = iParent;
172
173        iParent = iChild;
174        iChild = 2*iChild + 1;
175    }

176    m_apkRecords[iParent] = pkRecord;
177    m_apkRecords[iParent]->m_iIndex = iParent;
178
179    m_apkRecords[iLast] = pkRoot;
180    m_apkRecords[iLast]->m_iIndex = iLast;
181}

182//-------------------------------------------------------------------------------
183template <typename Generator, typename Real>
184void TMinHeap<Generator, Real> ::Update(
185const TMinHeapRecord<Generator,Real>* pkConstRecord, Real fValue)
186
187{
188    TMinHeapRecord<Generator, Real>* pkRecord = 
189        (TMinHeapRecord<Generator, Real>*) pkConstRecord;
190
191    int iParent, iChild, iChildp1, iMaxChild;
192
193    if (fValue > pkRecord->m_fValue )
194    {
195        pkRecord->m_fValue = fValue;
196
197        iParent = pkRecord->m_iIndex;
198        iChild = 2* iParent + 1;
199        while( iChild < m_iQuantity)
200        {
201            if (iChild < m_iQuantity -1)
202            {
203                iChildp1 = iChild + 1;
204                if (m_apkRecords[iChild]->m_fValue <=
205                    m_apkRecords[iChildp1]->m_fValue )
206                {
207                    iMaxChild = iChild;
208                }

209                else
210                {
211                    iMaxChild = iChildp1;
212                }

213            }

214            else
215            {
216                iMaxChild = iChild;
217            }

218
219            if (m_apkRecords[iMaxChild]->m_fValue >= fValue )
220            {
221                break;
222            }

223
224            m_apkRecords[iParent] = m_apkRecords[iMaxChild];
225            m_apkRecords[iParent]->m_iIndex = iParent;
226
227            m_apkRecords[iMaxChild] = pkRecord;
228            m_apkRecords[iMaxChild]->m_iIndex = iMaxChild;
229
230            iParent = iMaxChild;
231
232            iChild = 2* iParent + 1;
233        }

234    }

235    else  if (fValue < pkRecord->m_fValue)
236    {
237        pkRecord->m_fValue = fValue;
238
239        iChild = pkRecord->m_iIndex;
240
241        while( iChild > 0)
242        {
243            iParent = (iChild -1/2;
244            if (m_apkRecords[iParent]->m_fValue <= fValue)
245            {
246                break;
247            }

248
249            m_apkRecords[iChild] = m_apkRecords[iParent];
250            m_apkRecords[iChild]->m_iIndex = iChild;
251
252            m_apkRecords[iParent] = pkRecord;
253            m_apkRecords[iParent]->m_iIndex = iParent;
254
255            iChild = iParent;
256        }

257    }

258}

259//-------------------------------------------------------------------------------
260template <typename Generator, typename Real>
261bool TMinHeap<Generator, Real> ::IsValid( int iStart, int iFinal)
262{
263    for ( int iChild = iStart; iChild <= iFinal; ++iChild)
264    {
265        int iParent = (iChild - 1)/2;
266        if (iParent > iStart)
267        {
268            if (m_apkRecords[iParent]->m_fValue >
269                m_apkRecords[iChild]->m_fValue )
270            {
271                return false;
272            }

273
274            if (m_apkRecords[iParent]->m_iIndex != iParent)
275            {
276                return false;
277            }

278        }

279    }

280
281    return true;
282}

283//-------------------------------------------------------------------------------
284template <typename Generator, typename Real>
285bool TMinHeap<Generator,Real> ::IsValid ()
286{
287    return IsValid(0, m_iQuantity-1);
288}

289//-------------------------------------------------------------------------------
290template <typename Generator, typename Real>
291void TMinHeap<Generator,Real> ::Print (const char* acFilename)
292{
293    std::ofstream kOStr(acFilename);
294    for (int i = 0; i < m_iQuantity; i++)
295    {
296        TMinHeapRecord<Generator,Real>* pkRecord = m_apkRecords[i];
297        kOStr << pkRecord->m_iIndex << ": gen = " << pkRecord->m_tGenerator
298            << " , val = " << pkRecord->m_fValue << std::endl;
299    }

300    kOStr.close();
301}

302//----------------------------------------------------------------------------
303
304// end


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            免费视频久久| 久久一区二区三区四区| 久久成人国产| 久久精品国产999大香线蕉| 国产精品videosex极品| a4yy欧美一区二区三区| 在线综合+亚洲+欧美中文字幕| 欧美激情片在线观看| 一本色道久久加勒比精品| 久久国产精品黑丝| 一本色道久久| 国内精品一区二区三区| 欧美v日韩v国产v| 亚洲第一精品影视| 樱桃视频在线观看一区| 久久精品亚洲热| 久久久av网站| 中文亚洲免费| 国产在线播放一区二区三区| 国产麻豆9l精品三级站| 欧美日韩精品是欧美日韩精品| 欧美一级精品大片| 一个人看的www久久| 欧美亚洲一区三区| 欧美阿v一级看视频| 国产精品国产一区二区| 美女视频黄 久久| 欧美一区二区免费观在线| 久久久久国产精品www| 亚洲一区二区三区乱码aⅴ| 欧美va亚洲va国产综合| 久久国产欧美精品| 亚洲高清免费视频| 亚欧成人在线| 欧美日本三区| 欧美日韩p片| 激情五月***国产精品| 国产色婷婷国产综合在线理论片a| 欧美精品一区二区三区很污很色的 | 欧美成va人片在线观看| 一本色道久久精品| 农村妇女精品| 永久免费视频成人| 久久精品日韩欧美| 亚洲色无码播放| 在线午夜精品自拍| 欧美激情精品久久久久久黑人| 欧美成人久久| 精品91久久久久| 久久精品成人| 亚洲欧美中文字幕| 欧美一级久久久| 欧美亚洲成人免费| 中文在线资源观看网站视频免费不卡 | 99re6热只有精品免费观看| 亚洲第一福利视频| 久久久久久欧美| 韩国av一区二区三区四区| 国产欧美一区二区精品婷婷| 国产一区二区三区不卡在线观看 | 欧美激情第三页| 原创国产精品91| 久久亚洲精品中文字幕冲田杏梨| 久久久精品国产免费观看同学 | 免费一级欧美片在线观看| 亚洲国产欧美不卡在线观看| 亚洲第一精品久久忘忧草社区| 久久久久久久久久久一区| 精品成人一区二区三区| 免费观看一级特黄欧美大片| 美女黄毛**国产精品啪啪| 亚洲国产精品日韩| 午夜激情久久久| 久久性天堂网| 久久免费视频在线观看| 亚洲高清不卡| 亚洲国产成人午夜在线一区| 欧美精品大片| 午夜精品久久久久久99热| 亚洲欧美日本日韩| 黄色精品网站| 亚洲精品久久久久中文字幕欢迎你| 在线亚洲自拍| 国产伦精品一区二区三区视频黑人| 久久天堂国产精品| 欧美国产视频在线观看| 亚洲一区日韩在线| 亚洲激情在线视频| 久久九九精品99国产精品| 欧美日韩精品欧美日韩精品| 亚洲欧美日韩国产成人精品影院| 欧美激情欧美激情在线五月| 亚洲丝袜av一区| 嫩草影视亚洲| 亚洲免费视频网站| 久久嫩草精品久久久久| 亚洲一区二区三区国产| 亚洲东热激情| 国产精品日日摸夜夜摸av| 亚洲一区二区欧美| 在线欧美视频| 西瓜成人精品人成网站| 亚洲第一黄色| 国产精品亚洲精品| 欧美gay视频激情| 国产精品久久久久秋霞鲁丝| 一本大道久久a久久精品综合| 午夜久久资源| 国产精品一区亚洲| 亚洲高清一区二区三区| 国产亚洲aⅴaaaaaa毛片| 日韩视频在线你懂得| 在线成人av| 欧美在线欧美在线| 激情亚洲网站| 亚洲一区免费看| 亚洲线精品一区二区三区八戒| 久久综合久久久久88| 午夜视频在线观看一区二区三区| 亚洲欧美日韩直播| 在线亚洲欧美视频| 欧美大片国产精品| 免费在线成人av| 伊甸园精品99久久久久久| 亚洲男人天堂2024| 国产精品视频区| 亚洲免费av电影| 9l国产精品久久久久麻豆| 免费欧美在线视频| 欧美激情小视频| 亚洲人www| 亚洲黄色成人| 亚洲高清不卡在线| 欧美大片一区二区三区| 亚洲福利视频三区| 亚洲精品乱码久久久久久久久| 亚洲久久在线| 国产欧美va欧美va香蕉在| 一本一本久久| 欧美亚洲综合网| 国产一区二区精品| 久久久久久色| 欧美激情一区二区三区全黄| 亚洲国产一区二区在线| 亚洲看片免费| 亚洲一区中文| 国产欧美一区二区三区沐欲| 翔田千里一区二区| 免费高清在线一区| 99亚洲视频| 国产精品私房写真福利视频| 欧美一区2区视频在线观看| 久久久噜噜噜久噜久久| 欧美激情中文字幕在线| 亚洲精品一区二区三区蜜桃久| 一区二区精品在线| 国产精品综合不卡av| 欧美有码视频| 亚洲国产精品视频| 亚洲女女女同性video| 欧美人与性动交α欧美精品济南到| 一区二区国产精品| 久久综合成人精品亚洲另类欧美| 精品成人在线观看| 久久久一区二区三区| 91久久精品一区| 欧美一区影院| 欧美午夜视频网站| 欧美亚洲日本国产| 久久婷婷国产麻豆91天堂| 日韩午夜黄色| 美日韩在线观看| 一区二区三区精品视频在线观看| 久久国产精品亚洲77777| 亚洲精品久久久一区二区三区| 国产精品久久福利| 久久综合久久综合九色| 亚洲伦理久久| 欧美sm视频| 久久精品30| 亚洲影院色在线观看免费| 国内精品国产成人| 国产精品h在线观看| 欧美14一18处毛片| 久久精品国产精品亚洲精品| 日韩视频在线观看一区二区| 看片网站欧美日韩| 激情懂色av一区av二区av| 欧美日韩国产区一| 久久精品国产欧美亚洲人人爽| 久久久精品2019中文字幕神马| 亚洲毛片在线看| 欧美成人黄色小视频| 亚洲欧美国产高清| 99视频精品在线| 亚洲国产91| 伊人狠狠色丁香综合尤物| 国产日韩精品一区二区三区在线 | 欧美激情综合色| 麻豆精品91|