演算法學習 查詢(雜湊,二叉樹,二分,順序)

2021-09-13 20:38:11 字數 1370 閱讀 3458

演算法名稱

平均時間複雜度

雜湊表查詢

o(1)

二叉排序樹

o(logn)

二分查詢法

o(logn)

順序查詢

o(n)

說明:文中value表示需要雜湊的值,key表示值在雜湊表的位置

雜湊表採用函式對映的思想將關鍵字和儲存位置關聯起來,如f(value)=key.其查詢、插入,刪除的演算法複雜度均可在常量時間內實現。

選擇的雜湊函式是盡可能使雜湊值產生均勻分布。常用的方法:

直接定址法

尋找 key和value的某個現行函式,如:key=a*value+b的形式。雜湊表的大小由value中的最大值和最小值差值決定。例如value=,我們選取的對映關係可以是-key=value-100.

平均取中法

對value進行平方運算,然後去平方值中間的幾位作為hash位址。如value=,平方之後結果為,取中間兩位.

除留取餘法

如果雜湊表的最大長度為m,可取不大於m的最大質數p,然後對關鍵字進行取餘運算,key=value%p.

摺疊法將value值拆分成幾部分,然後將這幾部分組合在一起,以特定方式組合。

雜湊表的大小涉及到產生衝突的機率和資源的有效利用,雜湊表過大會造成較大的空間浪費,過小,產生衝突的機率就會變大(粥少僧多)。在提到雜湊表的大小時不得不提乙個概念:

填裝因子=記錄數/hash表表上

填裝因子越小產生衝突的機會越小,但是取值過小,則會造成較大的空間浪費。

其次,確保hash表的大小時乙個素數。原因是除留取餘法中,除以乙個素數,會產生最分散的餘數。(此塊內容有待學習)。

開放位址法

當乙個關鍵字和另外乙個關鍵字發生衝突時,使用某種探測列表依次向後查詢,直到遇到第乙個空位置時插入。

鏈位址法

如果發生衝突,將相同位址的記錄儲存在乙個鍊錶中。如下圖:

二叉排序樹的特點:左子樹上的節點值都均小於根節點,右子樹上的節點均大於根節點的值,其中,左右子樹又分別是二叉排序樹。對二叉排序樹進行中序遍歷剛好是遞增序列。構造的乙個bst示例:

這是自己掌握最早的乙個演算法,這是看乙個電視節目學會的,好懷念~~

二分查詢法針對乙個有序序列,例如對於遞增序列,取得中間值mvalue,如果檢索的值value大於mvalue,則檢索中間值右邊部分;如果小於中間值,則檢索左邊的部分。

做常規的檢索方式,從頭到尾乙個乙個檢索。

查詢演算法 順序查詢 二分查詢 二叉樹查詢 演算法

package lengreen.struct.other import lengreen.struct.strategy import lengreen.struct.impl.binarytreenode import lengreen.struct.impl.integerstrategy i...

演算法學習 二叉樹

概念 樹中的元素叫做節點 連線相鄰的節點之間的關係叫父子關係 節點a節點是b節點的父節點,b節點是a節點的子節點。c,d單個節點的父節點是同乙個節點,所以他們互稱為兄弟節點 把沒有父節點的節點叫做根節點 沒有子節點的節點叫做葉子節點或者葉節點 樹節點的高度 節點到葉子節點的最長路徑 邊數 節點的深度...

演算法學習 平衡二叉樹

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。看到題目,第一時間看到二叉樹的深度定義為 從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。具體可以去看二叉樹的深度 當學會了如何求...