雜湊表/雜湊表構造雜湊表的幾種方法::是根據關鍵字(key)而訪問在記憶體位置的資料結構。
其方法是
:它通過乙個關鍵值的函式將所需的資料對映到表中的位置來訪問資料,這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表(雜湊表)。
直接定址法 —取關鍵字的某個線性函式為雜湊位址,hash(key) = key 或 hash(key) = i key+j;其中i,j為常數。
除留餘數法 —取關鍵值被某個不大於雜湊表長m的數p除后所得的餘數為雜湊位址。hash(key) = key%p.
平方取中法
摺疊法隨機數法
數學分析法
(其中 直接定址法和 除留餘數法是常用的方法)
不同的key值經過雜湊函式hash(key)處理以後,可能得到相同的位址。而任意的雜湊函式都不能避免這種情況的發生(雜湊碰撞/雜湊衝突)。
其中雜湊表的載荷因子定義為:
a = 填入表中的元素個數 / 雜湊表的個數
(eg: index = _size /_tables.size());即a越大,雜湊表中的數越多。
開放定址法
—處理雜湊衝突的閉雜湊方法:
對於開放定址法來說,雜湊表的載荷因子是特別重要的因素。應該嚴格控制到0.7-0.8以下!所以這也是我們需要擴容的條件
( _size*10 / _tables.size()*10 > 7 || _tables.size() == 0的時候擴容)
方法包括:
線性探測:
二次探測:
//數的狀態
enum state
;template
struct hashnode
};template
//仿函式
struct hash
};template
<>
struct hash
return (hash& 0x7fffffff);
}size_t operator()(const
string& str)
};template
class hashtable
bool insert(const k& key,const v& value)
}_table[index]._key = key;
_table[index]._value = value;
_table[index]._state = exist;
_size++;
return
true;
}//查詢k
node* find(const k& key)
else
return null;
}++index;
if( index == _table.size() )
}return null;
}//擴容
void checkcapacity()
//初始空間為空的時候,開闢空間為10
hashtablenewht;
newht._table.resize(newsize);
for(size_t i = 0; i < _table.size(); ++i)
}_table.swap(newht._table);}}
//刪除
bool erase(const k& key)
return
false;
}size_t hashfunc(const k& key)
protected:
vector
_table;//雜湊表的大小
size_t _size;//真正存入的數的大小
};
test.cpp#include
using
namespace
std;
#include "hashtable.h"
void testhashtable()
; hashtableht;
for(size_t i = 0; i < sizeof(a)/sizeof(a[0]); ++i)
*/hashtable s;
s.insert ("sort","排序");
s.insert ("hash","雜湊");
s.insert ("string","字串");
}int main()
二次探測:
其他**相同,只需要改以下**:
bool insert(const k& key, const v& value)
size_t i = 1;
size_t index = hashfunc(key);
size_t start = index;
while(_table[index]._state == exist)
}_table[index]._key = key;
_table[index]._value = value;
_table[index]._state = exist;
_size++;
return
true;
}node* find(const k& key)
else
}//++index;
index = start + i*i;
index %= _table.size();
++i;
if (index == _table.size())
}return null;
}
hash table 雜湊表(雜湊表)
hash table 也叫雜湊表。涉及到雜湊函式 雜湊衝突處理的問題。雜湊函式是雜湊表的關鍵,是用來從值到雜湊表索引 存放位置 的對映。比如 要存放乙個學校學生的姓名,他們是amanda,jack,andy,tom,bob,black等等500個人。我們可以設計乙個雜湊表,容量為500,來存放這些學...
HashTable雜湊表 雜湊表(雜湊桶)
處理雜湊衝突的開鏈法 拉鍊法 雜湊桶 使用素數做雜湊表的長度,可以降低雜湊衝突 素數表size t getnextprime size t num 素數表 雜湊桶的節點的定義 template struct hashnode 在插入前檢查容量,以及負載因子。不夠就進行增容,按素數表進行增,以減小雜湊...
雜湊表(雜湊)HashTable實現
近期刷leetcode發現凡是找字串中反覆字元或者陣列中找反覆資料的時候就不知道從何下手了。所以決定學習一下雜湊表解題。雜湊表的原理主要是解決分類問題,hash表是介於鍊錶和二叉樹之間的一種中間結構。鍊錶使用十分方便,可是資料查詢十分麻煩 二叉樹中的資料嚴格有序,可是這是以多乙個指標作為代價的結果。...