?..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

【代碼】key-value模式下的哈希二次探測與簡單的哈希類的實現(xiàn)

發(fā)布時間:2020-07-03 04:22:21 來源:網(wǎng)絡(luò) 閱讀:360 作者:pawnsir 欄目:編程語言

    二次探測是避免哈希沖突的一種常見手段,思想是:

    插入:

    找到哈希位置(serch)->如果不沖突就插入,沖突就進行第一次探測

    第1次探測:

    哈希位置變?yōu)樵泄N恢眉由?*1的偏移->進行插入

    ....

    ....

    第i次探測:

    哈希位置變?yōu)樵泄N恢眉由蟟*i的偏移->進行插入

    知道插入完成為止。

如圖所示:

【代碼】key-value模式下的哈希二次探測與簡單的哈希類的實現(xiàn)  

    哈希類代碼如下:

#pragma once
#include<vector>
#include<string>
enum Status
{
	DELETE,
	EMPTY,
	EXIST,
};
template<class K, class V>
struct KV
{
	KV()
	{}
	KV(K _key, V _value)
	:key(_key)
	, value(_value)
	{}
	Status s;
	K key;
	V value;
};
template<class K>
struct DefaultHash
{
	size_t operator()(const K& k)
	{
		return k;
	}
};
template<>
struct DefaultHash<string>
{
	size_t operator()(const string&k)
	{
		size_t ret = 0;
		for (size_t i = 0; i < k.size(); ++i)
		{
			ret *= 10;
			ret += k[i];
		}
		return ret;
	}
};
template<class K,class V,
class Hash = DefaultHash<K> >
class HashTable
{
public:
	HashTable(size_t capacity)
		:tables(new KV<K,V>[capacity])
		,_size(0)
		, _capacity(capacity)
	{
		for (size_t i = 0; i < _capacity; ++i)
		{
			tables[i].s = EMPTY;
		}
	}
	HashTable()
		:_size(0)
		, _capacity(0)
	{}
	void Push(const KV<K,V> &x)
	{
		size_t index = search(x.key);
		tables[index].s = EXIST;
		tables[index].key = x.key;
		tables[index].value = x.value;
		++_size;
	}
	void Print()
	{
		for (size_t i = 0; i < _capacity; ++i)
		{
			cout << i << ":";
			if (tables[i].s == EXIST)
				cout <<"["<<tables[i].key<<","<< tables[i].value<<"]";
			else
				cout << "NULL";
			cout << endl;
		}
		cout << endl;
	}
	int Find(const K& key)
	{
		Hash Search;
		int index = Search(key) % _capacity;
		size_t i = 0;
		while (tables[index].s != EMPTY)
		{
			if (tables[index].key == key&&tables[index].s == EXIST)
				return index;
			i++;
			index += 2*i-1;
			if (index >= _capacity)
				index %= _capacity;
		}
		return -1;
	}
	void Pop(const K& key)
	{
		int index = Find(key);
		if (index > 0)
		{
			tables[index].s = DELETE;
			_size--;
		}
	}
	~HashTable()
	{
		if (tables)
			delete[]tables;
		_size = 0;
		_capacity = 0;
	}
protected:
	size_t search(K key)
	{
		if (_size * 2 >= _capacity)
		{
			HashTable tmp(_capacity * 2 + 10);
			for (size_t i = 0; i < _capacity; ++i)
			{
				if (tables[i].s == EXIST)
					tmp.Push(tables[i]);
			}
			std::swap(tables, tmp.tables);
			std::swap(_size, tmp._size);
			std::swap(_capacity, tmp._capacity);
		}
		Hash Search;
		size_t index = Search(key)%_capacity;
		size_t i = 0;
		while (tables[index].s == EXIST)
		{
			i++;
			index += i*i;
			if (index >= _capacity)
				index %= _capacity;
		}
		return index;
	}
protected:
	KV<K,V>* tables;
	size_t _size;
	size_t _capacity;
};

    如有疑問希望提出,有不足也希望指正

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI