前言:閒來蛋疼,週末在家陪老婆,中午還要親自操廚,操廚之前,加深下對hash的理解,寫下此篇。
正文:本篇文章主要模擬了海量搜尋過程。從txt檔案獲取大量資料資訊(模擬海量),建立hash表,然後輸入關鍵字(字串),能迅速定位要找的value。其實就是搜尋某個特定的字串。具體會貼出**,和驗證圖。整個過程模擬了海量查詢的過程,能切實感覺到hash 海量處理的優勢。
先貼幾張執行效果圖:
圖 1
圖 2圖 2 最後一行,顯示了要查詢字串的位置。如下圖,藍色部分。
網上先搜尋了一番,發現要麼就是理論一堆,要麼就是貼出關鍵**,讓我等菜鳥始終沒法體會海量的涵義。
hash 的主要作用就是快速查詢,其時間複雜度是o(1),是最好的查詢演算法。對於hash的入門級別可參考我的一篇其他博文資料結構-練習2 雜湊表。hash的最基本理解就是:根據要查詢的字串的ascii(經過變換處理),通過雜湊函式,轉換成與其儲存位置的下標,這樣在hash表建立以後,我們就可以根據字串本身,以相同的雜湊函式對映方式迅速定位到其位置,然後查詢出相關資訊。 雜湊函式的構造就成為了最重要的任務之一,常見的方法有:直接取址法,平方取中法,除留餘數法,數字分析法,摺疊法,隨機數法。
基本原理為:h(key)=key%mod,mod 為小於表長的乙個數,本例子為1024.
結合**具體分析(sdbm法):
int sdbmhash(char* str)
return (hash & 0x7fffffff);
}
最後別忘了求餘數:key=key%hashtablelen;//hashtablelen=1024,key就是sdbmhash的返回值。
如圖,左邊為:第一次獲得的key的位置,顯然,兩個不同的字串很可能有相同的key,這時我們在後面加個鍊錶儲存一下。
**如:
p=&hasht[key];
while(p->next!=null) p=p->next;
貼完整個程式的**:
#include#include#includeusing namespace std;
const unsigned int num=5000;
const int hashtablelen=1024;
int count=0;//用於記錄hash對映時,發生的次數,驗證作用
struct hashnode
hashnode(char* key,unsigned int value)
}hasht[hashtablelen] ;// 雜湊表的長度為1024,所以取摸的時候用1024;
unsigned int elfhash(char* s);//declare the function
void createstrtxt();
void establishhat();
void findstr(char*);
int main()
int sdbmhash(char* str)
return (hash & 0x7fffffff);
}unsigned int elfhash(char *s)
}return hash & 0x7fffffff;
}void createstrtxt()
else//衝突處理
}} }
void findstr(char* str)
else
else
if(p==null) printf("sorry!字串沒有匹配的");
} }
}
說明:函式 findstr(char*)主要是查詢特定的字串,原理與構造hash函式的過程一樣。注意的是:寫入函式引數中的字串,不應該含有轉義符,因為轉義符號,程式可能不認識,所以,在txt裡選乙個沒有轉移符號的作為引數,如本例。
海量資料查詢唯一資料問題
常見的問題有以下幾類 問題一 有101個數,為 1,100 之間的數,其中乙個數是重複的,如何尋找這個重複的數,其時間複雜度和空間複雜度是多少?方法 利用和 sum1 1 2 3 99 sum2 a 0 a 1 a 99 sum2 sum1 重複的那個值 int onlyonerepeate int...
SQLBrite 乙個響應式的資料查詢框架
稀土掘金,這是乙個針對技術開發者的乙個應用,你可以在掘金上獲取最新最優質的技術乾貨,不僅僅是android知識 前端 後端以至於產品和設計都有涉獵,想成為全棧工程師的朋友不要錯過!observable query users db createquery user select from user ...
從海量資料中查詢乙個數
題目 給出40億個不重複的unsigned int的整數,沒排過序,再給乙個指定的數,判斷這個數是否在那40億個數 中 存在?方案一 申請512mb的記憶體,利用位圖,乙個bit代表乙個unsigned int的值,讀入這40億個數,設定相應的位,存在的設定為1,不存在的設定為0,然後我們只需要o ...