1. 程式人生 > >程式優化雜談——最優二叉樹在程式中的應用

程式優化雜談——最優二叉樹在程式中的應用

  首先呢,我想和大家討論一個非常簡單的問題:分類。
  假設這裡有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個。現在要求寫一個程式對這100個物品進行分類。啊!這個問題是不是很簡單呢?你閉著眼睛也應該能寫出來。這裡我用偽C語言來寫這個程式。先約定:x[0]~x[99

完成基於哈夫曼)的壓縮及解壓小程式的收穫

收穫      1) 更有條理的構造我的程式碼了: 先從main方法下手,將自己想要的實現程式的功能以註釋 的方式寫出來,然後再逐漸細化每一部分的功能,每部分的功能都有非常明確的輸入部分,將這些輸入的內容加工,進行輸出(也就是下一部分功能的實現的輸入部分)就是這部分功能

->

nco 代碼實現 type except close 輸出結點 eof fde 左右 文字描述 結點的路徑長度   從樹中一個結點到另一個結點之間的分支構成這兩個結點之間的路徑,路徑上的分支數目稱作路徑長度。 樹的路徑長度    從樹根到每一個結點的路徑長度之和叫樹的路徑長

(赫夫曼)的構建

一、構建最優二叉樹 ①、節點類:五個屬性:結點的資料、父結點、左子結點、右子結點、赫夫曼編碼 /** * 樹的結點類 * * @author lenovo * */ public class TreeNode { private Object obj;

動態規劃--問題

 1、問題描速: 設 S={x1, x2, ···, xn}  是一個有序集合,且x1, x2, ···, xn表示有序集合的二叉搜尋樹利用二叉樹的頂點儲存有序集中的元素,而且具有性質:儲存於每個頂點中的元素x 大於其左子樹中任一個頂點中儲存的元素,小於其右子樹中任意頂點

哈夫曼編碼(基於哈夫曼-,不唯一)、B(b-)、B+

整合自: http://blog.csdn.net/shuangde800/article/details/7341289 http://www.cnblogs.com/Jezze/archive/2011/12/23/2299884.html http:/

PTA 7-8() 修理牧場(25 分)

最優二叉樹問題 把最小的兩端拿出來連線後放入佇列中,重複的上述操作,, 用優先佇列可以容易完成 (注:部落格作為交流使用,切勿抄襲應付作業) #include <iostream> #i

之赫夫曼

一、介紹 赫夫曼樹可以用來優化演算法,減少執行次數;還可以用於電報編碼。 二、優化演算法 對於我們巢狀的if語句,通常我們需要判斷多次if。但是if裡表示式的順序與程式執行速度有很大關係。如果我們把頻率高的if條件放在前面的話就能夠避免多次檢測fa

資料結構之哈夫曼

文字壓縮是一種非常重要的技術,自然涉及到了壓縮編碼。哈夫曼編碼——一種最基本的壓縮編碼方法 幾個術語: 1、路徑:樹中兩個節點之間的分支序列 2、路徑長度:路徑上的分支數目

哈夫曼)的構造【應用

        對於給定一個長度為m序列,構造一顆以序列值為權的m個外部結點的擴充二叉樹,使得帶權的外部路徑長度WPL最小,就稱這顆擴充二叉樹為 哈夫曼(Huffman)樹(最優二叉樹)。構造Huffman Tree 的演算法也就是哈夫曼演算法。演算法基本思想:1)給定m個權

之哈夫曼

        本文來介紹哈夫曼樹。哈夫曼樹又叫最優二叉樹,是一種特殊的二叉樹。這種二叉樹最重要的特徵就是:樹的帶權路徑長度(Weighted Path Length of Tree,簡記為WPL)最小。本文給出了哈弗曼演算法的實現過程,程式碼部分已經描述的比較詳細,這裡就

、赫爾曼(學習記錄)

注意vector儲存的記憶體地址可能會變,所以如果用vector來儲存所有節點的話,需要先resize好容器,保證期間不進行節點的增減。multiset是允許關鍵字重複的容器 #include<

——霍夫曼

一:什麼是最優二叉樹? 最優二叉樹就是從已給出的目標帶權結點(單獨的結點) 經過一種方式的組合形成一棵樹.使樹的權值最小. 最優二叉樹是帶權路徑長度最短的二叉樹。根據結點的個數,權值的不同,最優二叉樹的形狀也各不相同。它們的共同點是:帶權值的結點都是葉子結點。權值越小的

(哈夫曼)知識點

路徑:在一棵樹中從一個結點往下到孩子或孫子結點之間的通路 結點的路徑長度:從根節點到該節點的路徑上分支的數目 樹的路徑長度:樹中每個結點的路徑長度之和 結點的權:給樹中的結點賦予一個某種含義的值,則該

哈夫曼

最優二叉樹,也稱哈夫曼(Haffman)樹,是指對於一組帶有確定權值的葉結點,構造的具有最小帶權路徑長度的二叉樹。 二叉樹的路徑長度則是指由根結點到所有葉結點的路徑長度之和。如果二叉樹中的葉結點都具有一定的權值,則可將這一概念加以推廣。設二叉樹具有n個帶權值的葉結點,那麼從

資料結構學習筆記-森林和的轉化、

int min(HuffmanTree &HT,int i) { int k = MAX; int j,flag = 0; for(j=1;j<=i;++j) { if(HT[j].weights2) { change = s1; s1 = s2; s2 = chang

滿、完全(赫夫曼)、排序判定

二叉排序樹(Binary Sort Tree)又稱二叉查詢樹。 它或者是一棵空樹;或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; (2)若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; (3)左、右子樹也分別為二叉排序樹;

演算法基礎(八):超詳細構建(1)

赫夫曼(Huffman)樹也稱最有二叉樹,是一類帶全路徑長度最短的樹,有著廣泛的應用。比如一棵判定樹,根據學生的成績劃分及格還是不及格還是優、中等、良好。顯然用if-else或者switch就可以簡單實現,當然可以直接毫不考慮的直接這樣寫,但是如果我們再肯花點功夫,就可以得

——哈夫曼

一:什麼是最優二叉樹? 從我個人理解來說,最優二叉樹就是從已給出的目標帶權結點(單獨的結點) 經過一種方式的組合形成一棵樹.使樹的權值最小. 最優二叉樹是帶權路徑長度最短的二叉樹。根據結點的個數,權值的不同,最優二叉樹的形狀也各不相同。它們的共同點是:帶權值的結點都是葉

資料結構實驗之六:哈夫曼編碼(

Problem Description 字元的編碼方式有多種,除了大家熟悉的ASCII編碼,哈夫曼編碼(Huffman Coding)也是一種編碼方式,它是可變字長編碼。該方法完全依據字元出現概率來構造出平均長度最短的編碼,稱之為最優編碼。哈夫曼編碼常被用於資