注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 数据库 > Delphi 内容正文:关于线索二叉树的性能分析

关于线索二叉树的性能分析

发布时间:2006-05-13 13:31:31 来源:博客堂 网友评论 0 条

  最近刚学完数据结构中关于树的部分,我对其中的线索二叉树产生了浓厚的兴趣。线索二叉树通过设置Ltag,Rtag标志,并事先线索化来提高整个二叉树的遍历速度,是个典型的通过牺牲空间来提升速度的例子。但是,它究竟浪费了多少空间,提升了多少的速度,在实际的应用中究竟值不值得用这些空间来换的这些速度?我决定通过一系列实验来分析线索二叉树的性能,以此解决这些问题。

   测试时间性能大概的思路是这个样子的:分别建立一般二叉树和线索二叉树(都是满二叉树),然后调用它们各自的遍历函数,记录函数运行的时间,做比较;再通过控制二叉树的深度,记录遍历时间随二叉树结点个数变化的变化,并做比较。

   后加:其实分析下哈,一般二叉树的访问其实就是不停的CALL调用而线索二叉树则是不停的判断,访问N个节点的一般二叉树大概要进行2*N次CALL,而线索二叉树则要执行N次的判断,再加上CALL调用要比判断要花时间,所以,线索二叉树的遍历比一般二叉树节省时间在理论上也是说的通的呵。

   空间性能的测试就简单的多咯,线索二叉树就是每个结点多了两个bool型变量,4个字节啊,在每组时间比较后,拿数据量*4,不是浪费的空间的大小吗?呵!

   介绍下环境先。我的硬件环境是:CPU IntelP4,1.70HZ;359M RAM(256+128M,不知怎么的就变成359M了),软件环境:Windows 2000/SP2,Visual C++ 7.0。

   首先给出一般二叉树和线索二叉树的存储结构。

typedef struct BNode//一般二叉树
{
  int data;
  BNode *lchild,*rchild;
}*BTree;

typedef struct BThNode//线索二叉树
{
  int data;
  bool LTag,RTag;//当Tag=false时表示不是线索
  BThNode *lchild,*rchild;
}*BThTree;

   下面给出几个测试时所用的函数:二叉树构造函数:

CreateTree(int depth,int OwnDepth,BTree *tree);
   时钟工具:

QueryPerformanceFrequency(LARGE_INTRGER);::QueryPerformanceCounter(LARGE_INTRGER);
   二叉树线索化函数

InOrderThreading (BThTree *thread,BThTree *tree);
   一般二叉树的中序遍历函数:

InOrderTraverse(Btree tree,void (*Visit)());
   线索二叉树的中序遍历函数:

InOrderTraverse_Thr(BthTree tree,void (*Visit)());
   结点访问函数:Visit()

   1、二叉树构造函数CreateTree(int depth,int OwnDepth,BTree *tree)

   功能:构造深度为depth的一般二叉树和线索二叉树

   参数:depth-----二叉树的深度

  OwnDepth----表示第一个结点所在深度

   Tree-----要构造的二叉树

void CreateTree(int depth,int OwnDepth,BTree *tree/*BThTree *tree*/)
{
  if(OwnDepth<depth)//当前结点小于树的深度时,继续构造
  {
   BTree p,q;
   if(!(*tree))//构造根结点
   {
    *tree=new BNode;//tree=new BThNode;
    (*tree)->data=0;
    (*tree)->lchild=(*tree)->rchild=NULL;
    //(*tree)->LTag=(*tree)->RTag=false;//构造线索二叉树使用
    printf("created Number %d floor/n",OwnDepth);
    CreateTree(depth,OwnDepth,tree);
   }
   else//构造子结点 {
    p=new BNode;//p=new BThNode;
    q=new BNode;//q=new BThNode;
    p->data=0;
    q->data=0;
    p->lchild=p->rchild=NULL;
    q->lchild=q->rchild=NULL;

    //q->LTag=q->RTag=false;
    //p->LTag=p->RTag=false;
    (*tree)->lchild=p;
    (*tree)->rchild=q;
    printf("created Number %d floor/n",OwnDepth+1);
    printf("created Number %d floor/n",OwnDepth+1);
    CreateTree(depth,OwnDepth+1,&p);//递归调用构造函数
    CreateTree(depth,OwnDepth+1,&q);
   }
  }
}

   2、一个记时工具,0.1微秒级别的,绝对够用,呵呵

QueryPerformanceFrequency(LARGE_INTRGER);-----获取CPU的频率

QueryPerformanceCounter(LARGE_INTRGER);----获取CPU时间

   3、二叉树的线索化函数

InOrderThreading(BThTree *thread,BThTree *tree)-----具体函数定义在清华C语言版《数据结构》P134
   功能:为二叉树tree中序线索化

相关文章
  • 类模拟的性能分析
【评论】【收藏本文】【打印】【关闭】
上一篇文章:Oracle数据库中分区表的操作方法
下一篇文章:游戏项目中的自动化测试和持续集成
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
推荐阅讯
  • 基于Delphi的“八皇后”问题动态实现
  • VS.NET2005 Beta2初体验之感受2005
  • 高质高效舒适地编程:使用Visual Unit(VU)
  • Oracle数据库日常维护手册
  • Delphi深度探索之外壳执行操作记录器
  • NoahWeb 什么是动作?
  • 没落的奇迹 谁会买下Delphi?
  • 游戏开发新手入门之位图化图形
  • Delphi快速入门(三)
  • Oracle数据操作和控制语言详解
阅读排行
  • 1.全面剖析Delphi 2006新增特性
  • 2.用Delphi开发视频聊天软件
  • 3.用Win32 API枚举应用程序窗口和进程
  • 4.软件的架构与设计模式之什么是架构
  • 5.软件的架构与设计模式之模式的种类
  • 6.Delphi中为TreeView添加单选和复选框
  • 7.用Delphi实现24位真彩色图标
  • 8.VS.NET2005 Beta2初体验之感受2005
  • 9.程序界面设计模式慨述
  • 10.没落的奇迹 谁会买下Delphi?
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载