字典的兩種描述方法:跳表和雜湊(hash)
限制適用範圍:有序陣列
採用雜湊技術將記錄儲存在一塊連續的儲存空間中,這塊連續的儲存空間愛你被稱為雜湊表或者雜湊表。
雜湊技術是在記錄的儲存位置和他的關鍵字之間建立乙個確定的對應關係f(雜湊函式),使得每個關鍵字key對應乙個儲存位置f(key),根據這個對應關係找到給定值key的對映f(key),如果查詢集合中存在這個記錄,則必定在f(key)的位置上。
最常用的除法對映:f(k)=k%d
k是關鍵字,d是雜湊表的大小,f(k)對應為雜湊位址
hash:把任意長度的輸入(預對映pre-image),通過雜湊演算法變成固定長度的輸出,該輸出就是雜湊值,這是一種壓縮對映,雜湊值的空間通常遠遠小於輸入的空間,不同的輸入可能會被雜湊成相同的輸出,因此不能從雜湊值來唯一的確定輸入值。
hash就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要函式。
應用領域:資訊保安領域的加密演算法(如不同長度的資訊被轉換成雜亂無章的128位編碼值)
線性表、樹、圖等結構,其中的資料元素之間存在某種邏輯關係。可以連線圖示比奧斯,而雜湊技術的記錄之間不存在邏輯關係,只是和關鍵字相關。雜湊技術既是一種儲存方法也是一種查詢方法。
雜湊主要是面向查詢的儲存結構,最適合查詢與給定值相等的記錄,
不適合範圍:查詢和乙個關鍵字對應很多記錄的查詢,最大值最小值查詢,記錄的排序,限制範圍查詢
原來的關鍵字-------依據某種規律變成另一組數字
直接定址法--線性條件
數字分析法---關鍵字的位數較大,且關鍵字的若干位分布較均勻
平方取中法---關鍵字分布未知,位數不大
摺疊法 ----關鍵字分布未知,位數較多
隨機數法------關鍵字長度不等時比較合適
除留餘數法----關鍵在於選擇合適的p,雜湊表表長為m,通常m為小於或者等於表長(最好接近)的最小指數或不包含小於20質因數的合數
雜湊函式選擇需要考慮的因素:
計算雜湊位址所需要的時間
關鍵字的長度
雜湊表的大小
關鍵字的分布情況
記錄查詢的頻率
雜湊衝突的處理:
開放定址法 一旦發生衝突,就去尋找下乙個空的雜湊位址,只要雜湊表足夠大,空的雜湊位址總能被找到,記錄會被存入。是一種線性探測的方法
再雜湊函式法
鏈位址法 在當前位置給單鏈表增加節點
公共溢位區法 衝突的關鍵字放在另外的公共溢位區來存放
雜湊表查詢演算法實現:
hashtable就是雜湊表結構、elem是乙個動態陣列
#define success 1
#define unsuccess 0
#define hashsize 12 //雜湊表長是陣列的長度
#define nullkey -32768
typedef struct
hashtable;
int m=0;//雜湊表表長 全域性變數
status inithashtable(hashtable *h)
//雜湊函式
int hash(int key)
//插入關鍵字進行雜湊表
void inserthash(hashtable *h,int key)
//查詢關鍵字
status searchhash(hashtable h,int key,int *addr)
} return success; }
字元雜湊基礎知識
定義 字串雜湊,最著名的就是bkdrhash,也就是將字串變成數值,並且最後變成的數值是乙個p進製的數,一般來說p最好為素數.p常見的是131和13331,這是兩個經驗值,出錯率極低。str i 字元陣列 h i 存str 1.i 的雜湊值 p i 存base的i次冪的值 如果h i 和p i 取u...
Hash 雜湊 雜湊
hash 一種用於查詢的資料結構 雜湊查詢的前提是已經一定的規則方法建好了雜湊表。基本思想是 關鍵字 位址轉換法 以資料物件的關鍵字為自變數,通過乙個確定的函式關係h,計算出對應的函式值h key 把這個值解釋為資料物件的儲存位址,並按此存放,即儲存位置 h key 關鍵 1.構造好的雜湊函式 2....
雜湊(hash)知識總結
雜湊是常用的演算法思想之一 應用如,給出n個正整數,再給出m個正整數 問 m個數中的每個數是否在n個數中出現過 如果n,m 10 5,可以用遍歷來做,但時間複雜度很大 這時就可以用空間換時間 即設定乙個bool型陣列hash table 100010 這樣在一開始讀入n個正整數時就進行預處理 inc...