hash海量資料查詢的乙個實現 週末練手

2021-06-14 16:31:34 字數 2848 閱讀 3441

前言:閒來蛋疼,週末在家陪老婆,中午還要親自操廚,操廚之前,加深下對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 ...