簡體   English   中英

AVL樹中的最小節點數?

[英]Minimum number of node in AVL tree?

我知道在 AVL 樹中找到最小節點數的公式是

S(h) = S(h-1) + S(h-2) + 1

但是,我真的不知道如何使用這個函數,假設我們的 AVL 高度為 6。答案告訴我最小值 = 7 + 4 + 1 = 12。 但是你怎么得到這個數字呢? 我的意思是當你插入 6 時不是 (6-1) + (6-2) + 1 嗎?

誰能向我解釋如何解決這個問題? 我的老師還沒有談論這個,但我真的很想自己弄清楚,以便為下周的考試做好准備。

S(h) = S(h-1) + S(h-2) + 1

S(h)遞歸函數/公式 遞歸函數在其體內調用自身(以更小或更簡單的方式)。

請注意,遞歸函數必須具有一些基本情況,在這種情況下:

S(1) = 0
S(2) = 1

那么假設h = 6 ,則S(h = 6)將(僅替換):

S(6) = S(6-1) + S(6-2) + 1
S(6) = S(5) + S(4) + 1 
S(6) = 2*S(4) + S(3) + 1 + 1
S(6) = 2*(S(3) + S(2) + 1) + S(3) + 2
S(6) = 3*S(3) + 2*S(2) + 4
S(6) = 3*(S(2) + S(1) + 1) + 2*S(2) + 4
S(6) = 5*S(2) + 3*S(1) + 7
S(6) = 5*1 + 3*0 + 7
S(6) = 12

對於高度為6的樹,AVL樹中的最小節點數不是20,它應該是33.下面的等式應該演示N(h)函數的遞歸調用。

由於我們知道N(0)= 1,N(1)= 2,N(2)= 4,我們可以將以下等式減少到h = 6的這些知識。

公式N(h)= 1 + N(h-1)+ N(h-2)

N(3)= 1 + N(3-1)+ N(3-2)= 1 + N(2)+ N(1)= 7

N(4)= 1 + N(4-1)+ N(4-2)= 1 + N(3)+ N(2)= 12

N(5)= 1 + N(5-1)+ N(5-2)= 1 + N(4)+ N(3)= 20

N(6)= 1 + N(6-1)+ N(6-2)= 1 + N(5)+ N(4)= 33

我希望這可以幫到你

函數N(h)= 1 + N(h - 1)+ N(h - 2)

麻省理工學院復習04指出這個遞歸函數的基本情況是:N(1)= 1; N(2)= 2

因此

N(3)= 1 + N(2)+ N(1)= 1 + 2 + 1 = 4

N(4)= 1 + N(3)+ N(2)= 1 + 4 + 2 = 7

N(5)= 1 + N(4)+ N(3)= 1 + 7 + 4 = 12

N(6)= 1 + N(5)+ N(4)= 1 + 12 + 7 = 20

N(7)= 1 + N(6)+ N(5)= 1 + 20 + 12 = 33

N(8)= 1 + N(7)+ N(6)= 1 + 33 + 20 = 54

依此類推,只需從以前的答案中插入數字......

https://courses.csail.mit.edu/6.006/spring11/rec/rec04.pdf

只需快速注意上面的問題,AVL樹中高度為6的樹的最小節點數不是12,它應該是20.下面的等式應該演示S(h)函數的遞歸調用。

由於我們知道S(1)= 1,S(2)= 2,&S(3)= 4,我們可以將以下等式減少到這些已知的h = 6。

S(h) = S(h-1) + S(h-2) + 1
S(6) = S(5) + S(4) + 1                           // recursive S(5) & S(4)
S(6) = (S(4) + S(3) + 1) + (S(3) + S(2) + 1) + 1 // don't forget '+1'
S(6) = [(S(3) + S(2) + 1) + S(3) + 1] + (S(3) + S(2) + 1) + 1

// now sub in the values
S(6) = [(4 + 2 + 1) + 4 + 1] + (4 + 2 + 1) + 1
S(6) = 4 + 2 + 1 + 4 + 1 + 4 + 2 + 1 + 1
S(6) = 20

我希望這有幫助。 如果我忽略了什么,請告訴我!

您將S(h-1)S(h)-1混淆,第一個是高度為h-1的樹的(最小)尺寸,第二個是高度為h的樹的大小, 然后從那。

使用Fibonacci序列有兩種方式:第一種方法不太復雜,但效率不如第二種方式。 為了理解第二種方式你需要知道一些數學,我不會在這里解釋,除非你真的希望它或首先檢查wiki的一些答案:

public int findMinNodes(int h){
   if(h<0)
      return 0;
   int a=1;
   int b=2;
   int c;
   for(int i=1;i<h;i++){
      c=a+b+1;
      a=b;
      b=c;
      }
   return b;
}

第二種方式:

public static int findMinNodes(int h){
       return (int)(Math.round(((Math.sqrt(5)+2)/
            Math.sqrt(5))*Math.pow((1+
            Math.sqrt(5))/2,h)-1));
        }

注意:如果您嘗試使用非常大的輸入(例如h = 6000)的第二種方法,您的答案將顯示由數學方法引起的“無窮大”。

具有高度h的avl樹中的最小節點是其具有1或-1的平衡因子。 在那種avl樹中,一個子樹的高度為h-1,其他子樹的高度為h-2。 因此,我們計算不。 高度為h-1和h-2的樹的節點遞歸並加1。 添加1以計算前一樹的根節點。

這個問題有點老了,但我剛剛研究了這個主題,所以我可以提供一個詳細的答案。

如果您只想要答案:高度為 h 的 AVL 樹中節點的最小值是 f(h+2) - 1 其中 f 是斐波那契數列,定義如下: f(0) = 1, f(1) = 1、f(n+2) = f(n+1) + f(n)。

證明 :

我們可以通過遞歸證明以下兩個命題來證明這種關系:

設 s(n) 是高度為 n 的 AVL 樹中的最小節點數。

我們有:s(0) = 1, s(1) = 2, s(n+2) = s(n+1) + s(n) + 1。

命題 1:s(n) = f(0) + f(1) + f(2) + ... + f(n)

這可以很容易地通過遞歸來顯示:

首先,在等級 0 和 1,我們有: s(0) = f(0), s(1) = 2 = f(0) + f(1)

現在讓我們證明,如果命題在 n 和 n+1 級為真,那么它在 n+2 級為真:

s(n+2) = s(n+1) + s(n) + 1 [formula for s(n+2)]
       = (f(0) + f(1) + ... + f(n+1)) + (f(0) + f(1) + ... + f(n)) + 1 [apply Proposition 1 at rank n and n+1]
       = f(0) + ((f(1) + f(0)) + (f(2) + f(1)) + ... + (f(n+1) + f(n))) + 1 [rearrange the sums]
       = f(0) + (f(2) + f(3) + ... + f(n+2)) + 1 [apply f(n+2) = f(n+1) + f(n)]
       = f(0) + f(1) + (f(2) + f(3) + ... + f(n+2)) [f(1) = 1 and rearrange]
       = f(0) + f(1) + ... + f(n+2)

其中遞歸表明該屬性對於任何大於 0 的 n 都為真。

命題 2:f(n+2) - 1 = f(0) + f(1) + f(2) + ... + f(n)

這個證明留給讀者作為練習,但它的原理與前一個完全相同。

現在,通過連續應用道具 1 和 2: s(n) = f(0) + f(1) + ... + f(n) = f(n+2) - 1

斐波那契數列有一個通用表達式,因此我們可以將其應用於 n+2 以非常快速地計算任意高度的 AVL 樹中的最小節點數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM