近兩天在溫習資料結構時,對雜湊函式與樹結構資料處理優化有些想法。
首先看看雜湊函式的定義:在資料元素的關鍵字與該元素的儲存位置之間建立一種對應關係,將這種關係稱為雜湊函式(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 的罪犯被關押在同一監獄,他...