一、實現靜態的雜湊表
下面,將給出靜態實現:
//靜態
#define max_size 10
typedef enum state;
templatestruct elem
;templatebool isline=true>
class hashtable
_size = 0;
}//插入元素
bool insert(const k&key)
//插入元素
_hashtable[hashadder]._key = key;
_hashtable[hashadder]._state = exist;
++_size;
return
true;
}//查詢元素
int find(const k&key)
return -1;
}//刪除元素
bool delete(const k&key)
return
false;
}size_t size()
bool empty()
private:
//線性探測
void
linecheck(size_t& hashadder)
//二次探測
void secondcheck(size_t hashadder,size_t i)
private:
//雜湊函式
size_t func(const k&key)
private:
elem_hashtable[max_size];
size_t _size;
};
二、實現動態的雜湊表
在靜態雜湊表的基礎上,由於利用靜態儲存,很容易將雜湊表存滿,因此,利用動態的雜湊表,從而可以實現不斷的給雜湊中儲存元素,但是在上面的基礎上,我們難免還會想到,在雜湊中,我們不僅僅是對整型數值的儲存,在必要的時候,我們還需要儲存字串,因此在對於字串的儲存中,我們對雜湊位址的計算便是乙個大問題,因此將字串轉換為整數,然後對其雜湊位址進行計算即可。
(對於有關字串轉整數,可以採取兩種措施:1、對其字串取位址,從而可以取得字串的整數形式2、利用字串轉整數的函式,同時在此基礎上,且利用類與特化從而實現字串的轉換即可)
在實現動態的雜湊表之時,利用除留餘數法即可。
基本實現如下所示:
comm.hpp
#define _crt_secure_no_warnings 1
#pragma once
#include
#include
using
namespace
std;
// 使用素數表對齊做雜湊表的容量,降低雜湊衝突
const
int _primesize = 28;
static
const
unsigned
long _primelist[_primesize] =
;//除留餘數法
size_t getnextprime(size_t num)
//走到最後,仍然沒有找到
return _primelist[_primesize - 1];
}static size_t bkdrhash(const
char * str)
return (hash & 0x7fffffff);
}//轉換函式(整數)
template
class keytointdef
};//字串,需要特化
class stringtoint
};
hashtable.hpp
//可以訪問字串
#include"common.hpp"
//如果需要訪問字串,則需要在求取雜湊位址的時候,需要轉換,利用仿函式
template
k>
struct
elem
;template
k, class
keytoint = keytointdef
, bool isline = true>
class
hashtable
//插入元素
bool insert
(const
k&key)
//插入元素
_hashtable[hashadder]._key = key;
_hashtable[hashadder]._state = exist;
++_size;
return true;
}//查詢元素
int find
(const
k&key)
if (isline)
linecheck
(hashadder);
else
secondcheck
(hashadder, i++);
}return -1;
}//刪除元素
bool delete
(const
k&key)
return false;
}size_t size
()
bool empty
()
~hashtable
()
}private:
//交換函式
void swap
(hashtable
& ht)
//增容函式
void checkcapacity
()
swap
(newht);}}
//線性探測
void linecheck
(size_t& hashadder)
//二次探測
void secondcheck
(size_t
hashadder, size_t
i)
private:
size_t func
(const
k&key)
private:
elem
* _hashtable;
size_t _size;
size_t _capacity;
};
有關閉雜湊的有關知識,大概就這麼多了,希望大家一起進步!!!
只有不停的奔跑,才能不停留在原地!!!
雜湊表 閉雜湊
閉雜湊主要就是需要注意一下 墓碑 的操作,其他的其實都簡單。asl的計算忘了,找了兩道題都沒算對,這才是我不寫的真正原因 裡是裝13用的 include using namespace std 雜湊表 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料...
雜湊之開雜湊,閉雜湊
有沒有一種方法時間複雜度,僅僅o 1 尼,那麼我們就要構造一種儲存結構,通過某種函式是之元素與它對應的關鍵碼之間能建立一一對映的關係,那麼自然通過之中一一對映的關係,我們就可以很快的找到我們需要的元素。所以進入雜湊這個這題首先我們需要乙個我們下標,這個下表在雜湊當中 我們就稱之為雜湊位址。而這個位址...
雜湊(閉雜湊)開放定址法實現
之前一篇博文中提過如何用開鏈法實現雜湊表 這裡是鏈結 那麼對於雜湊表的實現,還有另外一種方法的實現,這就是雜湊開放定址法來實現。該方法也是用來處理雜湊衝突的。解決思想如下 現有關鍵字17,60,29,38 如何確定位址?可以看見該錶的長度為11,那麼使用關鍵字取餘該錶的長度,得到的餘數就是該關鍵字的...