從上述算法中可以看出,F(xiàn)實(shí)際上是森林,該算法的思想是不斷地進(jìn)行森林F中的二叉樹(shù)的"合并",最終得到哈夫曼樹(shù)。
在構(gòu)造哈夫曼樹(shù)時(shí),可以設(shè)置一個(gè)結(jié)構(gòu)數(shù)組HuffNode保存哈夫曼樹(shù)中各結(jié)點(diǎn)的信息,根據(jù)二叉樹(shù)的性質(zhì)可知,具有n個(gè)葉子結(jié)點(diǎn)的哈夫曼樹(shù)共有2n-1個(gè)結(jié)點(diǎn),所以數(shù)組HuffNode的大小設(shè)置為2n-1,數(shù)組元素的結(jié)構(gòu)形式如下:
weight | lchild | rchild | parent |
其中,weight域保存結(jié)點(diǎn)的權(quán)值,lchild和rchild域分別保存該結(jié)點(diǎn)的左、右孩子結(jié)點(diǎn)在數(shù)組HuffNode中的序號(hào),從而建立起結(jié)點(diǎn)之間的關(guān)系。為了判定一個(gè)結(jié)點(diǎn)是否已加入到要建立的哈夫曼樹(shù)中,可通過(guò)parent域的值來(lái)確定。初始時(shí)parent的值為-1,當(dāng)結(jié)點(diǎn)加入到樹(shù)中時(shí),該結(jié)點(diǎn)parent的值為其雙親結(jié)點(diǎn)在數(shù)組HuffNode中的序號(hào),就不會(huì)是-1了。
構(gòu)造哈夫曼樹(shù)時(shí),首先將由n個(gè)字符形成的n個(gè)葉結(jié)點(diǎn)存放到數(shù)組HuffNode的前n個(gè)分量中,然后根據(jù)前面介紹的哈夫曼方法的基本思想,不斷將兩個(gè)小子樹(shù)合并為一個(gè)較大的子樹(shù),每次構(gòu)成的新子樹(shù)的根結(jié)點(diǎn)順序放到HuffNode數(shù)組中的前n個(gè)分量的后面。
下面給出哈夫曼樹(shù)的構(gòu)造算法。
const maxvalue= 10000; {定義最大權(quán)值}
maxleat=30; {定義哈夫曼樹(shù)中葉子結(jié)點(diǎn)個(gè)數(shù)}
maxnode=maxleaf*2-1;
type HnodeType=record
weight: integer;
parent: integer;
lchild: integer;
rchild: integer;
end;
HuffArr:array[0..maxnode] of HnodeType;
var ……
procedure CreatHaffmanTree(var HuffNode: HuffArr); {哈夫曼樹(shù)的構(gòu)造算法}
var i,j,m1,m2,x1,x2,n: integer;
begin
readln(n); {輸入葉子結(jié)點(diǎn)個(gè)數(shù)}
for i:=0 to 2*n-1 do {數(shù)組HuffNode[ ]初始化}
begin
HuffNode.weight=0;
HuffNode.parent=-1;
HuffNode.lchild=-1;
HuffNode.rchild=-1;
end;
for i:=0 to n-1 do read(HuffNode.weight); {輸入n個(gè)葉子結(jié)點(diǎn)的權(quán)值}
for i:=0 to n-1 do {構(gòu)造哈夫曼樹(shù)}
begin
m1:=MAXVALUE; m2:=MAXVALUE;
x1:=0; x2:=0;
for j:=0 to n i-1 do
if (HuffNode[j].weight
begin m2:=m1; x2:=x1;
m1:=HuffNode[j].weight; x1:=j;
end
else if (HuffNode[j].weight
begin m2:=HuffNode[j].weight; x2:=j; end;
{將找出的兩棵子樹(shù)合并為一棵子樹(shù)}
HuffNode[x1].parent:=n i; HuffNode[x2].parent:=n i;
HuffNode[n i].weight:= HuffNode[x1].weight HuffNode[x2].weight;
HuffNode[n i].lchild:=x1; HuffNode[n i].rchild:=x2;
end;
end;
最優(yōu)二叉樹(shù)算法基本概念
最優(yōu)二叉樹(shù),也稱(chēng)哈夫曼(Haffman)樹(shù),是指對(duì)于一組帶有確定權(quán)值的葉結(jié)點(diǎn),構(gòu)造的具有最小帶權(quán)路徑長(zhǎng)度的二叉樹(shù)。
那么什么是二叉樹(shù)的帶權(quán)路徑長(zhǎng)度呢?
在前面我們介紹過(guò)路徑和結(jié)點(diǎn)的路徑長(zhǎng)度的概念,而二叉樹(shù)的路徑長(zhǎng)度則是指由根結(jié)點(diǎn)到所有葉結(jié)點(diǎn)的路徑長(zhǎng)度之和。如果二叉樹(shù)中的葉結(jié)點(diǎn)都具有一定的權(quán)值,則可將這一概念加以推廣。設(shè)二叉樹(shù)具有n個(gè)帶權(quán)值的葉結(jié)點(diǎn),那么從根結(jié)點(diǎn)到各個(gè)葉結(jié)點(diǎn)的路徑長(zhǎng)度與相應(yīng)結(jié)點(diǎn)權(quán)值的乘積之和叫做二叉樹(shù)的帶權(quán)路徑長(zhǎng)度,記為:
WPL= Wk·Lk
其中Wk為第k個(gè)葉結(jié)點(diǎn)的權(quán)值,Lk 為第k個(gè)葉結(jié)點(diǎn)的路徑長(zhǎng)度。如圖7.2所示的二叉樹(shù),它的帶權(quán)路徑長(zhǎng)度值WPL=2×2+4×2+5×2+3×2=28。
在給定一組具有確定權(quán)值的葉結(jié)點(diǎn),可以構(gòu)造出不同的帶權(quán)二叉樹(shù)。例如,給出4個(gè)葉結(jié)點(diǎn),設(shè)其權(quán)值分別為1,3,5,7,我們可以構(gòu)造出形狀不同的多個(gè)二叉樹(shù)。這些形狀不同的二叉樹(shù)的帶權(quán)路徑長(zhǎng)度將各不相同。圖7.3給出了其中5個(gè)不同形狀的二叉樹(shù)。
這五棵樹(shù)的帶權(quán)路徑長(zhǎng)度分別為:
(a)WPL=1×2+3×2+5×2+7×2=32
(b)WPL=1×3+3×3+5×2+7×1=29
(c)WPL=1×2+3×3+5×3+7×1=33
(d)WPL=7×3+5×3+3×2+1×1=43
(e)WPL=7×1+5×2+3×3+1×3=29
最優(yōu)二叉樹(shù)算法
最優(yōu)二叉樹(shù)算法
由此可見(jiàn),由相同權(quán)值的一組葉子結(jié)點(diǎn)所構(gòu)成的二叉樹(shù)有不同的形態(tài)和不同的帶權(quán)路徑長(zhǎng)度,那么如何找到帶權(quán)路徑長(zhǎng)度最小的二叉樹(shù)(即哈夫曼樹(shù))呢?根據(jù)哈夫曼樹(shù)的定義,一棵二叉樹(shù)要使其WPL值最小,必須使權(quán)值越大的葉結(jié)點(diǎn)越靠近根結(jié)點(diǎn),而權(quán)值越小的葉結(jié)點(diǎn)越遠(yuǎn)離根結(jié)點(diǎn)。
哈夫曼(Haffman)依據(jù)這一特點(diǎn)于1952年提出了一種方法,這種方法的基本思想是:
(1)由給定的n個(gè)權(quán)值{W1,W2,…,Wn}構(gòu)造n棵只有一個(gè)葉結(jié)點(diǎn)的二叉樹(shù),從而得到一個(gè)二叉樹(shù)的集合F={T1,T2,…,Tn};
(2)在F中選取根結(jié)點(diǎn)的權(quán)值最小和次小的兩棵二叉樹(shù)作為左、右子樹(shù)構(gòu)造一棵新的二叉樹(shù),這棵新的二叉樹(shù)根結(jié)點(diǎn)的權(quán)值為其左、右子樹(shù)根結(jié)點(diǎn)權(quán)值之和;
(3)在集合F中刪除作為左、右子樹(shù)的兩棵二叉樹(shù),并將新建立的二叉樹(shù)加入到集合F中;
(4)重復(fù)(2)(3)兩步,當(dāng)F中只剩下一棵二叉樹(shù)時(shí),這棵二叉樹(shù)便是所要建立的哈夫曼樹(shù)。
在實(shí)際應(yīng)用中,常常要考慮一個(gè)問(wèn)題:如何設(shè)計(jì)一棵二叉樹(shù),使得執(zhí)行路徑最短,即算法的效率最高。
例1.快遞包裹的郵資問(wèn)題
假設(shè)郵政局的包裹自動(dòng)測(cè)試系統(tǒng)能夠測(cè)出包裹的重量,如何設(shè)計(jì)一棵二叉樹(shù)將包裹根據(jù)重量及運(yùn)距進(jìn)行分類(lèi)從而確定郵資。
國(guó)內(nèi)快遞包裹資費(fèi) 單位:元
(2004年1月1日起執(zhí)行)
運(yùn)距(公里) | 首重1000克 | 5000克以?xún)?nèi)續(xù)重每500克 | 5001克以上續(xù)重每500克 |
<=500 | 5.00 | 2.00 | 1.00 |
<=1000 >500 | 6.00 | 2.50 | 1.30 |
<=1500 >1000 | 7.00 | 3.00 | 1.60 |
<=2000 >1500 | 8.00 | 3.50 | 1.90 |
<=2500 >2000 | 9.00 | 4.00 | 2.20 |
<=3000 >2500 | 10.00 | 4.50 | 2.50 |
<=4000 >3000 | 12.00 | 5.50 | 3.10 |
<=5000 >4000 | 14.00 | 6.50 | 3.70 |
<=6000 >5000 | 16.00 | 7.50 | 4.30 |
>6000 | 20.00 | 9.00 | 6.00 |
表1 國(guó)家郵政局制定的快遞包裹參考標(biāo)準(zhǔn)
根據(jù)表1可以制定出許多種二叉樹(shù),但不同的二叉樹(shù)判定的次數(shù)可能不一樣,執(zhí)行的效率也不同。
鐵球分類(lèi)
現(xiàn)有一批球磨機(jī)上的鐵球,需要將它分成四類(lèi):直徑不大于20的屬于第一類(lèi);直徑大于20而不大于50的屬于第二類(lèi);直徑大于50而不大于100的屬于第三類(lèi);其余的屬于第四類(lèi);假定這批球中屬于第一、二、三、四類(lèi)鐵球的個(gè)數(shù)之比例是1:2:3:4。
我們可以把這個(gè)判斷過(guò)程表示為 圖1中的兩種方法:
最優(yōu)二叉樹(shù)算法
兩種判斷二叉樹(shù)示意圖
那么究竟將這個(gè)判斷過(guò)程表示成哪一個(gè)判斷框,才能使其執(zhí)行時(shí)間最短呢?讓我們對(duì)上述判斷框做一具體的分析。
假設(shè)有1000個(gè)鐵球,則各類(lèi)鐵球的個(gè)數(shù)分別為:100、200、300、400;
對(duì)于圖7.1中的上圖和下圖比較的次數(shù)分別如表所示:
左圖 和下圖
序號(hào) | 比較式 | 比較次數(shù) |
1 | a<20 | 1000 |
2 | a<50 | 900 |
3 | a<=100 | 700 |
合計(jì) | 2600 |
序號(hào) | 比較式 | 比較次數(shù) |
1 | a>100 | 1000 |
2 | a>50 | 600 |
3 | a<=20 | 300 |
合計(jì) | 1900 |
表2 兩種判斷二叉樹(shù)比較次數(shù)
過(guò)上述分析可知,圖1中右圖所示的判斷框的比較次數(shù)遠(yuǎn)遠(yuǎn)小于左圖所示的判斷框的比較次數(shù)。為了找出比較次數(shù)最少的判斷框,將涉及到樹(shù)的路徑長(zhǎng)度問(wèn)題。
二叉樹(shù)在計(jì)算機(jī)科學(xué)中,二叉樹(shù)是每個(gè)結(jié)點(diǎn)最多有兩個(gè)子樹(shù)的有序樹(shù)。通常子樹(shù)的根被稱(chēng)作“左子樹(shù)”(left subtree)和“右子樹(shù)”(right subtree)。二叉樹(shù)常被用作二叉查找樹(shù)和二叉堆。二叉...
有砌體墻的地方才有構(gòu)造柱,構(gòu)造柱可以在基礎(chǔ)梁,地框梁或基礎(chǔ)連梁上生根。 回復(fù):具體要依據(jù)設(shè)計(jì),一般是要設(shè)置的。
各地定額不一樣?計(jì)算規(guī)則也不一定相同?山東計(jì)價(jià)定額是截面面積加馬牙槎乘以設(shè)計(jì)高度以立方米計(jì)算。比如:主截面為240*240,單面馬牙槎60,計(jì)算式應(yīng)是:(0.24*0.24+0.24*0.03)*高度
在數(shù)據(jù)通訊中,經(jīng)常需要將傳送的文字轉(zhuǎn)換成由二進(jìn)制字符0,1組成的二進(jìn)制串,我們稱(chēng)之為編碼。例如,假設(shè)要傳送的電文為ABACCDA,電文中只含有A,B,C,D四種字符,若這四種字符采用表7.3 (a)所示的編碼,則電文的代碼為000010000100100111 000,長(zhǎng)度為21。在傳送電文時(shí),我們總是希望傳送時(shí)間盡可能短,這就要求電文代碼盡可能短,顯然,這種編碼方案產(chǎn)生的電文代碼不夠短。表7.3 (b)所示為另一種編碼方案,用此編碼對(duì)上述電文進(jìn)行編碼所建立的代碼為00010010101100,長(zhǎng)度為14。在這種編碼方案中,四種字符的編碼均為兩位,是一種等長(zhǎng)編碼。如果在編碼時(shí)考慮字符出現(xiàn)的頻率,讓出現(xiàn)頻率高的字符采用盡可能短的編碼,出現(xiàn)頻率低的字符采用稍長(zhǎng)的編碼,構(gòu)造一種不等長(zhǎng)編碼,則電文的代碼就可能更短。如當(dāng)字符A,B,C,D采用表7.3 (c)所示的編碼時(shí),上述電文的代碼為0110010101110,長(zhǎng)度僅為13。
表a、表b、表c、表d(從下圖的上下順序依次列出)
字符 | 編碼 |
A | 000 |
B | 010 |
C | 100 |
D | 111 |
字符 | 編碼 |
A | 00 |
B | 01 |
C | 10 |
D | 11 |
字符 | 編碼 |
A | 0 |
B | 110 |
C | 10 |
D | 111 |
字符 | 編碼 |
A | 01 |
B | 010 |
C | 001 |
D | 10 |
表3 字符的四種不同的編碼方案
哈夫曼樹(shù)可用于構(gòu)造使電文的編碼總長(zhǎng)最短的編碼方案。具體做法如下:設(shè)需要編碼的字符集合為{d1,d2,…,dn},它們?cè)陔娢闹谐霈F(xiàn)的次數(shù)或頻率集合為{w1,w2,…,wn},以d1,d2,…,dn作為葉結(jié)點(diǎn),w1,w2,…,wn作為它們的權(quán)值,構(gòu)造一棵哈夫曼樹(shù),規(guī)定哈夫曼樹(shù)中的左分支代表0,右分支代表1,則從根結(jié)點(diǎn)到每個(gè)葉結(jié)點(diǎn)所經(jīng)過(guò)的路徑分支組成的0和1的序列便為該結(jié)點(diǎn)對(duì)應(yīng)字符的編碼,我們稱(chēng)之為哈夫曼編碼。
在哈夫曼編碼樹(shù)中,樹(shù)的帶權(quán)路徑長(zhǎng)度的含義是各個(gè)字符的碼長(zhǎng)與其出現(xiàn)次數(shù)的乘積之和,也就是電文的代碼總長(zhǎng),所以采用哈夫曼樹(shù)構(gòu)造的編碼是一種能使電文代碼總長(zhǎng)最短的不等長(zhǎng)編碼。
在建立不等長(zhǎng)編碼時(shí),必須使任何一個(gè)字符的編碼都不是另一個(gè)字符編碼的前綴,這樣才能保證譯碼的唯一性。例如表7.3 (d)的編碼方案,字符A的編碼01是字符B的編碼010的前綴部分,這樣對(duì)于代碼串0101001,既是AAC的代碼,也是ABD和BDA的代碼,因此,這樣的編碼不能保證譯碼的唯一性,我們稱(chēng)之為具有二義性的譯碼。
然而,采用哈夫曼樹(shù)進(jìn)行編碼,則不會(huì)產(chǎn)生上述二義性問(wèn)題。因?yàn)?,在哈夫曼?shù)中,每個(gè)字符結(jié)點(diǎn)都是葉結(jié)點(diǎn),它們不可能在根結(jié)點(diǎn)到其它字符結(jié)點(diǎn)的路徑上,所以一個(gè)字符的哈夫曼編碼不可能是另一個(gè)字符的哈夫曼編碼的前綴,從而保證了譯碼的非二義性。
下面討論實(shí)現(xiàn)哈夫曼編碼的算法。實(shí)現(xiàn)哈夫曼編碼的算法可分為兩大部分:
(1)構(gòu)造哈夫曼樹(shù);
(2)在哈夫曼樹(shù)上求葉結(jié)點(diǎn)的編碼。
求哈夫曼編碼,實(shí)質(zhì)上就是在已建立的哈夫曼樹(shù)中,從葉結(jié)點(diǎn)開(kāi)始,沿結(jié)點(diǎn)的雙親鏈域回退到根結(jié)點(diǎn),每回退一步,就走過(guò)了哈夫曼樹(shù)的一個(gè)分支,從而得到一位哈夫曼碼值,由于一個(gè)字符的哈夫曼編碼是從根結(jié)點(diǎn)到相應(yīng)葉結(jié)點(diǎn)所經(jīng)過(guò)的路徑上各分支所組成的0,1序列,因此先得到的分支代碼為所求編碼的低位碼,后得到的分支代碼為所求編碼的高位碼。我們可以設(shè)置一結(jié)構(gòu)數(shù)組HuffCode用來(lái)存放各字符的哈夫曼編碼信息,數(shù)組元素的結(jié)構(gòu)如下:
bit | start |
其中,分量bit為一維數(shù)組,用來(lái)保存字符的哈夫曼編碼,start表示該編碼在數(shù)組bit中的開(kāi)始位置。所以,對(duì)于第i個(gè)字符,它的哈夫曼編碼存放在HuffCode.bit中的從HuffCode.start到n的分量上。
求哈夫曼編碼程序段
const Maxleaf=128; {定義最多葉結(jié)點(diǎn)數(shù)}
MaxNode=255; {定義最大結(jié)點(diǎn)數(shù)}
MaxBit=10; {定義哈夫曼編碼的最大長(zhǎng)度}
type HCodeType =record
bit: array[0..MaxBit] of integer;
start: integer;
end;
……
procedure HaffmanCode ; {生成哈夫曼編碼}
var HuffNode: array[0..MaxNode] of HCodeType;
HuffCode: array[0..MaxLeaf] of HcodeType;
cd : HcodeType ;
i,j, c,p: integer ;
begin
HuffmanTree (HuffNode ); {建立哈夫曼樹(shù)}
for i:=0 to n-1 do {求每個(gè)葉子結(jié)點(diǎn)的哈夫曼編碼}
begin
cd.start:=n-1; c:=i;
p:=HuffNode[c].parent;
while p<>0 do {由葉結(jié)點(diǎn)向上直到樹(shù)根}
if HuffNode
.lchild=c then cd.bit[cd.start]:=0
else cd.bit[cd.start]:=1;
dec (cd.start); c:=p;
p:=HuffNode[c].parent;
end;
for j:=cd.start 1 to n-1 do {保存求出的每個(gè)葉結(jié)點(diǎn)的哈夫曼編碼和編碼的起始位}
begin
HuffCode.bit[j]:=cd.bit[j];
HuffCode.start=cd.start;
end;
for i:=0 to n-1 do {輸出每個(gè)葉子結(jié)點(diǎn)的哈夫曼編碼}
begin
for j:=HuffCode.start 1 to n-1 do write(HuffCode.bit[j]:10);
writeln;
end;
end;
在本章的引入部分,兩個(gè)例子都是判定問(wèn)題,這兩個(gè)判定問(wèn)題都可以通過(guò)構(gòu)造哈夫曼樹(shù)來(lái)優(yōu)化判定,以達(dá)到總的判定次數(shù)最少。
再如,要編制一個(gè)將百分制轉(zhuǎn)換為五級(jí)分制的程序。顯然,此程序很簡(jiǎn)單,只要利用條件語(yǔ)句便可完成。
程序段
if a<60 then b:='bad'
else if a<70 then b:='pass'
else if a<80 then b:='general'
else if a<90 then b:='good'
else b:='excellent';
如果上述程序需反復(fù)使用,而且每次的輸入量很大,則應(yīng)考慮上述程序的質(zhì)量問(wèn)題,即其操作所需要的時(shí)間。因?yàn)樵趯?shí)際中,學(xué)生的成績(jī)?cè)谖鍌€(gè)等級(jí)上的分布是不均勻的,假設(shè)其分布規(guī)律如表4所示:
分?jǐn)?shù) | 0-59 | 60-69 | 70-79 | 80-89 | 90-100 |
比例數(shù) | 0.05 | 0.15 | 0.40 | 0.30 | 0.10 |
表4 分?jǐn)?shù)段的分布頻率
則80%以上的數(shù)據(jù)需進(jìn)行三次或三次以上的比較才能得出結(jié)果。假定以5,15,40,30和10為權(quán)構(gòu)造一棵有五個(gè)葉子結(jié)點(diǎn)的哈夫曼樹(shù),它可使大部分的數(shù)據(jù)經(jīng)過(guò)較少的比較次數(shù)得出結(jié)果。但由于每個(gè)判定框都有兩次比較,將這兩次比較分開(kāi),得到新的判定樹(shù),按此判定樹(shù)可寫(xiě)出相應(yīng)的程序。請(qǐng)您自己畫(huà)出此判定樹(shù)。
假設(shè)有10000個(gè)輸入數(shù)據(jù),若上程序段的判定過(guò)程進(jìn)行操作,則總共需進(jìn)行31500次比較;而若新判定樹(shù)的判定過(guò)程進(jìn)行操作,則總共僅需進(jìn)行22000次比較。
格式:pdf
大小:276KB
頁(yè)數(shù): 2頁(yè)
評(píng)分: 4.4
支持向量機(jī)最初只能用以解決二分類(lèi)問(wèn)題,對(duì)于多類(lèi)故障,只能通過(guò)組合二分類(lèi)器間接應(yīng)用于多類(lèi)分類(lèi)問(wèn)題。本文提出一種基于二叉樹(shù)多分類(lèi)算法對(duì)變壓器中常見(jiàn)故障進(jìn)行了模式識(shí)別,并與傳統(tǒng)多分類(lèi)算法作對(duì)比。根據(jù)svm理論結(jié)合二叉樹(shù)方法建立變壓器故障診斷模型,通過(guò)VS2008對(duì)其進(jìn)行了驗(yàn)證,結(jié)果表明該方法能有效地、準(zhǔn)確地識(shí)別故障模式,具有較高的推廣性。
格式:pdf
大?。?span id="vt2mbr6" class="single-tag-height">276KB
頁(yè)數(shù): 2頁(yè)
評(píng)分: 4.8
如果一棵具有n個(gè)結(jié)點(diǎn)的深度為k的二叉樹(shù),它的每一個(gè)結(jié)點(diǎn)都與深度為k的滿(mǎn)二叉樹(shù)中編號(hào)為1~n的結(jié)點(diǎn)一一對(duì)應(yīng),這棵二叉樹(shù)稱(chēng)為完全二叉樹(shù)。
可以根據(jù)公式進(jìn)行推導(dǎo),假設(shè)n0是度為0的結(jié)點(diǎn)總數(shù)(即葉子結(jié)點(diǎn)數(shù)),n1是度為1的結(jié)點(diǎn)總數(shù),n2是度為2的結(jié)點(diǎn)總數(shù),則 ①n= n0+n1+n2 (其中n為完全二叉樹(shù)的結(jié)點(diǎn)總數(shù));又因?yàn)橐粋€(gè)度為2的結(jié)點(diǎn)會(huì)有2個(gè)子結(jié)點(diǎn),一個(gè)度為1的結(jié)點(diǎn)會(huì)有1個(gè)子結(jié)點(diǎn),除根結(jié)點(diǎn)外其他結(jié)點(diǎn)都有父結(jié)點(diǎn),所以②n= 1+n1+2*n2 ;由①、②兩式把n2消去得:n= 2*n0+n1-1,由于完全二叉樹(shù)中度為1的結(jié)點(diǎn)數(shù)只有兩種可能0或1,由此得到n0=n/2 或 n0=(n+1)/2。
簡(jiǎn)便來(lái)算,就是 n0=n/2,其中n為奇數(shù)時(shí)(n1=0)向上取整;n為偶數(shù)時(shí)(n1=1)??筛鶕?jù)完全二叉樹(shù)的結(jié)點(diǎn)總數(shù)計(jì)算出葉子結(jié)點(diǎn)數(shù)。
由于網(wǎng)絡(luò)所有可能的劃分?jǐn)?shù)量是巨大的,假設(shè)網(wǎng)絡(luò)的結(jié)點(diǎn)數(shù)和邊數(shù)分別為n和m,則所有可能的社區(qū)劃分?jǐn)?shù)是一個(gè)以n為指數(shù)的數(shù)。因此,在所有可能的劃分中找出最優(yōu)劃分是一個(gè)NP-hard問(wèn)題。針對(duì)這一問(wèn)題,目前一些相應(yīng)算法已被提出,其可以在合理的時(shí)間內(nèi)找出模塊度最大化的近似最優(yōu)劃分。
模塊度最大化問(wèn)題是一個(gè)經(jīng)典的最優(yōu)化問(wèn)題,Mark NewMan 基于貪心思想提出了模塊度最大化的貪心算法FN 。貪心思想的目標(biāo)是找出目標(biāo)函數(shù)的整體最優(yōu)值或者近似最優(yōu)值,它將整體最優(yōu)化問(wèn)題分解為局部最優(yōu)化問(wèn)題,找出每個(gè)局部最優(yōu)值,最終將局部最優(yōu)值整合成整體的近似最優(yōu)值。FN算法將模塊度最優(yōu)化問(wèn)題分解為模塊度局部最優(yōu)化問(wèn)題,初始時(shí),算法將網(wǎng)絡(luò)中的每個(gè)結(jié)點(diǎn)都看成獨(dú)立的小社區(qū)。然后,考慮所有相連社區(qū)兩兩合并的情況,計(jì)算每種合并帶來(lái)的模塊度的增量?;谪澬脑瓌t,選取使模塊度增長(zhǎng)最大或者減小最少的兩個(gè)社區(qū),將它們合并成一個(gè)社區(qū)。如此循環(huán)迭代,直到所有結(jié)點(diǎn)合并成一個(gè)社區(qū)。隨著迭代的進(jìn)行,網(wǎng)絡(luò)總的模塊度是不斷變化的,在模塊度的整個(gè)變化過(guò)程中,其最大值對(duì)應(yīng)網(wǎng)絡(luò)的社區(qū)劃分即為近似的最優(yōu)社區(qū)劃分。
貪心算法FN具體步驟:
去掉網(wǎng)絡(luò)中所有的邊,網(wǎng)絡(luò)的每個(gè)結(jié)點(diǎn)都單獨(dú)作為一個(gè)社區(qū);網(wǎng)絡(luò)中的每個(gè)連通部分作為一個(gè)社區(qū),將還未加入網(wǎng)絡(luò)的邊分別重新加回網(wǎng)絡(luò),每次加入一條邊,如果加入網(wǎng)絡(luò)的邊連接了兩個(gè)不同的社區(qū),則合并兩個(gè)社區(qū),并計(jì)算形成新社區(qū)劃分的模塊度增量。選擇使模塊度增量最大或者減小最少的兩個(gè)社區(qū)進(jìn)行合并。如果網(wǎng)絡(luò)的社區(qū)數(shù)大于1,則返回步驟(2)繼續(xù)迭代,否則轉(zhuǎn)到步驟(4);遍歷每種社區(qū)劃分對(duì)應(yīng)的模塊度值,選取模塊度最大的社區(qū)劃分作為網(wǎng)絡(luò)的最優(yōu)劃分。該算法中,需要注意的是,每次加入的邊只是影響網(wǎng)絡(luò)的社區(qū)劃分,而每次計(jì)算網(wǎng)絡(luò)劃分的模塊度時(shí),都是在網(wǎng)絡(luò)完整的拓?fù)浣Y(jié)構(gòu)上進(jìn)行,即網(wǎng)絡(luò)所有的邊都存在的拓?fù)浣Y(jié)構(gòu)上。
為了降低算法的時(shí)間復(fù)雜度,Vincent Blondel等人提出了另一種層次貪心算法 。該算法包括兩個(gè)階段,第一階段合并社區(qū),算法將每個(gè)結(jié)點(diǎn)當(dāng)作一個(gè)社區(qū),基于模塊度增量最大化標(biāo)準(zhǔn)決定你哪些鄰居社區(qū)應(yīng)該被合并。經(jīng)過(guò)一輪掃描后開(kāi)始第二階段,算法將第一階段發(fā)現(xiàn)的所有社區(qū)重新看成結(jié)點(diǎn),構(gòu)建新的網(wǎng)絡(luò),在新網(wǎng)絡(luò)上重復(fù)進(jìn)行第一階段,這兩個(gè)階段重復(fù)運(yùn)行,直到網(wǎng)絡(luò)社區(qū)劃分的模塊度不再增長(zhǎng),得到網(wǎng)絡(luò)的社區(qū)近似最優(yōu)劃分。
這個(gè)簡(jiǎn)單算法具有一下幾個(gè)優(yōu)點(diǎn):首先,算法的步驟比較直觀并且易于實(shí)現(xiàn);其次,算法不需要提前設(shè)定網(wǎng)絡(luò)的社區(qū)數(shù),并且該算法可以呈現(xiàn)網(wǎng)絡(luò)的完整的分層社區(qū)結(jié)構(gòu),能夠發(fā)現(xiàn)在線社交網(wǎng)絡(luò)的分層的虛擬社區(qū)結(jié)構(gòu),獲得不同分辨率的虛擬社區(qū);再次,計(jì)算機(jī)模擬實(shí)驗(yàn)顯示,在稀疏網(wǎng)絡(luò)上,算法是時(shí)間復(fù)雜度是線性的,在合理的時(shí)間內(nèi)可以處理結(jié)點(diǎn)數(shù)超過(guò)10^9的網(wǎng)絡(luò),因此十分適合在線社交網(wǎng)絡(luò)這樣超大規(guī)模的負(fù)責(zé)網(wǎng)絡(luò)中虛擬社區(qū)的發(fā)現(xiàn)。
是程序算法中的一種算法模式。
在二叉樹(shù)中出現(xiàn)空的子樹(shù)(包括樹(shù)葉)上增加空的樹(shù)葉,使其成為滿(mǎn)二叉樹(shù)的二叉樹(shù)稱(chēng)之為擴(kuò)充二叉樹(shù)。