程序优化杂谈——最优二叉树在程序中的应用

原创 2004年06月25日 14:04:00

程序优化杂谈——最优二叉树在程序中的应用

( 作者:mikespook | 发布日期:2003-4-13 | 浏览次数:180 )

关键字:程序,优化,哈夫曼,最优二叉树
  首先呢,我想和大家讨论一个非常简单的问题:分类。
  假设这里有100个物品。其中属于A类的物品有20个;B类10个;C类45个;D类15个;E类10个。现在要求写一个程序对这100个物品进行分类。啊!这个问题是不是很简单呢?你闭着眼睛也应该能写出来。这里我用伪C语言来写这个程序。先约定:x[0]~x[99]是这100个物品。“in”操作判断物品是否属于该类。“put”操作是将物品放入这个分类的中。
程序:
10 for(i=0;i<100;i++)
20 {
30 if(x[i] in a)
40 x[i] put a;
50 else
60 if(x[i] in b)
70 x[i] put b;
80 else
90 if(x[i] in c)
100 x[i] put c;
110 else
120 if(x[i] in d)
130 x[i] put d;
140 else
150 x[i] put e;
160 }
  “啊哈!多么漂亮的程序啊。”
  的确,这段代码从某个方面来说是非常不错的。很工整。但是这是最好的么?让我们计算一下看看。
不论如何优化“x[i] put x;”这句肯定要执行100次,因为一个物品必须放入一个分类。且只能放一次。那么能变化的就是比较的次数。先看下面这个图,是上面这段程序的一个树型结构图:
2003-4-13bbtree.gif
  我们很容易能计算出来这个结构在进行比较的时候,需要进行275次比较。那么怎么样才能减少比较的次数呢?
  实际上这是一个权值的问题。属于A类的物品有20个;B类10个;C类45个;D类15个;E类10个。那么我们不防设A的权值为0.2,B的权值为0.1,C的权值为0.45 ,D的权值为0.15,E的权值为0.1。那么根据最优二叉树的概念,应该把权值大的深度减到最小(详细的情况请参看清华大学出版的《数据结构》,关于哈夫曼编码那部分)。根据这个原则,我们应该将B、E向下调整,而C向上调整。于是又了下面这个新的结构:
2003-4-13bbtree1.gif
  按照这个结构从新写这个程序,再运行试试?比较次数被减少到了210次。很有意思不是么?
10 for(i=0;i<100;i++)
20 {
30 if(x[i] in c)
40 x[i] put c;
50 else
60 if(x[i] in a)
70 x[i] put a;
80 else
90 if(x[i] in d)
100 x[i] put d;
110 else
120 if(x[i] in b)
130 x[i] put b;
140 else
150 x[i] put e;
160 }
  为什么会这样呢?前面我只说了怎么做,没说为什么这么做。下面我和大家一起做个简单的分析。
  首先看这两段程序有什么不同的地方。
  第一段程序和第二段程序唯一不同之处就是判断的顺序不同。第一段程序判断的顺序是A、B、C、D、E。而第二段程序的判断顺序是C、A、D、B、E。奇怪的顺序不是么?其实一点都不奇怪,如果你按第二种顺序排列的时候写上权值你就发现其中的奥妙了:
C | A | D | B | E
0.45 | 0.2 | 0.15 | 0.1 | 0.1
是的,它的权值是从大到小排列的。
  为了说明得更透彻些,下面再来分析一下程序运行的过程。
  行30那段程序不论怎么调整,总是要运行100次的。而后面的程序是否执行则受前面的程序条件判断的结果影响。如果判断为真,则不执行后面的程序。如果将权值大的比较放的深度深,那么无形之中就将整棵比较树的权值加大了。反过来,整棵树的权值就小。而这种优化的思想就是在这——尽量降低整体的权值。
  学过数据结构的朋友一定会说:“你这个优化并不是最优二叉树。”是的,最优二叉树的结构应该是这样的:
2003-4-13bbtree2.gif
  但是程序优化有它的特殊性。如果你完全按照最优二叉树来优化,会发现判断条件非常复杂,并且判断次数没有减少(在本例中是这样,别的情况但并不一定。)。实际上是增加了程序的运行时间。
  我给大家给了一个C#做的例子。大家可以比较一下之间的差异。可以到我的站上去下载 www.xxiyy.com

程序优化杂谈——最优二叉树在程序中的应用

关键字:程序,优化,哈夫曼,最优二叉树  首先呢,我想和大家讨论一个非常简单的问题:分类。  假设这里有100个物品。其中属于A类的物品有20个;B类10个;C类45个;D类15个;E类10个。现在要...
  • qq_net
  • qq_net
  • 2004年09月10日 17:06
  • 1420

标题:利用动态规划求解最优二叉树

摘要:二叉查找书所要查找的目标出现的频率可能不一样,因此它们在二叉查找树上的位置不同,查找的代价也不同.(1)基本思路:[1]因为二叉查找树的左儿子一定要小于右儿子,这里用单词作为元素.首先按照首字母...
  • pp634077956
  • pp634077956
  • 2015年09月06日 19:50
  • 558

动态规划--最优二叉树问题

1、问题描速:        设 S={x1, x2, ···, xn}  是一个有序集合,且x1, x2, ···, xn表示有序集合的二叉搜索树利用二叉树的顶点存储有序集中的元素,而且具有性质:...
  • sinat_24520925
  • sinat_24520925
  • 2015年01月19日 20:38
  • 1724

C程序优化方法

对程序进行优化, 通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一, 一般是优化了代码的尺寸, 就会带来执行时间的增加, 如果优化了程序的执行速度, 通常会带来代...
  • talentluke
  • talentluke
  • 2010年12月29日 01:01
  • 2436

单片机C程序优化

单片机C程序优化     对程序进行优化,通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一。一般是优化了代码的尺寸,就会带来执行时间的增加;如果优化了程序的...
  • ch10104
  • ch10104
  • 2016年03月08日 18:45
  • 178

讲述几点对程序进行效率优化的方法

1.前言         前几天看了深入理解计算机系统的 程序优化。因为前边两章节涉及到了太多的汇编,而本人不是计算机科班出身,计算机基础薄弱,看那些汇编代码的确很吃力, 打算以后对汇编慢慢来学习...
  • wallwind
  • wallwind
  • 2011年08月27日 17:21
  • 2831

linux下程序性能优化

一. 性能优化概述 •一般来说,程序性能不佳,有可能是如下三个原因: –A.程序运输量大,导致CPU过于繁忙,CPU是瓶颈 •解决办法就是在设备上运行TOP命令,如果某个进程的CPU利用率很...
  • jamielover
  • jamielover
  • 2013年06月02日 22:22
  • 841

程序优化杂谈——前言

程序优化杂谈——前言 ( 作者:mikespook | 发布日期:2003-4-13 | 浏览次数:95 ) 关键字:程序,优化   关于程序优化,是从计算机出现以来一个长久的话题。早期计算机...
  • mikespook
  • mikespook
  • 2004年06月25日 14:04
  • 1486

VB程序的优化

一、减少加载窗体数目 每一个加载的窗体,无论可视与否,都要占据一定数量的内存(其数量随窗体上控件的类型和数量,以及窗体上位图的大小等的不同而变化)。只在需要显示时才加载窗体,不再需要时,卸载窗体(而...
  • cncco
  • cncco
  • 2014年09月07日 00:50
  • 882

算法基础(八):超详细最优二叉树构建(1)

算法基础(八):超详细最优二叉树构建(1)
  • huiguimoyu
  • huiguimoyu
  • 2014年04月27日 18:55
  • 1781
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序优化杂谈——最优二叉树在程序中的应用
举报原因:
原因补充:

(最多只允许输入30个字)