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

Daly的游戲人生

紅黑樹(shù)的實(shí)現(xiàn)與討論

     紅黑樹(shù)是比較常用的二叉查找樹(shù),也是比較難實(shí)現(xiàn)的查找樹(shù)。他的實(shí)質(zhì)是把2-3-4樹(shù)(即4階的B樹(shù))化為二叉樹(shù)的表示形式,具有較好的性能。一般算法書(shū)(包括CLRS的算法導(dǎo)論)講述red-black tree都講得很頭暈,特別是各種不同情況的討論。最好看看紅黑樹(shù)的作者之一sedgewick的pdf(參見(jiàn)此處)。 另外,cnblogs的abatei兄也把原理講得很清楚(點(diǎn)擊這里)。

     由于red-black tree的復(fù)雜性,sedgewick在08年重新審視了紅黑樹(shù)的實(shí)現(xiàn),   提出了left-leaning red-black tree . 大大簡(jiǎn)化了red-black tree的實(shí)現(xiàn)難度,代碼非常簡(jiǎn)潔清晰。不過(guò)外國(guó)某人實(shí)現(xiàn)了LLRB,插入和刪除的效率大概比標(biāo)準(zhǔn)紅黑樹(shù)慢一倍左右,搜索效率相當(dāng)。
     自上而下的遞歸版本的代碼量少很多,而且很清晰,但是效率不及自下以上的迭代實(shí)現(xiàn)。
     為了進(jìn)一步節(jié)省空間,可以把color信息合并到parent指針中。這是由于指針以4字節(jié)對(duì)齊,最低兩位必然為0,顏色值只有紅,黑兩種狀態(tài),于是可以利用最低的1bit保存顏色信息,只需要定義一些 位運(yùn)算的宏,便可以節(jié)省了4byte/結(jié)點(diǎn)的空間 。
#define rb_parent(r)   ((struct rb_node *)((r)->rb_parent_color & ~3))
#define rb_color(r)   ((r)->rb_parent_color & 1)
#define rb_is_red(r)   (!rb_color(r))
#define rb_is_black(r) rb_color(r)
#define rb_set_red(r)  do { (r)->rb_parent_color &= ~1; } while (0)
#define rb_set_black(r)  do { (r)->rb_parent_color |= 1; } while (0)

  
    自己根據(jù)linux kernel中的rbtree.c(非遞歸),做了一層薄薄的C++模板封裝,并對(duì)比了不同實(shí)現(xiàn)的效率。(本實(shí)現(xiàn)中沒(méi)有把color合并到指針中)
     (我的rbtree源代碼下載)

     測(cè)試環(huán)境:
     Intel celeron 2.4GHz / 1GB 內(nèi)存 / winXP
     編譯環(huán)境: VC++ 6.0  和 Dev c++ 4.9.9

     結(jié)果:
     測(cè)試數(shù)據(jù)分別是50000和5000個(gè)隨機(jī)樣本,  時(shí)間為所有樣本操作總和,單位為ms
    
my rbtree gcc STL map VC6 STL map 線性搜索
insert 106.2  /  5.11 173.6 / 8.17 402.7  /  40.16 0
search 73.9  /  1.69  89.7  /  3.28 226.9  /  17.8 3936.8  /  32.8
delete 131.1  /  5.07 177.1  /  9.56 579.9  /  47.9

   對(duì)于5000個(gè)以?xún)?nèi)的樣本,搜索5000個(gè)元素總共才用了幾毫秒,已經(jīng)可以滿(mǎn)足一般key查找應(yīng)用了。
   由于rbtree的實(shí)現(xiàn)復(fù)雜性,AVL樹(shù)和Treaps的實(shí)際效率并不比red-black tree差,但是實(shí)現(xiàn)要簡(jiǎn)單多了。(參見(jiàn)此處)
   在本測(cè)試?yán)又校琸ey是一個(gè)范圍內(nèi)的整數(shù),用hash table會(huì)快得到,這樣不太公平,因此就沒(méi)測(cè)了。而且hash的數(shù)據(jù)是無(wú)序的,不支持范圍查找。

PS:  VC6的PJ版STL實(shí)現(xiàn)可以扔進(jìn)垃圾桶了。STL的實(shí)現(xiàn)還是用SGI版本的比較好。

以下是benchmark的代碼

  1struct SampleType {
  2    char ch[8];
  3}
;
  4
  5struct SampleType testvalue;
  6
  7void benchmark_once(int nkeys)
  8{
  9    int i;
 10    int* key_set[3];   //key_set[0] for insert, 1 for search, 2 for erase
 11    RbTree<int, SampleType> my_rbt;
 12    std::map<int, SampleType> stl_map;
 13    std::map<int, SampleType>::iterator stl_iter; 
 14
 15    //generate test sequence
 16    for (i=0; i<3; i++{
 17        key_set[i] = new int[nkeys];
 18        if (key_set[i] == NULL) exit(0);
 19    }

 20    for (i=0; i<nkeys; i++{
 21        key_set[0][i] = key_set[1][i] = key_set[2][i] = i;
 22    }

 23
 24    srand(time(NULL));
 25    random_shuffle(key_set[0], nkeys);  //insert
 26    random_shuffle(key_set[1], nkeys);  //search
 27    random_shuffle(key_set[2], nkeys);  //erase
 28
 29    //begin test
 30
 31    LARGE_INTEGER litmp;
 32    LONGLONG  qbegin, qend;
 33    double df_freq, df_time;
 34    QueryPerformanceFrequency(&litmp);
 35    df_freq = (double)litmp.QuadPart;
 36
 37    //my rbtree ////////////////////////////
 38
 39    //insert benchmark
 40    QueryPerformanceCounter(&litmp);
 41    qbegin = litmp.QuadPart;
 42    for (i=0; i<nkeys; i++{
 43        my_rbt.insert(key_set[0][i], testvalue);
 44    }

 45
 46    QueryPerformanceCounter(&litmp);
 47    qend = litmp.QuadPart;
 48    df_time = (double)(qend - qbegin) / df_freq;
 49    printf("my rbtree insert: %lf ms\n", df_time*1000);
 50
 51    //search benchmark
 52    QueryPerformanceCounter(&litmp);
 53    qbegin = litmp.QuadPart;
 54
 55    for (i=0; i<nkeys; i++{
 56        my_rbt.search(key_set[1][i]);
 57    }

 58    QueryPerformanceCounter(&litmp);
 59    qend = litmp.QuadPart;
 60    df_time = (double)(qend - qbegin) / df_freq;
 61    printf("my rbtree search: %lf ms\n", df_time*1000);
 62
 63    //erase benchmark
 64    QueryPerformanceCounter(&litmp);
 65    qbegin = litmp.QuadPart;
 66
 67    for (i=0; i<nkeys; i++{
 68        my_rbt.erase(key_set[2][i]);
 69    }

 70    QueryPerformanceCounter(&litmp);
 71    qend = litmp.QuadPart;
 72    df_time = (double)(qend - qbegin) / df_freq;
 73    printf("my rbtree erase: %lf ms\n", df_time*1000);
 74
 75    //VC++6 version STL ////////////////////////////
 76    //insert test
 77    QueryPerformanceCounter(&litmp);
 78    qbegin = litmp.QuadPart;
 79    for (i=0; i<nkeys; i++{
 80        stl_map.insert(std::make_pair(key_set[0][i], testvalue));
 81    }

 82
 83    QueryPerformanceCounter(&litmp);
 84    qend = litmp.QuadPart;
 85    df_time = (double)(qend - qbegin) / df_freq;
 86    printf("stl_map insert: %lf ms\n", df_time*1000);
 87
 88    //search test
 89    QueryPerformanceCounter(&litmp);
 90    qbegin = litmp.QuadPart;
 91    for (i=0; i<nkeys; i++{
 92        stl_map.find(key_set[1][i]);
 93    }

 94
 95    QueryPerformanceCounter(&litmp);
 96    qend = litmp.QuadPart;
 97    df_time = (double)(qend - qbegin) / df_freq;
 98    printf("stl_map search: %lf ms\n", df_time*1000);
 99
100    //erase test
101    QueryPerformanceCounter(&litmp);
102    qbegin = litmp.QuadPart;
103
104    for (i=0; i<nkeys; i++{
105        stl_map.erase(key_set[2][i]);
106    }

107    QueryPerformanceCounter(&litmp);
108    qend = litmp.QuadPart;
109    df_time = (double)(qend - qbegin) / df_freq;
110    printf("stl_map erase: %lf ms\n", df_time*1000);
111
112    //clear up sequence
113    for (i=0; i<3; i++{
114        delete[] key_set[i];
115    }

116}

posted on 2009-11-20 20:21 Daly 閱讀(4209) 評(píng)論(4)  編輯 收藏 引用 所屬分類(lèi): 數(shù)據(jù)結(jié)構(gòu)與算法

評(píng)論

# re: 紅黑樹(shù)的實(shí)現(xiàn)與討論[未登錄](méi) 2009-11-23 10:12 Apan

不錯(cuò)!  回復(fù)  更多評(píng)論   

# re: 紅黑樹(shù)的實(shí)現(xiàn)與討論 2010-05-18 23:40 GLENDANewman

A thesis seek composition is a project for which a novice performs the most embracive ransack possible and blends it into a single assignment, usually filling 50 to 150 pages. So maybe <a href="http://www.supreme-thesis.com">dissertation writing service</a> will aid you.  回復(fù)  更多評(píng)論   

# shi 2010-12-09 11:47 uk dress

good post...  回復(fù)  更多評(píng)論   

# Hairdresser George St Sydney 2011-05-21 14:40 Hairdresser George St Sydney

Thanks for taking the time to talk about this, I feel fervently about this and I take pleasure in learning about this topic. Please, as you gain information, please update this blog with more information. I have found it very useful.  回復(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>
            国产精品美女久久久浪潮软件 | 欧美在线免费观看亚洲| 亚洲最黄网站| 亚洲视频在线观看视频| 亚洲一区二区免费在线| 亚洲一区二区三区免费观看| 午夜视频一区二区| 久久久精品国产一区二区三区| 久久夜色精品国产亚洲aⅴ| 裸体歌舞表演一区二区| 欧美裸体一区二区三区| 性欧美在线看片a免费观看| 欧美午夜精品久久久久久久| 国产精品三上| 永久免费毛片在线播放不卡| 日韩一级黄色片| 新片速递亚洲合集欧美合集| 久久综合伊人77777麻豆| 亚洲国产精品高清久久久| 亚洲精品久久久久| 欧美一区二区三区在线观看| 欧美大片一区| 国产一区99| 一区二区免费在线播放| 久久国产日本精品| 亚洲国产日韩一区二区| 亚洲嫩草精品久久| 欧美黄污视频| 红桃视频一区| 亚洲影音一区| 亚洲黄色有码视频| 欧美一站二站| 国产精品高精视频免费| 亚洲国产天堂久久综合网| 亚洲欧美在线免费| 亚洲国产专区校园欧美| 久久国产主播精品| 国产精品亚洲第一区在线暖暖韩国| 亚洲韩国青草视频| 久色婷婷小香蕉久久| 亚洲欧美国产精品va在线观看| 欧美激情1区| 亚洲国产精品久久久久婷婷884 | 99re在线精品| 玖玖综合伊人| 国产日韩精品视频一区| 亚洲一区二区三区精品动漫| 亚洲国产va精品久久久不卡综合| 欧美影片第一页| 国产精品午夜在线观看| 亚洲综合色激情五月| 亚洲免费观看高清完整版在线观看熊 | 一区二区电影免费观看| 欧美精品在线观看播放| 亚洲激情视频在线观看| 嫩草影视亚洲| 久久综合伊人77777| 激情国产一区| 久久综合一区二区| 久久久久久国产精品mv| 伊人天天综合| 国产精品美女999| 国产女精品视频网站免费| 亚洲婷婷在线| 国产精品99久久久久久www| 欧美日韩午夜在线| 亚洲午夜一区二区三区| 一区二区三区偷拍| 国产精品女主播在线观看| 亚洲欧美视频一区二区三区| 亚洲欧美日韩天堂| 韩国自拍一区| 欧美不卡在线视频| 欧美成年人网站| 在线亚洲一区| 校园激情久久| 在线免费观看欧美| 亚洲黄色免费网站| 欧美特黄视频| 久久久美女艺术照精彩视频福利播放 | 亚洲一区三区视频在线观看| 在线一区二区三区四区五区| 国产精品入口日韩视频大尺度| 久久精品99国产精品酒店日本| 久久视频免费观看| 亚洲视频每日更新| 亚洲欧美日韩视频二区| 亚洲黄色成人久久久| 亚洲最黄网站| 在线观看欧美黄色| 洋洋av久久久久久久一区| 国产免费成人在线视频| 亚洲成在线观看| 国产精品视屏| 亚洲国产精品视频| 国产美女精品人人做人人爽| 欧美成人免费一级人片100| 欧美日精品一区视频| 久久香蕉国产线看观看av| 欧美日韩国产91| 久久青草久久| 国产精品激情av在线播放| 欧美jizz19hd性欧美| 国产伦精品一区二区三区高清| 亚洲国产成人porn| 韩日精品在线| 亚洲在线一区二区| 日韩性生活视频| 久久人体大胆视频| 欧美伊人久久大香线蕉综合69| 欧美日韩高清在线观看| 欧美高清在线精品一区| 国产一区二区三区四区三区四| 亚洲区欧美区| 亚洲国产日本| 久久久综合视频| 久久精品国产一区二区三区| 欧美三区免费完整视频在线观看| 欧美高清在线精品一区| 国产在线观看91精品一区| 亚洲高清在线观看一区| 性视频1819p久久| 亚洲第一伊人| 久久9热精品视频| 亚洲综合色在线| 欧美三级视频在线播放| 亚洲精品国产拍免费91在线| 亚洲人成毛片在线播放| 麻豆成人在线观看| 老司机免费视频久久| 国产视频在线观看一区二区| 亚洲一区二区三区在线| 欧美一级视频免费在线观看| 欧美午夜在线一二页| 一区二区三区国产在线观看| 亚洲欧美日韩国产综合在线| 欧美视频日韩视频| 亚洲在线日韩| 久久久福利视频| 伊人久久婷婷| 免费亚洲一区| 亚洲精品一区二区三区99| 在线亚洲伦理| 国产乱码精品一区二区三区av | 亚洲在线免费视频| 欧美一区二区三区视频免费播放 | 欧美专区在线观看一区| 久久久噜噜噜久久久| 激情视频一区二区| 久久综合五月天婷婷伊人| 亚洲第一二三四五区| 一区二区欧美视频| 国产精品家庭影院| 久久成人18免费观看| 欧美福利视频在线| 一区二区三区福利| 国产欧美在线观看| 裸体一区二区| 99国内精品久久| 欧美在线网站| 亚洲欧洲日产国产网站| 欧美午夜精品久久久久久久| 欧美伊人久久久久久久久影院 | 久久国产日韩| 亚洲区国产区| 欧美在线视频导航| 91久久精品日日躁夜夜躁国产| 欧美日本国产视频| 午夜欧美精品| 亚洲国产欧美精品| 午夜亚洲性色视频| 亚洲国产一区二区a毛片| 欧美亚州一区二区三区 | 亚洲欧美高清| 亚洲二区免费| 欧美中文字幕在线| 99成人在线| 狠狠综合久久| 欧美性大战xxxxx久久久| 久久人人爽人人爽爽久久| 一区二区三区欧美视频| 欧美福利视频在线| 欧美在线你懂的| 亚洲私人影院| 亚洲人成毛片在线播放| 亚洲一区二区精品在线| 亚洲欧洲精品一区| 国产欧美一区二区白浆黑人| 蜜臀久久99精品久久久画质超高清| 99精品国产在热久久| 久久综合亚州| 久久精品网址| 亚洲一区久久| 一区二区三区国产| 亚洲精品欧美| 最近中文字幕日韩精品| 国内外成人在线| 国产欧美日韩| 国产乱码精品一区二区三区忘忧草 | 久久精品一区二区|