雜湊表
雜湊表(hashtable)又叫雜湊表,是根據關鍵碼值(key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。
雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式既所謂的雜湊函式轉換成乙個整型數字。把這個整型數字作為元素的下標存入陣列(雜湊表),我們常用的演算法有以下幾種:
直接定址法
除留餘數法
平方取中法
摺疊法數學分析法
隨機數法
而這幾種演算法裡面,最常用的還是前兩種:
直接定址法——–>取關鍵字的某個線性函式為雜湊位址,hash(key)= key 或hash(key)= a*key + b,a、b為常數。
除留餘數法——–>-取關鍵值被某個不大於雜湊表長m的數p除后的所得的餘數為雜湊位址。hash(key)= key%p。
不管是直接定址還是除留餘數,這裡肯定會存在一種情況——–>不同的key值經過處理後得到了相同的結果。我們稱這種現象為雜湊衝突(或者說雜湊碰撞)。
當兩個不同的元素經過雜湊處理得到了相同的整型資料index,那麼哪個元素該存入陣列下標為index的位置上呢?另乙個存放到哪呢?
**有壓迫**就有鬥爭!**有衝突我們就要解決!
閉雜湊方法(開放定址法)
它的核心思想就是把發生衝突的元素放到雜湊表中的另乙個位置。具體又可分為線性探測和二次探測。
假設我們現在有乙個雜湊表table[10],大小為10。
將 89、18、49、58、9這5個key值插入table。(示例用除留餘數法)
- 線性探測
線性探測要做的就是把發生衝突的元素插入從當前位置開始後移的第乙個空位置。
我們用這幾個key值分別模雜湊表的大小10。得到每個應插入的下標。
89%10 = 9;
18%10 = 8;
49%10 = 9;
58%10 = 8;
9 % 10 = 9;
從上式可以看出89、49、9這三個元素發生衝突,18、8這兩個發生衝突。
插入過程如圖:
開雜湊方法(拉鍊法或叫開鏈法)
實現原理就是將雜湊表變成乙個指標陣列。每次發生衝突,九江發生衝突的元素鏈到當前位置下。
仍未上述條件,處理完結果如圖:
閉雜湊方法(線性探測)
#include
#include
using
namespace
std;
enum state
;template
struct __hashfunc
};//特化
template
<>
struct __hashfunc
private:
//字串雜湊處理演算法
static size_t bkdrhash(const
char* str)
return(hash & 0x7fffffff);
}};template
struct hashnode
};template
class hashtable
bool insert(const k& key, const v& value)
if (index == _table.size() - 1)
++index;
}_table[index]._key = key;
_table[index]._value = value;
_table[index]._sta = exsit;
_size++;
return
true;
}void swap(hashtable& hash)
node* find(const k& key)
if (index == _table.size() - 1)
++index;
}return null;
}bool remove(const k& key)
if (index == _table.size() - 1)
++index;
}return
false;
}protected:
size_t getindex(const k& key)
size_t getprimenum(const size_t& sz)
;for (int i = 0; i < primesize; ++i)
}return sz;
}void checksize()
this->swap(newhash);}}
protected:
vector
_table;
size_t _size;
};
開雜湊方法(拉鍊法)#include
#include
using
namespace
std;
//特化
template
<>
struct __hashfunc
private:
//字串雜湊處理演算法
static size_t bkdrhash(const
char* str)
return(hash & 0x7fffffff);
}};template
struct hashnode
};template
class hashtable
bool insert(const k& key, const v& value)
while (cur)
cur = cur->_next;
}node* newnode = new node(key, value);
newnode->_next = _tables[index];
_tables[index] = newnode;
_size++;
return
true;
}node* find(const k& key)
return null;
}bool delete(const k& key)
node* cur = _tables[index];
node* parent = null;
if (cur->_key == key)
while (cur)
else
break;
}parent = cur;
cur = cur->_next;
}if (cur)
return
false;
}void print()
cout
<< "null"
<< endl;}}
protected:
void checksize()
}//this->_size = newtable.size();
this->_tables.swap(newtable);}}
size_t getindex(const k& key, const size_t& size)
size_t getprimenum(const size_t& sz)
;for (int i = 0; i < primesize; ++i)
}return sz;
}protected:
vector
_tables;
size_t _size;
};
資料結構 雜湊表 c
理想的查詢是不經過任何的比較,一次訪問就能得到想要查詢的記錄 要達到這樣的目的就需要在記錄的儲存位置和它的關鍵字之間建立乙個確定的關係f 讓每個關鍵字和結構中的乙個唯一的位址相對應。在查詢的時候,只需要對應關係f找到給定值k的像f k 若結構中存在關鍵字和k相等,則必定在f k 的儲存位置上,由此不...
《C 實現資料結構》 雜湊表
雜湊表通過將關鍵字值對映到表中某個位置上來儲存元素。由給定的關鍵字值,根據對映,計算得到元素的儲存位置來訪問元素。在雜湊技術中,衝突是指對於關鍵字集合中的兩個關鍵字值ki和kj,當ki kj時,有h ki h kj h是雜湊函式。目前比較常用的雜湊函式有 除留餘數法 平方取中法 摺疊法 數字分析法。...
資料結構 雜湊表
1.雜湊表的定義 元素的儲存位置和它的關鍵碼之間建立乙個確定的對應關係h,使得每個關鍵碼key和唯一的儲存位置h key 相對應。在查詢時,根據這個確定的對應關係找到給定值k的對映h k 若查詢集合中存在這個記錄,則必定在h k 的位置上,這種查詢技術稱為雜湊技術。採用雜湊技術將記錄儲存在一塊連續的...