雜湊(hash)
雜湊是以常數平均時間執行插入,刪除,查詢的技術;需要元素之間比較,排序的資訊,如查詢最大,最小值等等操作不被hash所支援;
雜湊表關鍵的是設計雜湊函式,運算簡單並且在單元之間均勻的分配關鍵字,並減少碰撞;
1//分離連線雜湊表的型別宣告
2#ifndef _hashsep_h34
struct
listnode;
5 typedef struct listnode *position;
6struct
hashtbl;
7 typedef struct hashtbl *hashtable;
89 hashtable initializetable(int
tablesize);
10void
destroytable(hashtable h);
11position find (elementtype key,hashtable h);
12void
insert(elementtype key,hashtable h);
13elementtype retrieve(position p);
1415
#endif /*_hashtable_h宣告*/
1617
struct
listnode18;
2223
typedef position list;
2425
struct
hashtbl26;
3031
//初始化
32 hashtable initializetable(int
tablesize)
3341
//分配hash表
42 h=malloc(sizeof(struct
hashtbl));
43if(h==null)
4447 h->tablesize=nextprime(tablesize);//
設定表的大小為以素數;
48//
分配鍊錶陣列
49 h->thelists=malloc(sizeof(list)*h->tablesize);
50if(h->thelist==null)
51 fataerro("
out of space");
52//
分配頭結點
53for(i=0;itablesize;i++)
5461
return
h;62}63
//分散鏈結表的find操作
64position find (elementtype key,hashtable h)
6574
//分散鏈結表的insert操作
75void
insert(elementtype key,hashtable h)
7692
}93 }
開放定址法
常用的衝突解決的方法:線性探測法,平方探測法,雙雜湊(兩個雜湊函式)
定理:如果使用平方探測,且表的大小是素數,那麼當表至少有一半是空的時候,總能夠插入乙個新的元素。
對於使用平方探測的開放定址雜湊法,如果表的元素填的太滿,那麼操作的執行時間將開始消耗過長,且insert操作可能失敗。這可能發生在有太多的移動和插入場合,此時解決的方法是建立另外乙個大約兩倍大的表,掃瞄整個原始雜湊表,計算每個元素的新雜湊錶值並將其插入到新錶中;此時產生了再雜湊。
小結:
雜湊表可以用來以常數時間實現insert和find操作。當使用雜湊表時,注意諸如裝填因子細節特別重要;
對於開放定址法:除非完全不可避免,否則裝填因子應該不超過0.5.如果使用線性探測,那麼效能隨著裝填因子接近於1將急速下降;
再雜湊運算可以通過使表增長(收縮)來實現,這樣將會保持合理的裝填因子;
使用雜湊表可以不可能找出最小元素。除非準確知道乙個字串,否則雜湊表也不可能有效查詢它。二叉查詢樹可以迅速找到在一定範圍內的所有項,雜湊表是做不到的。。
如果不需要有序的資訊以及對輸入的排序,那麼就應該使用雜湊表;
雜湊表的典型用途:1)、編譯器使用雜湊表跟蹤源**中宣告的變數。這種資料結構叫做符號表,2)在為遊戲編制的程式中。當程式搜尋不同的行時,它跟蹤通過計算基於位置的雜湊函式而看到一些位置。如果同意的位置再出現。程式通常通過簡單移動變換來避免昂貴的重複計算。遊戲程式的這種一般特點叫做交換表。
資料結構與演算法分析筆記(4) 遞迴
簡單來說,遞迴 recursion 就是程式簡單呼叫自身的技巧。乙個過程或 函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把乙個大型複雜的問題層層轉化為乙個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的 量。遞迴的能力...
資料結構與演算法學習筆記4
一 陣列 array 是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。a i address base address i data type size 注 data type size 表示陣列中每個元素的大小 陣列和鍊錶的區別 鍊錶適合插入 刪除,時間複雜度 o 1...
資料結構與演算法分析 學習筆記 6
排序 插入排序 1 void insertionsort elementtype a,intn 2 12 由於巢狀迴圈每一次花費n次迭代,因此插入排序時間為o n2 逆序 指數組中具有性質ia j 的序偶 a i a j 逆序的個數正好是插入排序執行的交換次數。因為交換兩個不安原序排列的相鄰元素恰好...