1. 程式人生 > >Python資料結構——AVL樹的基本概念

Python資料結構——AVL樹的基本概念

平衡二叉搜尋樹

在上一節中我們討論了建立一個二叉搜尋樹。我們知道,當樹變得不平衡時getput操作會使二叉搜尋樹的效能降低到O(n)。在這一節中我們將看到一種特殊的二叉搜尋樹,它可以自動進行調整,以確保樹隨時都保持平衡。這種樹被稱為AVL樹,命名源於其發明者:G.M. Adelson-Velskii 和 E.M. Landis。

AVL樹實現抽象資料型別Map就像一個普通的二叉搜尋樹,唯一不同的是這棵樹的工作方式。為實現我們的AVL樹我們需要在樹中的每個節點加入一個平衡因子並跟蹤其變化情況。我們通過比較每個節點的左右子樹的高度完成比較。更正式地講,我們定義一個節點的平衡因子為左子樹和右子樹的高度之差。

balanceFactor = height(leftSubTree)  height(rightSubTree)

利用以上對平衡因子的定義,如果平衡因子大於零,我們稱子樹“左重”(left-heavy)。如果平衡因子小於零,那麼子樹“右重”(right-heavy)。如果平衡因子為零,則樹是完全平衡的。為實現AVL樹,目的是得到一棵平衡的樹,我們定義平衡因子如果是 -1,0 或 1,那麼這棵樹是平衡的。一旦樹中節點的平衡因子超出了這個範圍,我們需要有一個把樹恢復平衡的過程。圖 1 是一個不平衡的“右重”樹的例子,其中每個節點都標註了平衡因子。

圖 1:一棵標註了平衡因子的不平衡的右重樹

AVL樹效能

在我們繼續進行之前讓我們看看引入這個新的平衡因子的結果。我們的要求是,確保樹上的平衡因子始終為 -1,0 或 1。我們可以通過對鍵的操作得到更好的時間複雜度。首先,我們要思考如何利用這個平衡條件去改變最壞情況下的樹。有兩種可能性需要考慮,左重樹和右重樹。如果我們考慮樹的高度為 0,1,2 和 3,圖 2 舉出了在新規則下可能出現的最不平衡的左重樹的例子。

圖 2:最壞情況下的左重AVL

讓我們看看樹上的節點的總數。我們看到一棵高度為 0 的樹有 1 個節點,一個高度為 1 的樹有 1 + 1 = 2 個節點,一個高度為 2 的樹有 1 + 1 + 2 = 4 個節點,一棵高度為 3 的樹有 1 + 2 + 4 = 7 個節點。概括起來,高度為h的樹的節點數(Nh)為:

N_h = 1 + N_{h-1} + N_{h-2}

可能你很熟悉這個公式,因為它和斐波那契序列非常相似。我們可以利用這個公式通過樹中的節點的數目推匯出一個AVL樹的高度。在我們的印象中,斐波那契數列與斐波那契數的關係為:

QQ圖片20160621101915 QQ圖片20160621101952QQ圖片20160621101952

這個推導過程告訴我們,在任何時候我們的AVL樹的高度等於樹中節點數以 2 為底的對數的常數(1.44)倍。這對我們搜尋AVL

樹來說是好訊息因為它限制了搜尋的複雜度到 O(logN)。

相關推薦

Python資料結構——AVL基本概念

平衡二叉搜尋樹 在上一節中我們討論了建立一個二叉搜尋樹。我們知道,當樹變得不平衡時get和put操作會使二叉搜尋樹的效能降低到O(n)。在這一節中我們將看到一種特殊的二叉搜尋樹,它可以自動進行調整,以確保樹隨時都保持平衡。這種樹被稱為AVL樹,命名源於其發明者:G.M. Ade

Python資料結構——AVL的實現

遞迴呼叫已到達樹的根。 父節點的平衡因子已調整為零。一旦子樹平衡因子為零,那麼父節點的平衡因子不會發生改變。 我們將實現 AVL 樹的子類BinarySearchTree。首先,我們將重寫_put方法,並寫一個新的輔助方法updateBalance。這些方法如Listing 1 所示。除了第 7 行和第

基本資料結構――堆的基本概念及其操作

     轉載自:https://www.cnblogs.com/JVxie/p/4859889.html,同時感謝大佬的分析       在我剛聽到堆這個名詞的時候,我認為它是一堆東西的集合       但其實吧它是利用

資料結構與演算法——基本概念與術語

概述  資料、資料元素、資料物件 資料(data)是對客觀事物的符號表示,在電腦科學中是指所有能輸入到計算機中並被計算機程式處理的程式的總稱。 資料元素(data element)是資料的基本單位,在計算機程式中通常作為一個整體進行考慮和處理。一個數據元素可由若干個資料項(data ite

資料結構基礎01-基本概念和術語/線性表

本文系列 資料結構基礎01-基本概念和術語/線性表 資料結構基礎02-棧和佇列 基本概念和術語 資料(data): 所有能輸入到計算機中去的描述客觀事物的符號。 數值性資料 非數值性資料(多媒體資訊處理) 資料元素(data element): 資

資料結構知識整理 - 基本概念 + 線性表查詢演算法

主要內容 基本概念 線性表的查詢 順序查詢(Sequential Search) 折半查詢(Binary Search) 分塊查詢(Blocking Search) 基本概念 在介紹查詢演算法前我們先重溫幾個重要概念: 1)資料:客觀事物的符號表示

MOOC浙江大學 資料結構 第一講 基本概念

1.2 什麼是演算法? 1.1 例3 double f(int n,double a[],double x) { int i; double p=a[0]; for(i=1;i<=n;i++)  p += (a[i]*pow(x,i)); return p

Python資料結構——解析的遍歷

解析樹 完成樹的實現之後,現在我們來看一個例子,告訴你怎麼樣利用樹去解決一些實際問題。在這個章節,我們來研究解析樹。解析樹常常用於真實世界的結構表示,例如句子或數學表示式。 圖 1:一個簡單句的解析樹 圖 1 顯示了一個簡單句的層級結構。將一個句子表示為一個樹,能使我們通過利用子樹來處理句子中的每個獨立的

資料結構——AVL

    AVL樹是最早提出的自平衡二叉樹,在AVL樹中任何節點的兩個子樹的高度最大差別為一,即|HL-HR|<=1,所以它也被稱為高度平衡樹。AVL樹得名於它的發明者G.M. Adelson-Velsky和E.M. Landis,他們在1962年的論文《An a

資料結構-----AVL的插入刪除操作

對於AVL的插入和刪除,主要利用的就是上篇文章所述的四種旋轉操作,根據插入後不同的結構選用不同的方式復原平衡。 再次宣告一下,http://www.cnblogs.com/QG-whz/p/5167238.html這篇文章講解的比較好,我也是從連結處的大神那學習的,這裡只用

Python資料結構——基本概念

我們已經學過了像棧和佇列這樣的線性資料結構,同時我們對遞迴也有了一定的瞭解,現在讓我們來看看另一種常見的資料結構——樹(Tree)。樹在計算機科學裡應用廣泛,包括作業系統,圖形學,資料庫和計算機網路。樹和真正的樹有許多相似的地方,也包括根、樹枝和葉子,它們的不同在於計算機中的樹的根在頂層而它的葉子在底部。

資料結構--基本概念

樹是一種非線性的資料結構,是由n(n >=0)個結點組成的有限集合。n=0時稱為空樹 (1)每個元素稱為結點(node); (2)有一個特定的結點被稱為根結點或樹根(root)。 (3)除根結點之外的其餘資料元素被分為m(m≥0)個互不相交的集合T1,T2,……T

資料結構----AVL平衡----AVL平衡基本操作

一、二叉查詢樹 我們先來講講二叉查詢樹。 大家應該聽說過二分查詢吧,二分查詢是對一個有序序列的快速查詢,時間複雜度為O(log2(n)), 但是二分查詢也有它的缺點,當序列加入一個元素時,我們就需要對這個有序序列進行維護,要麼就用sort(),要麼就用插入排序(附帶大量的資

java資料結構與演算法之基本概念及二叉(BinaryTree)的設計與實現

關聯文章:   樹博文總算趕上這周釋出了,上篇我們聊完了遞迴,到現在相隔算挺久了,因為樹的內容確實不少,博主寫起來也比較費時費腦,一篇也無法涵蓋樹所有內容,所以後續還會用2篇左右的博文來分析其他內容大家就持續關注吧,而本篇主要了解的知識點如下(還是蠻多

python 資料結構與演算法 day05 二叉的深度優先遍歷(縱向)

1. 二叉樹深度優先遍歷三種方式   不同於樹的廣度優先遍歷(一層一層的走,同一層從左到右走完開始走下一層的橫向遍歷方式),深度優先遍歷是一條路走到黑,然後再走下一條;    先序遍歷:根節點--左子節點---右子節點(先從根節點開始,走左子樹,對這個左子樹依然按照根節點

Python資料結構——二叉排序

二叉排序樹的過程主要是:二叉樹的構建和遍歷。 當樹構建好後,對樹進行中序遍歷(左中右),即可得到,對資料從小到大排序的結果。 如果對樹進行“右中左遍歷”,則可以得到,對資料從大到小排序的結果 # -*- coding:utf-8 -*- # file: pySort.py #

Python資料結構——二叉的遍歷(先根,中根,後根)

先序遍歷:根左右 中序遍歷:左根右 後序遍歷:左右根 # -*- coding:utf-8 -*- # file: TreeTraversal.py # class BTree: # 二叉樹節點 def __init__(self, value):

Python資料結構--遍歷演算法

1 ''' 2 遍歷是訪問樹的所有節點的過程,也可以列印它們的值。 因為所有節點都通過邊(連結)連線,所以始終從根(頭)節點開始。 3 也就是說,我們不能隨機訪問樹中的一個節點。 這裡介紹三種方式來遍歷一棵樹 -順序遍歷 -前序遍歷 -後序遍歷 4 ''' 5 6 7 class No

資料結構&堆的概念:持續編輯中

樹---|---:由 一個根結點 和 N個子結點 及 連線線 構成,任意結點間不構成迴路        |---二叉樹---|---:樹的一種,且任意結點最多隻能有兩個子結點        |     &n

python資料結構之二叉

這裡用python 實現了二叉樹 # Definition for a binary tree node. class TreeNode: def __init__(self, x): self.val = x self.left =