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

Daly的游戲人生

紅黑樹的實現與討論

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

     由于red-black tree的復雜性,sedgewick在08年重新審視了紅黑樹的實現,   提出了left-leaning red-black tree . 大大簡化了red-black tree的實現難度,代碼非常簡潔清晰。不過外國某人實現了LLRB,插入和刪除的效率大概比標準紅黑樹慢一倍左右,搜索效率相當。
     自上而下的遞歸版本的代碼量少很多,而且很清晰,但是效率不及自下以上的迭代實現。
     為了進一步節省空間,可以把color信息合并到parent指針中。這是由于指針以4字節對齊,最低兩位必然為0,顏色值只有紅,黑兩種狀態,于是可以利用最低的1bit保存顏色信息,只需要定義一些 位運算的宏,便可以節省了4byte/結點的空間 。
#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)

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

     測試環境:
     Intel celeron 2.4GHz / 1GB 內存 / winXP
     編譯環境: VC++ 6.0  和 Dev c++ 4.9.9

     結果:
     測試數據分別是50000和5000個隨機樣本,  時間為所有樣本操作總和,單位為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

   對于5000個以內的樣本,搜索5000個元素總共才用了幾毫秒,已經可以滿足一般key查找應用了。
   由于rbtree的實現復雜性,AVL樹和Treaps的實際效率并不比red-black tree差,但是實現要簡單多了。(參見此處)
   在本測試例子中,key是一個范圍內的整數,用hash table會快得到,這樣不太公平,因此就沒測了。而且hash的數據是無序的,不支持范圍查找。

PS:  VC6的PJ版STL實現可以扔進垃圾桶了。STL的實現還是用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 閱讀(4248) 評論(4)  編輯 收藏 引用 所屬分類: 數據結構與算法

評論

# re: 紅黑樹的實現與討論[未登錄] 2009-11-23 10:12 Apan

不錯!  回復  更多評論   

# re: 紅黑樹的實現與討論 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.  回復  更多評論   

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

good post...  回復  更多評論   

# 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.  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   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>
            91久久国产综合久久| 亚洲一区二区三区中文字幕在线 | 欧美性猛交一区二区三区精品| 亚洲国产精品女人久久久| 另类亚洲自拍| 久久影院午夜片一区| 亚洲风情亚aⅴ在线发布| 亚洲国产精品va在线看黑人动漫| 美国三级日本三级久久99| 亚洲毛片网站| 亚洲影院在线| 韩日精品视频| 亚洲美女av在线播放| 欧美午夜视频在线| 欧美中文字幕在线播放| 欧美中文字幕在线观看| 亚洲激情视频| 一区二区动漫| 亚洲大片精品永久免费| 亚洲精品乱码久久久久| 国产精品亚洲激情| 欧美国产极速在线| 国产精品av久久久久久麻豆网| 久久成人在线| 欧美搞黄网站| 久久久精品国产99久久精品芒果| 欧美成人精品高清在线播放| 亚洲视频在线二区| 久久久久久久久久久久久女国产乱 | 亚洲国产精品传媒在线观看 | 亚洲一区二区三区在线| 黄页网站一区| 在线一区二区三区四区五区| 伊人色综合久久天天| 在线亚洲一区二区| 亚洲精品中文字幕女同| 久久av一区| 亚洲影院色无极综合| 狂野欧美一区| 久久一区二区三区av| 国产精品久久久久久久久动漫| 农村妇女精品| 国产性猛交xxxx免费看久久| 一区二区三区久久久| 亚洲美女在线视频| 久久免费的精品国产v∧| 欧美一区二区精品| 欧美裸体一区二区三区| 欧美成人一品| 亚洲第一综合天堂另类专| 欧美一级日韩一级| 欧美一级电影久久| 国产精品九九久久久久久久| 亚洲国产精品久久91精品| 136国产福利精品导航网址| 午夜日本精品| 欧美一级艳片视频免费观看| 欧美日韩国产精品专区| 欧美国产日韩一区二区在线观看| 国产亚洲一区二区三区在线观看 | 亚洲丰满在线| 亚洲国产另类精品专区| 久久伊人免费视频| 久久综合五月| 韩国av一区二区三区在线观看| 亚洲免费网址| 欧美在线一二三四区| 国产精品三区www17con| 一区二区三区三区在线| 亚洲午夜激情在线| 欧美亚男人的天堂| 亚洲性人人天天夜夜摸| 欧美一区二区网站| 国产原创一区二区| 久久精品视频导航| 欧美www视频在线观看| 亚洲夫妻自拍| 欧美精品免费看| 一本大道久久a久久综合婷婷| 亚洲午夜成aⅴ人片| 国产精品久久久久久久电影| 亚洲欧美日韩视频二区| 久久久久久久久久久成人| 怡红院精品视频| 免费成人av在线| 99国产精品私拍| 亚洲欧美中文另类| 经典三级久久| 欧美人与性动交a欧美精品| 夜夜夜精品看看| 欧美在线观看日本一区| 在线观看精品一区| 欧美激情影音先锋| 亚洲在线观看免费视频| 两个人的视频www国产精品| 亚洲精品免费电影| 国产精品色一区二区三区| 久久精品99国产精品| 亚洲第一伊人| 午夜影院日韩| 亚洲三级国产| 国产免费一区二区三区香蕉精| 久久九九热re6这里有精品| 亚洲精品免费电影| 久久精品欧美日韩| 日韩视频免费看| 国产亚洲a∨片在线观看| 你懂的亚洲视频| 亚洲欧美日韩爽爽影院| 亚洲国产日韩欧美在线动漫| 午夜视频一区| 亚洲精品免费网站| 国产自产高清不卡| 欧美日韩情趣电影| 久久亚洲精品一区二区| 亚洲一区一卡| 亚洲理伦电影| 欧美激情1区| 久久久不卡网国产精品一区| 亚洲乱码国产乱码精品精可以看 | 亚洲精品日本| 国产视频亚洲精品| 欧美系列精品| 欧美福利小视频| 欧美在线视频免费| 亚洲免费在线观看视频| 亚洲日本成人| 亚洲国产精品久久| 女人天堂亚洲aⅴ在线观看| 欧美呦呦网站| 欧美一区精品| 亚洲欧洲av一区二区| 在线亚洲免费| 一本久道久久综合狠狠爱| 亚洲国产精品一区在线观看不卡 | 91久久久久久久久| 一区免费视频| 影音先锋成人资源站| 韩国三级在线一区| 国产一区二区三区最好精华液| 国产精品草莓在线免费观看| 欧美日韩在线一二三| 欧美日韩中文字幕在线视频| 欧美另类女人| 欧美日韩国产123| 欧美视频免费在线| 国产精品videossex久久发布| 欧美色另类天堂2015| 欧美日韩精品免费在线观看视频| 欧美成人中文字幕| 欧美国产日韩亚洲一区| 欧美激情第10页| 欧美日韩免费网站| 国产精品毛片| 国产伦精品一区二区三区高清版| 国产精品亚发布| 国产午夜精品视频免费不卡69堂| 国产女人精品视频| 黄色成人在线网址| 亚洲大胆女人| 一本色道久久综合精品竹菊| 中文在线资源观看网站视频免费不卡| 在线视频欧美日韩| 午夜欧美精品久久久久久久| 久久精品国产在热久久| 欧美电影在线播放| 一区二区三区免费看| 亚洲欧美清纯在线制服| 久久国产精品久久w女人spa| 欧美va亚洲va香蕉在线| 欧美日韩亚洲一区二区三区在线| 国产精品欧美经典| 亚洲高清网站| 在线亚洲免费视频| 久久高清福利视频| 亚洲第一毛片| 午夜精品福利在线| 欧美激情网站在线观看| 国产精品青草久久久久福利99| 狠狠综合久久| 亚洲网站视频福利| 久久久久久久综合日本| 亚洲人午夜精品免费| 欧美一区二区三区四区视频| 欧美精品综合| 在线国产精品一区| 亚洲一区精品视频| 欧美成人午夜视频| 午夜视频一区在线观看| 欧美成人有码| 黄色av成人| 新67194成人永久网站| 亚洲国内自拍| 久久国产精品99精品国产| 欧美吻胸吃奶大尺度电影| 亚洲成人资源| 久久精品成人一区二区三区| 日韩亚洲综合在线| 美国成人直播| 伊人色综合久久天天五月婷|