雜湊函式與層級結構資料

2021-07-29 22:48:04 字數 1981 閱讀 5509

近兩天在溫習資料結構時,對雜湊函式與樹結構資料處理優化有些想法。

首先看看雜湊函式的定義:在資料元素的關鍵字與該元素的儲存位置之間建立一種對應關係,將這種關係稱為雜湊函式(hash function)。

例如,雜湊表(hash table,也叫雜湊表),就是採用雜湊函式將元素資料對映成資料或鍊錶的儲存位置實現的,hashmap類似,只是對映結果是key不是位置。

期待c++標準庫直接支援hashtable/hashmap/hashset的容器。

1、深化樹層級

場景設想,目前我們有組物件,他們都有乙個唯一的編號,乙個很大的編號,為了快速訪問和定位,很容易設想std::map去裝載他們。

但很顯然易見的是當map大到一定程度時對效率影響還是挺大的,這是就需要層級結構處置他們,就可以結合雜湊函式做乙個類似的map裝載他們:

給出的示例**:

template

class objmap

;~objmap(){};

void insert(long long key,t val)

;t getval(long long key)

}return t();

};long long size()

return ret;        

};//其他函式類似

private:

long long hash(long long key)

;private:

//static const long long pagecount = 10000;

std::map> data;

};2、扁平化樹層級

場景設想,有時候我們會遇到這樣一種情況,我們要識別乙個物件,首先需要找到他所在區域,再找到所在型別,再更具編號識別到物件,看起來應該是這樣儲存的:

std::map> >,如果資料量不大,這種多層級的如果通過雜湊函式概念,建立區域、型別、編號到位置key一對一的對映關係[1],或者說區域、型別、編號組合成乙個key 物件[2],就能將多層級簡化

[2]示列**:

class keyobj;//

static int cmp_key(const keyobj &obj1, const keyobj &obj2)

;int    m_domain;    

int    m_type;        

int    m_id;        

};inline bool operator==(const keyobj& obj1, const keyobj& obj2)

inline bool operator!=(const keyobj& obj1, const keyobj& obj2)

inline bool operator>=(const keyobj& obj1, const keyobj& obj2)

inline bool operator<=(const keyobj& obj1, const keyobj& obj2)

inline bool operator>(const keyobj& obj1, const keyobj& obj2) 

inline bool operator<(const keyobj& obj1, const keyobj& obj2) 

template

class myobj

;void insert(keyobj key,t val)

;void insert(int _domain,int _type, int _id,t val)

;t getval(keyobj key)

return t();

};//其他函式類似實現

private:

std::mapdata;//由於採用map,需要keyobj實現map的key排序準則

};雜湊表在實際應用場景要比這複雜很多,主要看其引入是否能降低訪問複雜度、插入複雜度等,否則寧可不用。

資料結構與演算法 雜湊函式與雜湊表

1.雜湊函式的特點 1 理論上輸入域是無窮大的,輸出域是固定的。2 雜湊一般是16位的,每一位是0 9 a f 的隨機數所以一共16的16次方種也就是2 64種 3 雜湊函式輸出的值會均勻分布。比如說輸入域是0 98,輸出域是0 2,我們輸入99個數字,那麼所有輸入的值 3後,0 1 2後面基本都有...

重溫資料結構 雜湊 雜湊函式 雜湊表

hash 雜湊 又稱 雜湊 雜湊 hash 英文原意是 混雜 拼湊 重新表述 的意思。在某種程度上,雜湊是與排序相反的一種操作,排序是將集合中的元素按照某種方式比如字典順序排列在一起,而雜湊通過計算雜湊值,打破元素之間原有的關係,使集合中的元素按照雜湊函式的分類進行排列。在介紹一些集合時,我們總強調...

資料結構與演算法 雜湊函式和雜湊表等 2

s 城現有兩座監獄,一共關押著n 名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c 的罪犯被關押在同一監獄,他...