編譯處理時候涉及到變數及屬性的管理,動態查詢管理
插入:新變數
查詢:變數的引用
如果利用查詢樹(搜尋樹)進行變數管理:
兩個變數名(字串)比較效率不高
目前已經知道的幾種查詢方法:
順序查詢 o(n)
二分查詢 o(log2 n) 提前排序
二叉搜尋樹 o(h)h為樹的高度
平衡二叉樹 o(log2 n)
如果根據物件算出物件的位置,那麼插入、查詢、刪除時間複雜度幾乎為o(1),這就是要介紹的雜湊表
雜湊表的兩個重點:
計算物件的位置:雜湊函式
衝突的解決策略:解決多個物件落在同一位置的情況
以下來自網路
雜湊函式能使對乙個資料序列的訪問過程更加迅速有效,通過雜湊函式,
資料元素將被更快地定位。
實際工作中需視不同的情況採用不同的
雜湊函式,通常考慮的因素有:
· 計算
雜湊函式所需時間
· 關鍵字的長度
· 雜湊表的大小
· 關鍵字的分布情況
· 記錄的查詢頻率
1.直接定址法:取關鍵字或關鍵字的某個線性函式值為雜湊位址。即h(key)=key或h(key) = a·key + b,其中a和b為常數(這種
雜湊函式叫做自身函式)。若其中h(key)中已經有值了,就往下乙個找,直到h(key)中沒有值了,就放進去。
2. 數字分析法:分析一組資料,比如一組員工的出生年月日,這時我們發現出生年月日的前幾位數字大體相同,這樣的話,出現衝突的機率就會很大,但是我們發現年月日的後幾位表示月份和具體日期的數字差別很大,如果用後面的數字來構成雜湊位址,則衝突的機率會明顯降低。因此數字分析法就是找出數字的規律,盡可能利用這些資料來構造衝突機率較低的雜湊位址。
3. 平方取中法:當無法確定關鍵字中哪幾位分布較均勻時,可以先求出關鍵字的平方值,然後按需要取平方值的中間幾位作為雜湊位址。這是因為:平方後中間幾位和關鍵字中每一位都相關,故不同關鍵字會以較高的概率產生不同的雜湊位址。
[2]例:我們把英文本母在字母表中的位置序號作為該英文本母的內部編碼。例如k的內部編碼為11,e的內部編碼為05,y的內部編碼為25,a的內部編碼為01, b的內部編碼為02。由此組成關鍵字「keya」的內部**為11052501,同理我們可以得到關鍵字「kyab」、「akey」、「bkey」的內部編碼。之後對關鍵字進行平方運算後,取出第7到第9位作為該關鍵字雜湊位址,如下圖所示
關鍵字
內部編碼
內部編碼的平方值
h(k)關鍵字的雜湊位址
keya
11050201
122157778355001
778
kyab
11250102
126564795010404
795
akey
01110525
001233265775625
265
bkey
02110525
004454315775625
315
[2]
4. 摺疊法:將關鍵字分割成位數相同的幾部分,最後一部分位數可以不同,然後取這幾部分的疊加和(去除進製)作為雜湊位址。數字疊加可以有移位疊加和間界疊加兩種方法。移位疊加是將分割後的每一部分的最低位對齊,然後相加;間界疊加是從一端向另一端沿分割界來回摺疊,然後對齊相加。
5. 隨機數法:選擇一
隨機函式,取關鍵字的隨機值作為雜湊位址,通常用於關鍵字長度不同的場合。
6. 除留餘數法:取關鍵字被某個不大於
雜湊表表長m的數p除后所得的餘數為雜湊位址。即 h(key) = key mod p,p<=m。不僅可以對
關鍵字直接取模,也可在摺疊、平方取中等運算之後取模。對p的選擇很重要,一般取素數或m,若p選的不好,容易產生同義詞。
[3]
1. 開放定址法:hi=(h(key) + di) mod m,i=1,2,…,k(k<=m-1),其中h(key)為
雜湊函式,m為
雜湊表長,di為增量序列,可有下列三種取法:
1.1. di=1,2,3,…,m-1,稱線性探測再雜湊;
1.2. di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k<=m/2)稱二次探測再雜湊;
1.3. di=
偽隨機數序列,稱偽隨機探測再雜湊。
2. 再
雜湊法:hi=rhi(key),i=1,2,…,k rhi均是不同的
雜湊函式,即在同義詞產生位址衝突時計算另乙個雜湊函式位址,直到衝突不再發生,這種方法不易產生「聚集」,但增加了計算時間。
3. 鏈位址法(拉鍊法)
4. 建立乙個公共溢位區
後面將用c語言實現上面各種不同衝突策略的情況,並理論分析各自效能
雜湊表簡介
雜湊表又名雜湊表,其主要目的是用於解決資料的快速定位問題。考慮如下乙個場景。一列鍵值對資料,儲存在乙個table中,如何通過資料的關鍵字快速查詢相應值呢?不要告訴我乙個個拿出來比較key啊,呵呵。大家都知道,在所有的線性資料結構中,陣列的定位速度最快,因為它可通過陣列下標直接定位到相應的陣列空間,就...
雜湊表簡介
一 雜湊表 hashtable 簡述 在.net framework中,hashtable是system.collections命名空間提供的乙個容器,用於處理和表現類似key value的鍵值對,其中key通常可用來快速查詢,同時key是區分大小寫 value用於儲存對應於key的值。hashta...
雜湊表簡介
雜湊表的c 實現 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演...