雜湊的使用

2021-10-05 04:54:30 字數 1594 閱讀 1841

雜湊簡單來說:給n個正整數和m個負整數,問這m個數中的每個數是否在n**現過。

比如:n:,m,其中m的2在n**現過

對這個問題最直觀的思路是:對m中每個欲查的值x,都在n中遍歷一次,時間複雜度為 o(nm),但當n和m的值很大時,顯然無法承受

所以,我們可以設定乙個bool型資料 hashtable[100010],其中hashtable[x]== true 表示正整數x在n個正整數**現過,而hashtable[x]= false表示正整數x在n個正整數中沒有出現過。這樣就可以在一開始讀入n個正整數時就進行預處理,即當讀入的數為x時,就令hashtable[x] = true(說明: hashtable 陣列需要初始化為false,表示初始狀態下所有數都未出現過)。於是,對m個欲查詢的數,就能直接通過hashtable陣列判斷出每個數是否出現過。顯然這種做法的時間複雜度為o(n+m),**如下:

#include

const

int maxn=1;

//見註1 //maxn的值可以取大於0的任意數

bool hashtable[maxn]=;

//見註2

intmain()

for(

int i=

0;i)else

printf

("no\n");

}}

注1:/* const 允許指定乙個語義約束,編譯器會強制實

施這個約束,允許程式設計師告訴編譯器某值是保持不變的。如果在程式設計中確實有某個值保持不變,

就應該明確使用const,這樣可以獲得編譯器的幫助。即const是使這個值固定不再改變*/

注2:bool型別 為邏輯型,它的值只有true(1)和false(0)兩種值。

空間換時間,定義乙個bool型陣列hashtable[100010],其中hashtable[x]==true表示正整數x在n個正整數**現過。這樣就可以在一開始讀入n個正整數的時候就進行預處理。

同樣的,如果題目要求m個欲查詢的數中每個數在n個數**現的次數,那麼可以把nasttable陣列替換為int型,然後在輸入n個數時進行預處理,即當輸入的數為x時,就令nhashtable[x]++,這樣就可以用o(n + m)的時間複雜度輸出每個欲查詢的數出現的次數。**如下:

#include

const

int maxn=1;

/* const 允許指定乙個語義約束,編譯器會強制實

施這個約束,允許程式設計師告訴編譯器某值是保持不變的。如果在程式設計中確實有某個值保持不變,

就應該明確使用const,這樣可以獲得編譯器的幫助。*/

bool hashtable[maxn]=;

intmain()

for(

int i=

0;i)else

printf

("no\n");

}}

uthash雜湊的使用

做專案遇到需要使用到鍵值對的,一般我們會優先考慮map,multimap。最近在看cocos2d x原始碼,發現了乙個更高效的用法uthash 標頭檔案uthash.h在cocos2dx support data support 下可以找到 下面是乙個簡單的使用 include uthash.h i...

Yii redis hash雜湊的使用

redis 的雜湊可以讓使用者將多個鍵值對儲存到乙個 redis 鍵裡面。這裡介紹一些常用命令,以及在 yii 中的使用。hmget hmget hmget key name key key 從雜湊裡面獲取乙個或多個鍵的值。hmset hmset hmset key name key name ke...

雜湊表 Hashtable 的使用

hashtable 一,雜湊表 hashtable 簡述 在.net work中,hashtable是system.collections命名空間提供的乙個容器,用於處理和表現類似key 的鍵值對,其中key通常可用來快速查詢,同時key是區分大小寫 用於儲存對應於key的值。hashtable中k...