免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9425 | 回复: 12
打印 上一主题 下一主题

[算法] Size Balance Tree和Treap的ADT接口和实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-08 12:04 |只看该作者 |倒序浏览
1M个整数插入删除,不优化的情况下, SBT费时5.2秒,Treap才2.1秒,说SBT比Treap快,怎么不觉得了,不明白
文件:include/Item.h

  1. /*-----------------------------------------------------------
  2.         Item.h
  3.         作者: QingXiaoming, 12-03, 2007([url]http://www.cublog.com/augustusqing/[/url])
  4.         您可以自由的传播,修改这份代码,转载处请注明原作者
  5. -------------------------------------------------------------*/

  6. #ifndef ITEM_H
  7. #define ITEM_H

  8. typedef int Item;

  9. #endif
复制代码

文件:include/SBTree_ADT.h

  1. /*-----------------------------------------------------------
  2.         SBT的ADT接口
  3.         Author: QingXiaoming, 12-05, 2007([url]http://www.cublog.com/augustusqing/[/url]
  4.         您可以自由拷贝,修改,传播这份代码,但请注明原作者
  5. -------------------------------------------------------------*/

  6. #ifndef SBTREE_ADT_H
  7. #define SBTREE_ADT_H
  8. #include "Item.h"
  9. typedef struct SBTree *SBTree;
  10. typedef struct SBTreeNode *SBTreeLink;

  11. SBTree initSBTree(void);
  12. int emptySBTree(SBTree);
  13. int sizeSBTree(SBTree);
  14. void showSBTreeNode(SBTreeLink);
  15. void destroySBTree(SBTree);
  16. void pretravseSBTree(SBTree);
  17. void midtravseSBTree(SBTree);
  18. int rankSBTree(SBTree, SBTreeLink);

  19. Item seqSBTree(SBTree, int);
  20. SBTreeLink findSBTree(SBTree, Item);
  21. Item preSBTree(SBTree, Item);
  22. Item sucSBTree(SBTree, Item);
  23. Item minSBTree(SBTree);
  24. Item maxSBTree(SBTree);
  25. void insertSBTree(SBTree, Item);
  26. SBTreeLink deleteSBTree(SBTree, Item);

  27. #endif
复制代码


文件:include/Treap_ADT.h

  1. /*-----------------------------------------------------------
  2.         Treap的ADT接口
  3.         作者: QingXiaoming, 12-04, 2007([url]http://www.cublog.com/augustusqing/[/url])
  4.         您可以自由的传播,修改这份代码,转载处请注明原作者
  5. -------------------------------------------------------------*/

  6. #ifndef TREAP_ADT_H
  7. #define TREAP_ADT_H
  8. #include "Item.h"
  9. typedef struct treap *Treap;
  10. typedef struct treapnode *TreapLink;

  11. Treap initTreap(int);
  12. int emptyTreap(Treap);
  13. TreapLink findTreapNode(Treap, Item);
  14. void insertTreap(Treap, Item);
  15. TreapLink deleteTreap(Treap, Item);
  16. void midtravseTreap(Treap);
  17. void pretravseTreap(Treap);
  18. void destroyTreap(Treap);
  19. #endif

复制代码


文件:include/SBTree_ADT_user.c

  1. /*-----------------------------------------------------------
  2.         SBTree的ADT客户程序
  3.         Author: QingXiaoming, 12-05, 2007([url]http://www.cublog.com/augustusqing/[/url]
  4.         您可以自由拷贝,修改,传播这份代码,但请注明原作者
  5. -------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include "include/SBTree_ADT.h"

  10. int main(int argc, char *argv[])
  11. {
  12.     int i, N = atoi(argv[1]);//, M = atoi(argv[2]);
  13.     Item t;//,ta;
  14.     SBTree tree = initSBTree();
  15.     //SBTreeLink x;
  16.     long start, stop;
  17.     srand((unsigned)clock());
  18.     start = clock();
  19.     for (i = 0; i < N; i++)
  20.     {
  21.         t = rand() + i;
  22.         insertSBTree(tree, t);
  23.     }
  24.     //pretravseSBTree(tree);
  25.     printf("\n");
  26.     //midtravseSBTree(tree);
  27.     //printf("\n");
  28.     /*
  29.     t = seqSBTree(tree, M);
  30.     ta = sucSBTree(tree, t);
  31.     printf("Size:%d, Rank %d is : %d, Min:%d, Max:%d, Pre:%d, Suc:%d\n",
  32.            sizeSBTree(tree), M, t, minSBTree(tree), maxSBTree(tree), preSBTree(tree, t), sucSBTree(tree, t));
  33.     x = deleteSBTree(tree, t);
  34.     free(x);
  35.     x = findSBTree(tree, ta);
  36.     showSBTreeNode(x);
  37.     printf("After delete %d,Size:%d,  Min:%d, Max:%d, Rank of suc:%d\n",
  38.            t, sizeSBTree(tree), minSBTree(tree), maxSBTree(tree), rankSBTree(tree, x));
  39.    
  40.     printf("Befor destroy, Tree is %s\n", emptySBTree(tree) ? "Empty" : "Not Empty");
  41.     */
  42.     destroySBTree(tree);
  43.    
  44.     printf("After destroy, Tree is %s\n", emptySBTree(tree) ? "Empty" : "Not Empty");
  45.     stop = clock();
  46.     printf("Time :%ld", stop - start);
  47.     return 0;
  48. }

复制代码


文件:include/Treap_ADT_user.c

  1. /*-----------------------------------------------------------
  2.         Treap的ADT客户程序
  3.         作者: QingXiaoming, 12-04, 2007([url]http://www.cublog.com/augustusqing/[/url])
  4.         您可以自由的传播,修改这份代码,转载处请注明原作者
  5. -------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <time.h>
  9. #include "include/Treap_ADT.h"

  10. int main(int argc, char *argv[])
  11. {
  12.     int i, N = atoi(argv[1]);
  13.     Item t;
  14.     Treap tree = initTreap(N);
  15.     //TreapLink x;
  16.     long start, stop;
  17.     start = clock();
  18.     for (i = 0; i < N; i++)
  19.     {
  20.         t = i;
  21.         insertTreap(tree, t);
  22.     }
  23.     //pretravseTreap(tree);
  24.     printf("\n");
  25.     //midtravseTreap(tree);
  26.     /*
  27.     for (i = 2;i < N; i += 2)
  28.     {
  29.         x = deleteTreap(tree, i);
  30.         free(x);
  31.         printf("\n");
  32.         pretravseTreap(tree);
  33.         printf("\n");
  34.         midtravseTreap(tree);  
  35.         system("pause");   
  36.     }
  37.     */
  38.     destroyTreap(tree);
  39.     stop = clock();
  40.     printf("Time :%ld", stop - start);
  41.     return 0;
  42. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2007-12-08 12:05 |只看该作者
文件:SBTree_ADT.c

  1. /*-----------------------------------------------------------
  2.         SBTree的ADT实现
  3.         作Author: QingXiaoming, 12-05, 2007([url]http://www.cublog.com/augustusqing/[/url]
  4.         您可以自由拷贝,修改,传播这份代码,但请注明原作者
  5. -------------------------------------------------------------*/

  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include "include/SBTree_ADT.h"

  9. struct SBTreeNode {
  10.        Item item;
  11.        SBTreeLink lchild;
  12.        SBTreeLink rchild;
  13.        int size;
  14.        };
  15. struct SBTree {
  16.        SBTreeLink root;
  17.        };
  18.       
  19. static SBTreeLink NEW(Item item)
  20. {
  21.        SBTreeLink x = NULL;
  22.        x = malloc(sizeof(*x));
  23.        if (!x){perror("Get memory for Node error");return NULL;}
  24.        x->item = item;
  25.        x->lchild = x->rchild = NULL;
  26.        x->size = 1;
  27.        return x;
  28. }

  29. SBTree initSBTree()
  30. {
  31.        SBTree x = NULL;
  32.        x = malloc(sizeof(*x));
  33.        if (!x){perror("Get memory for tree error");return NULL;}
  34.        x->root = NULL;
  35.        return x;
  36. }

  37. int emptySBTree(SBTree tree)
  38. {
  39.     return tree->root == NULL;
  40. }
  41. void showSBTreeNode(SBTreeLink x)
  42. {
  43.      printf("Item=%d, Size=%d, Left=%d, Right=%d\n",x->item, x->size, (NULL != x->lchild)?x->lchild->item:-1,(NULL != x->rchild)?x->rchild->item:-1);
  44. }

  45. int sizeSBTree(SBTree tree)
  46. {
  47.     if(!tree || !tree->root){perror("Size a NULL tree");return -1;}
  48.     return tree->root->size;
  49. }

  50. Item maxSBTree(SBTree tree)
  51. {
  52.      if(!tree || !tree->root){perror("Max a NULL tree");return -1;}
  53.      return seqSBTree(tree, sizeSBTree(tree));
  54. }

  55. Item minSBTree(SBTree tree)
  56. {
  57.      if(!tree || !tree->root){perror("Min a NULL tree");return -1;}
  58.      return seqSBTree(tree, 1);
  59. }

  60. SBTreeLink findSBTree(SBTree tree, Item item)
  61. {
  62.     SBTreeLink x  = tree->root;
  63.     while (x && item != x->item)
  64.     {
  65.           x = (item < x->item) ? x->lchild : x->rchild;
  66.     }
  67.     return x;
  68. }

  69. Item preSBTree(SBTree tree, Item item)
  70. {
  71.      int r;
  72.      SBTreeLink x = findSBTree(tree, item);
  73.      if (!x){printf("No item %d in the tree", item);return -1;}
  74.      r = rankSBTree(tree, x);
  75.      if (1 == r){printf("item %d is No.1, Can't Pre this item", item);return -1;}
  76.      return seqSBTree(tree, r - 1);  
  77. }

  78. Item sucSBTree(SBTree tree, Item item)
  79. {
  80.      int r;
  81.      SBTreeLink x = findSBTree(tree, item);
  82.      if (!x){printf("No item %d in the tree", item);return -1;}
  83.      r = rankSBTree(tree, x);
  84.      if (sizeSBTree(tree) == r){printf("item %d is No.MAX, Can't Suc this item", item);return -1;}
  85.      return seqSBTree(tree, r + 1);
  86. }

  87. static void pretravseSBTreeNode(SBTreeLink link)
  88. {
  89.        if (link)
  90.        {
  91.            showSBTreeNode(link);
  92.            pretravseSBTreeNode(link->lchild);
  93.            pretravseSBTreeNode(link->rchild);
  94.        }
  95. }

  96. void pretravseSBTree(SBTree tree)
  97. {
  98.      return pretravseSBTreeNode(tree->root);
  99. }

  100. static void midtravseSBTreeNode(SBTreeLink link)
  101. {
  102.        if (link)
  103.        {
  104.            midtravseSBTreeNode(link->lchild);
  105.            showSBTreeNode(link);
  106.            midtravseSBTreeNode(link->rchild);
  107.        }
  108. }
  109. void midtravseSBTree(SBTree tree)
  110. {
  111.      return midtravseSBTreeNode(tree->root);
  112. }

  113. static void Left_Rotate(SBTreeLink *link)
  114. {
  115.        SBTreeLink y, x = *link;
  116.        if (!x || !x->rchild){perror("Cant Right Rotate NULL node or NULL lchild");return;}
  117.        y = x->rchild;
  118.        x->rchild = y->lchild;
  119.        *link = y;
  120.        y->lchild = x;
  121.        y->size = x->size;
  122.        x->size = ((x->lchild != NULL) ? x->lchild->size: 0) + ((x->rchild != NULL) ? x->rchild->size: 0) + 1;
  123. }

  124. static void Right_Rotate(SBTreeLink *link)
  125. {
  126.        SBTreeLink y, x = *link;
  127.        if (!x || !x->lchild){perror("Cant Right Rotate NULL node or NULL lchild");return;}
  128.        y = x->lchild;
  129.        x->lchild = y->rchild;
  130.        *link = y;
  131.        y->rchild = x;
  132.        y->size = x->size;
  133.        x->size = ((x->lchild != NULL) ? x->lchild->size: 0) + ((x->rchild != NULL) ? x->rchild->size: 0) + 1;
  134. }

  135. static void maintainSBTree(SBTreeLink *link, int flag)
  136. {
  137.        SBTreeLink t = *link;
  138.        if(!t)return;
  139.        if (!flag)
  140.        {
  141.            if (t->lchild && t->lchild->lchild && (!t->rchild || t->lchild->lchild->size > t->rchild->size))
  142.            {
  143.                 Right_Rotate(link);
  144.            }
  145.            else if (t->lchild && t->lchild->rchild && (!t->rchild || t->lchild->rchild->size > t->rchild->size))
  146.            {
  147.                 Left_Rotate(&(t->lchild));
  148.                 Right_Rotate(link);
  149.            }
  150.            else return;
  151.        }
  152.        else
  153.        {
  154.            if (t->rchild && t->rchild->rchild && (!t->lchild || t->rchild->rchild->size > t->lchild->size))
  155.            {
  156.                 Left_Rotate(link);
  157.            }
  158.            else if (t->rchild && t->rchild->lchild && (!t->lchild || t->rchild->lchild->size > t->lchild->size))
  159.            {
  160.                 Right_Rotate(&(t->rchild));
  161.                 Left_Rotate(link);
  162.            }
  163.            else return;
  164.        }
  165.        maintainSBTree(&(t->lchild), 0);
  166.        maintainSBTree(&(t->rchild), 1);
  167.        maintainSBTree(link, 0);
  168.        maintainSBTree(link, 1);
  169. }
  170. static void insertSBTreeNode(SBTreeLink *link, Item item)
  171. {
  172.       SBTreeLink x = *link;
  173.       if (!x)
  174.       {
  175.           *link = NEW(item);
  176.           return;
  177.       }
  178.       else
  179.       {
  180.           x->size += 1;
  181.           insertSBTreeNode((item < x->item) ? &(x->lchild) : &(x->rchild), item);
  182.           maintainSBTree(link, item > x->item);
  183.       }
  184. }

  185. void insertSBTree(SBTree tree, Item item)
  186. {
  187.       SBTreeLink x = findSBTree(tree, item);
  188.       if (x)
  189.       {
  190.           //printf("Cant insert a Exist item into tree!\n");
  191.           return;
  192.       }
  193.       return insertSBTreeNode(&tree->root, item);
  194. }

  195. SBTreeLink deleteSBTree(SBTree tree, Item item)
  196. {
  197.     Item t;
  198.     SBTreeLink n, m, z, y, x = tree->root;
  199.     if (!x){perror("Cant delete node from NULL tree");return NULL;}
  200.     if (item == x->item && !x->rchild)
  201.     {
  202.         tree->root = x->lchild;
  203.         return x;
  204.     }// find the node with item
  205.     while (x && (item != x->item))
  206.     {
  207.           z = x;
  208.           x = (item < x->item) ? x->lchild : x->rchild;        
  209.     }//find the x's father node
  210.     if (x)
  211.     {
  212.           if (x->rchild)
  213.           {
  214.               z = x;
  215.               y = x->rchild;
  216.               while (y->lchild)
  217.               {
  218.                     z = y;
  219.                     y = y->lchild;
  220.               }
  221.           }// find y, the node will really be deleted, and his father
  222.           else
  223.           {
  224.               y = x;
  225.           }
  226.     }
  227.     else
  228.     {
  229.         printf("No item %d in the SBTree\n", item);
  230.         return NULL;
  231.     }
  232.     //handle the y's child
  233.     m = y->lchild ? y->lchild : y->rchild;
  234.     if (y == z->lchild)
  235.     {
  236.           z->lchild = m;
  237.     }
  238.     else
  239.     {
  240.           z->rchild = m;
  241.     }
  242.     n = tree->root;
  243.     while (n != z)
  244.     {
  245.           n->size--;
  246.           n = item < n->item ? n->lchild : n->rchild;
  247.     }//modify the size, from root the the y's parent
  248.     z->size--;// also y's father
  249.     if(x != y)
  250.     {
  251.          t = x->item; x->item = y->item; y->item = t;
  252.     }
  253.     return y;
  254. }

  255. static Item seqSBTreeNode(SBTreeLink link, int i)
  256. {
  257.     int r;
  258.     if (!link){perror("You want to Seq a non-exist number Node");return -1;}
  259.     r = (NULL != link->lchild) ? (link->lchild->size + 1) : 1;
  260.     if (i == r){return  link->item;}
  261.     else return (i < r) ? seqSBTreeNode(link->lchild, i) : seqSBTreeNode(link->rchild, i-r);
  262. }
  263. Item seqSBTree(SBTree tree, int i)
  264. {
  265.     return seqSBTreeNode(tree->root, i);
  266. }

  267. int rankSBTree(SBTree tree , SBTreeLink link)
  268. {
  269.     int r = 0;
  270.     SBTreeLink x = tree->root;
  271.     if(!tree->root || !link){perror("You want to Rank a non-exist Node or NULL tree");return -1;}
  272.     while (x != link)
  273.     {
  274.           if (link->item > x->item)
  275.           {
  276.               r += (NULL != x->lchild) ? (x->lchild->size + 1) : 1;
  277.               x = x->rchild;
  278.           }
  279.           else
  280.           {
  281.               x = x->lchild;
  282.           }   
  283.     }
  284.     r += (NULL != x->lchild) ? (x->lchild->size + 1) : 1;
  285.     return r;
  286. }

  287. void destroySBTree(SBTree tree)
  288. {
  289.      SBTreeLink y, x = tree->root;
  290.      while (x)
  291.      {
  292.            y = deleteSBTree(tree, x->item);
  293.            free(y);
  294.            x = tree->root;
  295.      }
  296. }
复制代码


文件:Treap_ADT.c

  1. /*-----------------------------------------------------------
  2.         Treap的ADT实现
  3.         作者: QingXiaoming, 12-04, 2007([url]http://www.cublog.com/augustusqing/[/url])
  4.         您可以自由的传播,修改这份代码,转载处请注明原作者
  5. -------------------------------------------------------------*/

  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include "include/Treap_ADT.h"

  9. struct treapnode {
  10.        Item item;
  11.        TreapLink parent;
  12.        TreapLink lchild;
  13.        TreapLink rchild;
  14.        int prio;
  15.        };
  16. struct treap {
  17.        TreapLink root;
  18.        };

  19. static int priobase = 1;
  20. static TreapLink NEW(Item item, TreapLink parent);
  21. static void Left_Rotate(Treap tree, TreapLink x);
  22. static void Right_Rotate(Treap tree, TreapLink x);
  23. static void pretravseTreapNode(TreapLink root);
  24. static void midtravseTreapNode(TreapLink root);

  25. static TreapLink NEW(Item item, TreapLink parent)
  26. {
  27.        TreapLink x = NULL;
  28.        x = malloc(sizeof(*x));
  29.        if (!x){perror("Get memory for Node error");return NULL;}
  30.        x->item = item;
  31.        x->parent = parent;
  32.        x->lchild = NULL;
  33.        x->rchild = NULL;
  34.        x->prio = rand()%priobase;
  35.        return x;
  36. }

  37. Treap initTreap(int N)
  38. {
  39.       Treap x = NULL;
  40.       x = malloc(sizeof(*x));
  41.       if (!x){perror("Get memory for Treap error");return NULL;}
  42.       x->root = NULL;
  43.       priobase = N;
  44.       return x;
  45. }

  46. int emptyTreap(Treap tree)
  47. {
  48.     return tree->root == NULL;
  49. }

  50. TreapLink findTreapNode(Treap tree, Item item)
  51. {
  52.     TreapLink x = tree->root;
  53.     while (NULL != x && item != x->item)
  54.     {
  55.           x = (item < x->item) ? x->lchild : x->rchild;
  56.     }
  57.     return x;
  58. }

  59. static void Left_Rotate(Treap tree, TreapLink x)
  60. {
  61.        TreapLink y;
  62.        if (!x || !x->rchild){perror("Cant Left_Rotate NULL  or NULL rchild");exit(-1);}
  63.        y = x->rchild;
  64.        x->rchild = y->lchild;
  65.        if (y->lchild)
  66.        {
  67.            y->lchild->parent = x;
  68.        }
  69.        y->parent = x->parent;
  70.        if (x == tree->root)
  71.        {
  72.            tree->root = y;
  73.        }
  74.        else
  75.        {
  76.            if ( x == x->parent->lchild)
  77.            {
  78.                 x->parent->lchild = y;
  79.            }
  80.            else
  81.            {
  82.                x->parent->rchild = y;
  83.            }
  84.        }
  85.        y->lchild = x;
  86.        x->parent = y;
  87. }

  88. static void Right_Rotate(Treap tree, TreapLink x)
  89. {
  90.        TreapLink y;
  91.        if (!x || !x->rchild){perror("Cant Right_Rotate NULL  or NULL rchild");exit(-1);}
  92.        y = x->lchild;
  93.        x->lchild = y->rchild;
  94.        if (y->rchild)
  95.        {
  96.            y->rchild->parent = x;
  97.        }
  98.        y->parent = x->parent;
  99.        if (x == tree->root)
  100.        {
  101.            tree->root = y;
  102.        }
  103.        else
  104.        {
  105.            if ( x == x->parent->lchild)
  106.            {
  107.                 x->parent->lchild = y;
  108.            }
  109.            else
  110.            {
  111.                x->parent->rchild = y;
  112.            }
  113.        }
  114.        y->rchild = x;
  115.        x->parent = y;
  116. }

  117. static void fixinsertTreap(Treap tree, TreapLink link)
  118. {

  119.     while (NULL != link->parent && link->prio < link->parent->prio)
  120.     {
  121.           if (link == link->parent->lchild)
  122.           {
  123.               Right_Rotate(tree, link->parent);
  124.           }
  125.           else
  126.           {
  127.               Left_Rotate(tree, link->parent);
  128.           }
  129.     }
  130. }

  131. void insertTreap(Treap tree, Item item)
  132. {
  133.      TreapLink y, x = tree->root;
  134.      if (!tree->root)
  135.      {
  136.          x = tree->root = NEW(item, tree->root);
  137.          return;
  138.      }
  139.      while (NULL != x)
  140.      {
  141.            y = x;
  142.            x = (item < x->item) ? x->lchild : x->rchild;
  143.      }
  144.      if (item < y->item)
  145.      {
  146.          x = y->lchild = NEW(item, y);
  147.      }
  148.      else
  149.      {
  150.          x = y->rchild = NEW(item, y);
  151.      }
  152.      fixinsertTreap(tree, x);
  153. }

  154. TreapLink deleteTreap(Treap tree, Item item)
  155. {
  156.     TreapLink z, y, x = findTreapNode(tree, item);
  157.     Item t;
  158.     if (!x){printf("Cant find item:%d to delete!\n", item);return NULL;}
  159.     if (NULL != x->rchild)
  160.     {
  161.         y = x->rchild;
  162.         while (NULL != y->lchild)
  163.         {
  164.               y = y->lchild;
  165.         }
  166.     }
  167.     else
  168.     {
  169.         y = x;
  170.     }
  171.     z = (NULL != y->lchild) ? y->lchild : y->rchild;
  172.     if (NULL != z)
  173.     {
  174.         z->parent = y->parent;
  175.     }
  176.     if (NULL != y->parent)
  177.     {
  178.         if (y == y->parent->lchild)
  179.         {
  180.             y->parent->lchild = z;
  181.         }
  182.         else
  183.         {
  184.             y->parent->rchild = z;
  185.         }
  186.     }
  187.     else
  188.     {
  189.         tree->root = z;
  190.     }
  191.     if (y != x)
  192.     {
  193.           t = x->item;
  194.           x->item = y->item;
  195.           y->item = t;
  196.     }
  197.     return y;
  198. }

  199. static void midtravseTreapNode(TreapLink root)
  200. {
  201.      if (NULL != root)
  202.      {
  203.          midtravseTreapNode(root->lchild);
  204.          printf("Item:%5d, Prio:%5d\n", root->item, root->prio);
  205.          midtravseTreapNode(root->rchild);        
  206.      }
  207. }

  208. static void pretravseTreapNode(TreapLink root)
  209. {
  210.      if (NULL != root)
  211.      {
  212.          printf("Item:%5d, Prio:%5d\n", root->item, root->prio);
  213.          pretravseTreapNode(root->lchild);
  214.          pretravseTreapNode(root->rchild);        
  215.      }
  216. }

  217. void midtravseTreap(Treap tree)
  218. {
  219.      midtravseTreapNode(tree->root);
  220. }

  221. void pretravseTreap(Treap tree)
  222. {
  223.      pretravseTreapNode(tree->root);
  224. }

  225. void destroyTreap(Treap tree)
  226. {
  227.      TreapLink x;
  228.      for (x = tree->root; NULL != x; x = tree->root)
  229.      {
  230.            x = deleteTreap(tree, x->item);
  231.            free(x);
  232.      }
  233.      free(tree);
  234. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-12-08 12:34 |只看该作者
做个保留,以后看看.

论坛徽章:
0
4 [报告]
发表于 2007-12-08 22:29 |只看该作者
A Disquisition on The Performance Behaviour of Binary Search Tree Data Structures
http://www.upgrade-cepis.org/issues/2004/5/up5-5Mosaic.pdf
---------------------
performance comparison of binary search trees.        Treap       was found to have the best average performance, while              red-black tree            was found to have the smallest amount of performance fluctuations.

[ 本帖最后由 hotjuly 于 2007-12-8 22:33 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2007-12-11 16:55 |只看该作者

回复 #4 hotjuly 的帖子

多谢提供这么好的文章!

论坛徽章:
0
6 [报告]
发表于 2009-06-24 17:51 |只看该作者
楼主的实现稍有问题,Treap中删除未做旋转,插入好像也是有问题的,同时SBT实现效率稍差了些。
测试Treap插入的数据没有调用rand(),Treap自身必须的随机运算不能算。当然这一点对Treap影响不大,rand()也只需很少的时间而已。
还有实际测试中的插入和删除操作,都要随机化才能表现的比较清楚平均水平。

个人看了一下,大概SBT的插入效率要稍差于Treap(可能还有其他一些树),但删除因为可以不作旋转,要远高于Treap,平均数高也有保证。不同实现的差异也很大,要经过比较成熟的测试才可能说明一些问题。

[ 本帖最后由 TiGEr.zZ 于 2009-6-24 17:55 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-06-24 20:34 |只看该作者
这种测试,和数据也有一定关系~~

论坛徽章:
0
8 [报告]
发表于 2009-06-24 20:35 |只看该作者
还有那个SBT实现,可以去维基百科上找找,那里有一些不错的实现~~

论坛徽章:
0
9 [报告]
发表于 2009-06-30 18:04 |只看该作者
化了些功夫做了一个完整的测试,对比了红黑树,Treap和SBT,结果显示红黑树总体性能最优。
为了仅仅考察树的性能,采用预先分配节点内存,树的实现不参与节点内存管理。节点中都包含指向父节点的指针,这样实现删除测试中分为按节点删除,和按关键字删除。

测试方法是先插入大量节点,查询所有节点值,然后按2的指数方从少至多的删除节点,同时再查询,重新插入那些节点。再做一遍按关键字的递增删除和插入,最后是清除所有节点。

插入:红黑树领先不少,Treap和SBT差不太多,在做了删除后,SBT的插入性能似乎稍稍下降,原因未知。

查找:红黑树和SBT相差不大,处于领先,Treap要落后很多,毕竟树高度没有保证,也可能是随机数不够好。在删除了少量节点后,前两者查询时间还似乎微微上涨,也许是节点中重复关键字减少了。SBT树删除虽然没有做平衡,但仍然随着节点的大量减少保持着类似性能(在删除实现中,虽然没做平衡也有意根据左右子树的size来选择使用前驱节点还是后继节点来替换当前节点)

删除:按节点删除时,红黑树和Treap因为不需要遍历树,所以有着很高的性能,SBT因为要维护所有父辈的size而导致落后。在按关键字删除,相当于搜索节点再删除,SBT因为不作树的平衡维护性能要领先一些。

附件是代码,把树的实现和测试放在的一个文件中,基本采用较传统的c编程风格,除了变量定义以及在SBT中为了简化代码而不降低性能使用了bool型模板(否则可以作为函数参数传递)。可以提取那些非static函数和类型定义形成树头文件。SBT的代码参考了:http://www.nocow.cn/index.php/Code:SBT_C,而红黑树的代码参考了linux内核中的实现,相对而言后者实现难度最大。

[ 本帖最后由 TiGEr.zZ 于 2009-6-30 18:06 编辑 ]

test.7z

3.5 KB, 下载次数: 64

论坛徽章:
0
10 [报告]
发表于 2009-06-30 18:42 |只看该作者
楼主是内存里读写速度的比较?
平衡树是为磁盘读写而生的

如果是内存的话哈希应该更快吧为什么用树?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP