雜湊表KV形式的二次探測

2021-07-11 22:39:37 字數 2664 閱讀 1780

雜湊表主要有兩種形式:

(1)key形式的,存入key的值,然後再去查詢key的值

(2)key_value形式的,存入key和對應的value的值,然後通過key來查詢value的值,主要可以來實現kv字典查詢

對於以上兩點本部落格並不都一一實現,而是僅僅實現kv形式的

其實庫中也有雜湊表這兩種的實現,其實k的形式可以轉換為kv的形式,也就是v設定成自己的k的形式

如圖所示:

由於雜湊表中每個位置的傳值不知道設定為什麼具體的值好並且刪除後不知道設定成什麼具體的值好(設定為-1萬一儲存的就是-1呢),所以設定乙個狀態陣列用來,表示每乙個為值上的值的狀態,初始時設定為empty,當前位置上存在數字設定為exist,要刪除當前位置上的值設定為delete(也為懶刪除法)

enum status  

;

定義放函式的作用主要還是提高**的復用性,對於不同型別的資料,其處理的函式是不同的,而其他地方的**都是相似的,這樣就可以定義乙個仿函式專門來處理雜湊函式不同的問題

//仿函式

templatestruct defaulsthashfuncer

};template<>

struct defaulsthashfuncer //特化string型別的仿函式

return (hash & 0x7fffffff);

} size_t operator()(const string& str)

};

templatestruct keyvalue

};

template>

class hashtaable

;

(1)預設建構函式

hashtaable()

:_tables(null)

, _status(null)

, _size(0)

, _capacity(0)

{}

(2)建構函式(開闢size大小的空間)

hashtaable(size_t size)

:_tables(new kv[size])

, _status(new status[size])

, _size(0)

, _capacity(size)

}

(3)析構函式

~hashtaable()

}

(4)插入資料

bool insert(const k& key,const v& value)

*/ _checkcapacity();

int i = 1;

size_t index = _hashfunco(key);

//二次探測

while (_status[index] == exist)

index = _hashfunc(index, i++);

} _status[index] = exist;

_tables[index]._key = key;

_tables[index]._value = value;

++_size;

return true;

}

(5)尋找乙個資料

bool find(const k& key)

return true;

}

(6)移除某個資料

bool remove(const k& key)

return false;

}

(7)列印雜湊表

void printtable()

else if (_status[i]==delete)

else}}

(8)交換資料

void swap(hashtaable& ht)

定義的protected函式:

(9)雜湊函式初始的位置

size_t _hashfunco(const k& key)

(10)二次探測雜湊函式

size_t _hashfunc(size_t prevhash,int i)//雜湊函式

(11)尋找資料(返回下標的位置)

int _find(const k& key)

++index;

if (index == _capacity)

}return -1;

}

(11)增容

void _checkcapacity()

} this->swap(tmp);//衝突改變,相對位置改變

}}

void test()

雜湊表之線性探測和二次探測

雜湊表又稱雜湊表。雜湊表儲存的基本思想是 以資料表中的每個記錄的關鍵字 k為自變數,通過一種函式h k 計算出函式值。把這個值解釋為一塊連續儲存空間 即陣列空間 的單元位址 即下標 將該記錄儲存到這個單元中。在此稱該函式h為哈函式或雜湊函式。按這種方法建立的表稱為雜湊表或雜湊表。處理衝突的方法 開放...

雜湊之閉雜湊(線性探測 二次探測)

hashtable.h include include include include common.h 雜湊表位置的狀態 typedef enum state state typedef int datatype typedef char datatype 轉換int函式指標 typedef si...

雜湊表 開放位址法(二次探測以及在雜湊法)

首先你要知道什麼二次探測,在雜湊法都是用來解決雜湊衝突的。在雜湊法,就是有兩個雜湊方法,第乙個雜湊化方法,確定初始位置,衝突就執行第二個雜湊化方法。注意 在雜湊法第二個雜湊化函式的要求 1.第二個雜湊化函式不能和第乙個一樣 2.不能輸出0 舉個例子 第二個方法可以設計成這樣 第二個雜湊函式 計算下標...