演算法名稱
平均時間複雜度
雜湊表查詢
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,那麼它就是一棵平衡二叉樹。看到題目,第一時間看到二叉樹的深度定義為 從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。具體可以去看二叉樹的深度 當學會了如何求...