資料結構hash總結一:理論學習篇
資料結構hash總結二:程式學習篇
資料結構hash總結三:實踐基礎篇
資料結構hash總結四:程式高階篇
資料結構hash總結五:nginx中的hash(version 0.1)
零、學習方法
簡要學習理論篇,進入程式學習篇,再回頭學習理論篇和實踐篇
一、基本概念
1.hash定義
hash定義:將任意長度的
輸入,通過雜湊演算法,變成固定長度的
輸出,該輸出就是雜湊值。
hash函式:就是一種將任意長度的訊息壓縮到某一固定長度的訊息摘要的函式。
hash表:一種資料結構,既滿足了資料的查詢方便,同時不占用太多的內容空間。
2.hash用途
1)雜湊主要用於資訊保安領域中的加密演算法,把一些不同長度的資訊轉化成雜亂的128位的編碼。
2)在海量資料處理中有廣泛應用。
3.常見的hash函式(雜湊演算法)
1)除法雜湊法
2)平方雜湊法
3)斐波那契雜湊法
4.hash表介紹
hash表本質:歸類方法。
hash表:一種新的資料結構,兼有陣列的易定址和鍊錶的易插入和刪除的特點。
hash表形象描述:如果有一堆書,就如同鍊錶及線性表一樣,雜亂無序,查詢起來十分麻煩;
如果進行編號,採用二分法,很快就可以查到
如果可以按照工科、理科、文科進行分類,就可以更快的查到。
hash表的實現:有多種實現,最常用的是拉鍊法。
5.舉例說明hash函式
在下面這乙個字串hash函式中,通過遍歷字串,經過表示式hash = 31*hash +*p,迴圈計算得到hash值。
很多hash函式都是如此操作,只是其表示式(雜湊演算法)有所不同。
unsigned int yk_******_hash(char *str,int str_len)
二、衝突相關
1.衝突定義在關鍵字得到的雜湊位址上已經有記錄,那麼就稱之為衝突
2.處理衝突:就是為該關鍵字的記錄扎到另乙個「空」的雜湊位址。即在處理雜湊位址的衝突時,若得到的另乙個雜湊位址h1仍然發生衝突,則再求下乙個位址h2,若h2仍然衝突,再求的h3,直至hk不發生衝突為止,則hk為記錄在表中的位址。
處理衝突的方法:
1)開放定址法
hi=(h(key) + di) mod m i=1,2,...k(k<=m-1)
其中h(key)為雜湊函式;m為雜湊表表長;di為增量序列。有3中增量序列:
1)線性探測再雜湊:di=1,2,3,...,m-1
2)二次探測再雜湊:di=1^2,-1^2,2^2,-2^2,....+-k^2(k<=m/2)
3)偽隨機探測再雜湊:di=偽隨機數序列
缺點:我們可以看到乙個現象:當表中i,i+1,i+2位置上已經填有記錄時,下乙個雜湊位址為i,i+1,i+2和i+3的記錄都將填入i+3的位置,這種在處理衝突過程中發生的兩個第乙個雜湊位址不同的記錄爭奪同乙個後繼雜湊位址的現象稱為「二次聚集」,即在處理同義詞的衝突過程中又新增了非同義詞的衝突。但另一方面,用線性探測再雜湊處理衝突可以保證做到:只要雜湊表未填滿,總能找到乙個不發生衝突的位址hk。而二次探測再雜湊只有在雜湊表長m為形如4j+3(j為整數)的素數時才可能。
即開放定址法會造成二次聚集的現象,對查詢不利。
2)再雜湊法
hi = rhi(key),i=1,2,...k
rhi均是不同的雜湊函式,即在同義詞產生位址衝突時計算另乙個雜湊函式位址,直到不發生衝突為止。這種方法不易產生聚集,但是增加了計算時間。
缺點:增加了計算時間。
3)鏈位址法(拉鍊法)
將所有關鍵字為同義詞的記錄儲存在同一線性鍊錶中。
4)建立乙個公共溢位區
假設雜湊函式的值域為[0,m-1],則設向量hashtable[0...m-1]為基本表,每個分量存放乙個記錄,另設立向量overtable[0....v]為溢位表。所有關鍵字和基本表中關鍵字為同義詞的記錄,不管他們由雜湊函式得到的雜湊位址是什麼,一旦發生衝突,都填入溢位表。
拉鍊法的優點:
①拉鍊法處理衝突簡單,且無堆積現象,即非同義詞決不會發生衝突,因此平均查詢長度較短;
②由於拉鍊法中各煉表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
③開放定址法為減少衝突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鍊法中可取α≥1,且結點較大時,拉鍊法中增加的指標域可忽略不計,因此節省空間;
④在用拉鍊法構造的雜湊表中,刪除結點的操作易於實現。只要簡單地刪去鍊錶上相應的結點即可。而對開放位址法構造的雜湊表,刪除結點不能簡單地將被刪結 點的空間置為空,否則將截斷在它之後填人雜湊表的同義詞結點的查詢路徑。這是因為各種開放位址法中,空位址單元(即開放位址)都是查詢失敗的條件。因此在 用開放位址法處理衝突的雜湊表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點
拉鍊法的缺點:
拉鍊法的缺點是:指標需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,而若將節省的指標空間用來擴大雜湊表的規模,可使裝填因子變小,這又減少了開放定址法中的衝突,從而提高平均查詢速度
三.查詢:
從雜湊表的查詢過程可見:
1)雖然雜湊表在關鍵字與記錄的儲存位置直接建立了直接映像,但是由於「衝突」的產生,使得雜湊表的查詢過程仍然是乙個給定值和關鍵字進行比較的過程。因此仍需以平均查詢長度作為衡量雜湊表的查詢效率的量度。
2)查詢過程中需和給定值進行比較的關鍵字的個數取決於下列三個因素:雜湊函式,處理衝突的方法和雜湊表的裝填因子。
在一般情況下,處理衝突方法相同的雜湊表,其平均查詢長度依賴於雜湊表的裝填因子。
裝填因子=(表中填入的記錄數)/(雜湊表的長度). 裝填因子越小,發生衝突的可能性就越小;反之,裝填因子越大,表中已經填入的記錄越多,再填記錄時,發生衝突的可能性就越大,則查詢時,給定值需與之進行比較的關鍵字的個數也就越多。
四 關於hash使用與學習
首先一定要明白hash表的拉鍊法。因為很多應用都是採用hash表的拉鍊法。對於拉鍊法,我們可以理解為是乙個鍊錶的陣列。1)陣列的每乙個元素都是乙個鍊錶。2)乙個鍊錶中的所有結點都具有相同的hash值,其hash值就是這個陣列元素的下標。
其次,要學會hash表初始化、插入元素、查詢元素三大操作。
CMMI理論學習(一)
以前斷斷續續看過一些cmmi的書,但是那都是純理論,應用起來並不是那樣的概念,最近遇到乙個hp的cmmi的諮詢師,由於工作的關係經常能討論cmmi的一些過程,所以漸漸對cmmi的理論有了更明確的認識。今天的一點學習心得是關於過程的一些術語,和hp諮詢師交流時,他滿嘴的都是英文的縮寫,經常讓我聽的雲裡...
軟體測試理論學習 一
glenford j.myers提出 bill hetzelt在 軟體測試完全指南 中指出 軟體測試的目的不僅僅是為了發現軟體缺陷與錯誤,同時也對軟體進行度量和評估,提高軟體質量。現對軟體測試的目的總結為以下三點 以最少的人力 物力 時間找出軟體中潛在的各種錯誤和缺陷,通過修正錯誤和缺陷提高軟體質量...
資料結構HASH總結二 程式學習篇
在理論學習篇中,我提到要學會hash表初始化 插入元素 查詢元素三大操作。在介紹三大操作之前,首先介紹所用到的資料結構。一 資料結構 1.hash表的結構 接下來介紹的都是hash表的拉鍊法。有兩種hash表的結構,推薦使用結構二。詳細說明見下面。結構一 hash table typedef str...