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

ACM___________________________

______________白白の屋
posts - 182, comments - 102, trackbacks - 0, articles - 0
<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(24)

隨筆分類(332)

隨筆檔案(182)

FRIENDS

搜索

積分與排名

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

MiYu原創(chuàng), 轉(zhuǎn)帖請(qǐng)注明 : 轉(zhuǎn)載自 ______________白白の屋    

 

伸展樹(Splay Tree)是AVL樹不錯(cuò)的替代,它有以下幾個(gè)特點(diǎn):
(1)它是二叉查找樹的改進(jìn),所以具有二叉查找樹的有序性。
(2)對(duì)伸展樹的操作的平攤復(fù)雜度是O(log2n)。
(3)伸展樹的空間要求、編程難度非常低。

提到伸展樹,就不得不提到AVL樹和Read-Black樹,雖然這兩種樹能夠保證各種操作在最壞情況下都為logN,但是兩都實(shí)現(xiàn)都比較復(fù)雜。而在實(shí)際情況中,90%的訪問發(fā)生在10%的數(shù)據(jù)上。因此,我們可以重構(gòu)樹的結(jié)構(gòu),使得被經(jīng)常訪問的節(jié)點(diǎn)朝樹根的方向移動(dòng)。盡管這會(huì)引入額外的操作,但是經(jīng)常被訪問的節(jié)點(diǎn)被移動(dòng)到了靠近根的位置,因此,對(duì)于這部分節(jié)點(diǎn),我們可以很快的訪問。這樣,就能使得平攤復(fù)雜度為logN。

1、自底向上的伸展樹
伸展操作Splay(x,S)是在保持伸展樹有序性的前提下,通過一系列旋轉(zhuǎn)操作將伸展樹S中的元素x調(diào)整至樹的根部的操作。
在旋轉(zhuǎn)的過程中,要分三種情況分別處理:
(1)Zig 或 Zag
(2)Zig-Zig 或 Zag-Zag
(3)Zig-Zag 或 Zag-Zig
1.1、Zig或Zag操作
節(jié)點(diǎn)x的父節(jié)點(diǎn)y是根節(jié)點(diǎn)。

1.2、Zig-Zig或Zag-Zag操作
節(jié)點(diǎn)x的父節(jié)點(diǎn)y不是根節(jié)點(diǎn),且x與y同時(shí)是各自父節(jié)點(diǎn)的左孩子或者同時(shí)是各自父節(jié)點(diǎn)的右孩子。

1.3、Zig-Zag或Zag-Zig操作
節(jié)點(diǎn)x的父節(jié)點(diǎn)y不是根節(jié)點(diǎn),x與y中一個(gè)是其父節(jié)點(diǎn)的左孩子而另一個(gè)是其父節(jié)點(diǎn)的右孩子。

2、自頂向下的伸展樹
    在自底向上的伸展樹中,我們需要求一個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)和祖父節(jié)點(diǎn),因此這種伸展樹難以實(shí)現(xiàn)。因此,我們可以構(gòu)建自頂向下的伸展樹。
    當(dāng)我們沿著樹向下搜索某個(gè)節(jié)點(diǎn)X的時(shí)候,我們將搜索路徑上的節(jié)點(diǎn)及其子樹移走。我們構(gòu)建兩棵臨時(shí)的樹──左樹和右樹。沒有被移走的節(jié)點(diǎn)構(gòu)成的樹稱作中樹。在伸展操作的過程中:
(1)當(dāng)前節(jié)點(diǎn)X是中樹的根。
(2)左樹L保存小于X的節(jié)點(diǎn)。
(3)右樹R保存大于X的節(jié)點(diǎn)。
開始時(shí)候,X是樹T的根,左右樹L和R都是空的。和前面的自下而上相同,自上而下也分三種情況:
2.1、Zig操作

如上圖,在搜索到X的時(shí)候,所查找的節(jié)點(diǎn)比X小,將Y旋轉(zhuǎn)到中樹的樹根。旋轉(zhuǎn)之后,X及其右子樹被移動(dòng)到右樹上。很顯然,右樹上的節(jié)點(diǎn)都大于所要查找的節(jié)點(diǎn)。注意X被放置在右樹的最小的位置,也就是X及其子樹比原先的右樹中所有的節(jié)點(diǎn)都要小。這是由于越是在路徑前面被移動(dòng)到右樹的節(jié)點(diǎn),其值越大。

2.2、Zig-Zig操作

這種情況下,所查找的節(jié)點(diǎn)在Z的子樹中,也就是,所查找的節(jié)點(diǎn)比X和Y都小。所以要將X,Y及其右子樹都移動(dòng)到右樹中。首先是Y繞X右旋,然后Z繞Y右旋,最后將Z的右子樹(此時(shí)Z的右子節(jié)點(diǎn)為Y)移動(dòng)到右樹中。

2.3、Zig-Zag操作

這種情況中,首先將Y右旋到根。這和Zig的情況是一樣的,然后變成上圖右邊所示的形狀。此時(shí),就與Zag(與Zig相反)的情況一樣了。

最后,在查找到節(jié)點(diǎn)后,將三棵樹合并。如圖:


2.4、示例:
下面是一個(gè)查找節(jié)點(diǎn)19的例子。在例子中,樹中并沒有節(jié)點(diǎn)19,最后,距離節(jié)點(diǎn)最近的節(jié)點(diǎn)18被旋轉(zhuǎn)到了根作為新的根。節(jié)點(diǎn)20也是距離節(jié)點(diǎn)19最近的節(jié)點(diǎn),但是節(jié)點(diǎn)20沒有成為新根,這和節(jié)點(diǎn)20在原來樹中的位置有關(guān)系。

3、實(shí)現(xiàn)
3.1、splay操作

代碼
tree_node * splay (int i, tree_node * t) {
    tree_node N, 
*l, *r, *y;
    
if (t == NULL) 
        
return t;
    N.left 
= N.right = NULL;
    l 
= r = &N;

    
for (;;)
    {
        
if (i < t->item) 
        {
            
if (t->left == NULL) 
                
break;
            
if (i < t->left->item) 
            {
                y 
= t->left;                           /* rotate right */
                t
->left = y->right;
                y
->right = t;
                t 
= y;
                
if (t->left == NULL) 
                    
break;
            }
            r
->left = t;                               /* link right */
            r 
= t;
            t 
= t->left;
        } 
else if (i > t->item)
        {
            
if (t->right == NULL) 
                
break;
            
if (i > t->right->item) 
            {
                y 
= t->right;                          /* rotate left */
                t
->right = y->left;
                y
->left = t;
                t 
= y;
                
if (t->right == NULL) 
                    
break;
            }
            l
->right = t;                              /* link left */
            l 
= t;
            t 
= t->right;
        } 
else {
            
break;
        }
    }
    l
->right = t->left;                                /* assemble */
    r
->left = t->right;
    t
->left = N.right;
    t
->right = N.left;
    
return t;
}

Rotate right(查找10):

Link right:

Assemble:

Rotate left(查找20):

Link left:

3.2、插入操作

代碼
  /*
  **將i插入樹t中,返回樹的根結(jié)點(diǎn)(item值==i)
  */
  tree_node* ST_insert(int i, tree_node *t) {
      /* Insert i into the tree t, unless it's already there.    */
      /* Return a pointer to the resulting tree.                 */
      tree_node* node;
      
      node = (tree_node *) malloc (sizeof (tree_node));
     if (node == NULL){
         printf("Ran out of space\n");
         exit(1);
     }
     node->item = i;
     if (t == NULL) {
         node->left = node->right = NULL;
         size = 1;
         return node;
     }
     t = splay(i,t);
     if (i < t->item) {  //令t為i的右子樹
         node->left = t->left;
         node->right = t;
         t->left = NULL;
         size ++;
         return node;
     } else if (i > t->item) { //令t為i的左子樹
         node->right = t->right;
         node->left = t;
         t->right = NULL;
         size++;
         return node;
     } else { 
         free(node); //i值已經(jīng)存在于樹t中
         return t;
     }
 }

3.3、刪除操作

代碼
  /*
 **從樹中刪除i,返回樹的根結(jié)點(diǎn)
 */
 tree_node* ST_delete(int i, tree_node* t) {
     /* Deletes i from the tree if it's there.               */
     /* Return a pointer to the resulting tree.              */
     tree_node* x;
     if (t==NULL) 
         return NULL;
     t = splay(i,t);
     if (i == t->item) {               /* found it */
         if (t->left == NULL) { //左子樹為空,則x指向右子樹即可
           x = t->right;
         } else {
             x = splay(i, t->left); //查找左子樹中最大結(jié)點(diǎn)max,令右子樹為max的右子樹
             x->right = t->right;
         }
         size--;
         free(t);
         return x;
     }
     return t;                         /* It wasn't there */
 }

完整代碼:

代碼
#include <stdio.h>
#include <stdlib.h>

int     size; //結(jié)點(diǎn)數(shù)量

#define        NUM        20

typedef struct tree_node{
    struct tree_node*    left;
    struct tree_node*    right;
    int        item;
}tree_node;

tree_node* splay (int i, tree_node* t) {
    tree_node N, *l, *r, *y;

    if (t == NULL) 
        return t;

    N.left = N.right = NULL;
     l = r = &N;
 
     for (;;)
     {
         if (i < t->item) 
         {
             if (t->left == NULL) 
                 break;
             if (i < t->left->item) 
             {
                 y = t->left;                           /* rotate right */
                 t->left = y->right;
                 y->right = t;
                 t = y;
                 if (t->left == NULL) 
                     break;
             }
             r->left = t;                               /* link right */
            r = t;
             t = t->left;
         } else if (i > t->item)
         {
             if (t->right == NULL) 
                 break;
             if (i > t->right->item) 
             {
                 y = t->right;                          /* rotate left */
                 t->right = y->left;
                 y->left = t;
                 t = y;
                 if (t->right == NULL) 
                     break;
             }
             l->right = t;                              /* link left */
             l = t;
             t = t->right;
         } else {
             break;
         }
     }
     l->right = t->left;                                /* assemble */
     r->left = t->right;
     t->left = N.right;
     t->right = N.left;
     return t;
 }
 
 /*
 **將i插入樹t中,返回樹的根結(jié)點(diǎn)(item值==i)
 */
 tree_node* ST_insert(int i, tree_node *t) {
     /* Insert i into the tree t, unless it's already there.    */
     /* Return a pointer to the resulting tree.                 */
     tree_node* node;
     
     node = (tree_node *) malloc (sizeof (tree_node));
     if (node == NULL){
         printf("Ran out of space\n");
         exit(1);
     }
     node->item = i;
     if (t == NULL) {
         node->left = node->right = NULL;
         size = 1;
         return node;
     }
     t = splay(i,t);
     if (i < t->item) {  //令t為i的右子樹
         node->left = t->left;
         node->right = t;
         t->left = NULL;
         size ++;
         return node;
     } else if (i > t->item) { //令t為i的左子樹
         node->right = t->right;
         node->left = t;
         t->right = NULL;
         size++;
         return node;
    } else { 
         free(node); //i值已經(jīng)存在于樹t中
         return t;
     }
 }
 
 
 /*
 **從樹中刪除i,返回樹的根結(jié)點(diǎn)
 */
 tree_node* ST_delete(int i, tree_node* t) {
     /* Deletes i from the tree if it's there.               */
     /* Return a pointer to the resulting tree.              */
     tree_node* x;
     if (t==NULL) 
         return NULL;
     t = splay(i,t);
     if (i == t->item) {               /* found it */
         if (t->left == NULL) { //左子樹為空,則x指向右子樹即可
             x = t->right;
         } else {
             x = splay(i, t->left); //查找左子樹中最大結(jié)點(diǎn)max,令右子樹為max的右子樹
             x->right = t->right;
         }
         size--;
         free(t);
         return x;
     }
     return t;                         /* It wasn't there */
 }
 
 void ST_inoder_traverse(tree_node*    node)
 {
     if(node != NULL)
     {
         ST_inoder_traverse(node->left);
         printf("%d ", node->item);
         ST_inoder_traverse(node->right);
     }
 }
 
 void ST_pre_traverse(tree_node*    node)
 {
     if(node != NULL)
    {
         printf("%d ", node->item);
         ST_pre_traverse(node->left);
         ST_pre_traverse(node->right);
     }
 }
 
 
 void main() {
     /* A sample use of these functions.  Start with the empty tree,         */
     /* insert some stuff into it, and then delete it                        */
     tree_node* root;
     int i;
 
     root = NULL;              /* the empty tree */
     size = 0;
 
     for(i = 0; i < NUM; i++)
         root = ST_insert(rand()%NUM, root);
 
     ST_pre_traverse(root);
     printf("\n");
     ST_inoder_traverse(root);
 
     for(i = 0; i < NUM; i++)
         root = ST_delete(i, root);
 
     printf("\nsize = %d\n", size);
 }
 

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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久久极品少妇xxxxⅹ软件| 欧美二区在线看| 久久天天狠狠| 亚洲国产成人在线| 欧美黄色aaaa| 欧美久久电影| 亚洲制服欧美中文字幕中文字幕| 一本色道88久久加勒比精品 | 久久久久久久久久久一区| 国产日韩精品在线播放| 欧美诱惑福利视频| 欧美在线观看你懂的| 国内精品视频久久| 欧美不卡三区| 欧美大片免费看| 在线视频精品一区| 制服丝袜亚洲播放| 国产美女精品视频| 麻豆成人综合网| 欧美成人影音| 亚洲综合视频1区| 亚洲综合视频在线| 一区二区在线免费观看| 亚洲高清免费| 欧美精品一区二区三区在线播放| 亚洲无限av看| 欧美一区二区三区的| 依依成人综合视频| 一区二区冒白浆视频| 国内伊人久久久久久网站视频| 欧美成人高清视频| 国产精品久久久久久久9999| 免费h精品视频在线播放| 欧美日韩一区二区三区免费| 久久黄色网页| 欧美精品v国产精品v日韩精品 | 亚洲中午字幕| 香港久久久电影| 亚洲国产欧美一区二区三区丁香婷| 亚洲免费激情| 在线日韩精品视频| 夜夜嗨av一区二区三区四区| 国产一区二区中文| 亚洲美女在线视频| 一区在线观看| 亚洲在线观看视频| 亚洲免费高清视频| 久久精品亚洲精品| 亚洲在线成人| 欧美成人高清| 久久亚洲国产精品一区二区 | 久久se精品一区精品二区| 另类专区欧美制服同性| 亚洲欧美日韩成人| 欧美极品aⅴ影院| 久久婷婷国产麻豆91天堂| 欧美午夜无遮挡| 亚洲国产精品一区二区第一页| 国产精品美女| 亚洲免费成人av| 亚洲黄色av| 欧美一区二区黄| 午夜精品久久久久久99热软件| 欧美电影打屁股sp| 免费久久精品视频| 国产亚洲一区二区三区在线观看| 亚洲精品一区在线观看| 91久久国产综合久久91精品网站| 欧美综合二区| 久久九九电影| 国产亚洲成av人片在线观看桃 | 午夜精品福利视频| 亚洲男女毛片无遮挡| 欧美韩日一区二区三区| 久久夜色精品国产| 国产美女精品在线| 亚洲欧美一级二级三级| 亚洲制服少妇| 国产精品久久久久毛片大屁完整版 | 欧美成人国产va精品日本一级| 国产精品久久久久久久久久久久| 亚洲精品美女在线观看| 亚洲精品老司机| 欧美极品在线播放| 日韩视频三区| 亚洲自拍电影| 国产精品区二区三区日本| 亚洲天堂成人在线观看| 亚洲欧美另类在线| 国产女优一区| 欧美中文字幕视频| 免费精品视频| 日韩性生活视频| 欧美日韩色婷婷| 在线性视频日韩欧美| 国产日韩一区二区三区在线播放 | 久久婷婷国产麻豆91天堂| 免费高清在线一区| 最近中文字幕mv在线一区二区三区四区 | 欧美亚洲三区| 乱中年女人伦av一区二区| 亚洲成色最大综合在线| 欧美精品v日韩精品v韩国精品v | 久久精品国产清高在天天线| 韩国自拍一区| 欧美激情视频在线播放| 亚洲色图综合久久| 久久蜜臀精品av| 日韩视频在线免费| 国产精品入口夜色视频大尺度| 欧美在线视频日韩| 亚洲人成艺术| 久久精品国产99精品国产亚洲性色 | 亚洲欧美国产日韩天堂区| 久久精品视频免费观看| 1024亚洲| 欧美三级午夜理伦三级中文幕 | 伊人久久噜噜噜躁狠狠躁| 麻豆成人在线播放| 夜夜爽99久久国产综合精品女不卡 | 一本色道久久综合亚洲二区三区| 国产精品豆花视频| 久久久水蜜桃| 日韩一区二区电影网| 六月丁香综合| 亚洲影院免费观看| 亚洲国产精品视频一区| 国产精品每日更新| 欧美韩日一区二区三区| 欧美亚洲在线播放| 99国产精品久久久久老师| 噜噜噜91成人网| 亚洲夜晚福利在线观看| 亚洲高清在线| 国产色综合久久| 欧美日韩国产免费观看| 久久色在线播放| 亚洲欧美在线免费| 日韩一区二区电影网| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲香蕉成视频在线观看| 精品成人在线| 国产午夜精品理论片a级大结局| 欧美视频在线观看| 欧美寡妇偷汉性猛交| 久久久国产91| 性久久久久久久久| 亚洲一区免费视频| 一本色道久久99精品综合| 亚洲国产成人久久| 洋洋av久久久久久久一区| 狠狠干成人综合网| 国产日本欧美一区二区三区在线| 欧美日韩国产成人在线91| 久久最新视频| 久久久噜噜噜久久久| 久久av老司机精品网站导航| 国产精品99久久久久久有的能看| 最新国产成人在线观看| 亚洲第一偷拍| 欧美激情一区二区| 欧美激情一区在线| 欧美激情一区二区三区| 女生裸体视频一区二区三区| 毛片精品免费在线观看| 快she精品国产999| 卡通动漫国产精品| 久久综合九色| 欧美成人激情在线| 欧美国产成人精品| 亚洲二区精品| 亚洲精品国产精品乱码不99按摩| 亚洲精品在线免费| 9国产精品视频| 在线视频欧美一区| 亚洲制服丝袜在线| 欧美中文字幕| 蜜桃伊人久久| 欧美精品麻豆| 欧美吻胸吃奶大尺度电影| 国产精品青草久久久久福利99| 国产区二精品视| 一区在线免费| 亚洲每日更新| 亚洲欧美日韩人成在线播放| 久久精品欧美日韩| 欧美成人69av| 中文日韩电影网站| 久久国产欧美日韩精品| 久久综合99re88久久爱|