91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

【干貨】C++哈希桶(開鏈法解決哈希沖突)類的實現

發布時間:2020-07-28 02:34:46 來源:網絡 閱讀:751 作者:pawnsir 欄目:編程語言

    開鏈法(哈希桶)是解決哈希沖突的常用手法,結構如下:

【干貨】C++哈希桶(開鏈法解決哈希沖突)類的實現

    數據結構的設計思路是這樣的,定義一個K—V的鏈式節點(Node),以數組方式存儲節點指針

    實現代碼如下:

#include<vector>
#include"HashTable.h"
size_t GetSize()
{
	static size_t index = 0;
	const int _PrimeSize = 28;
	static const unsigned long _PrimeList[_PrimeSize] =
	{
		53ul, 97ul, 193ul, 389ul, 769ul,
		1543ul, 3079ul, 6151ul, 12289ul, 24593ul,
		49157ul, 98317ul, 196613ul, 393241ul, 786433ul,
		1572869ul, 3145739ul, 6291469ul, 12582917ul, 25165843ul,
		50331653ul, 100663319ul, 201326611ul, 402653189ul, 805306457ul,
		1610612741ul, 3221225473ul, 4294967291ul
	};
	return _PrimeList[index++];
}
template<class K,class V>
struct HashBucketNode
{
	HashBucketNode(const K& key, const V& value)
	:_key(key)
	, _value(value)
	, _next(NULL)
	{}
	K _key;
	V _value;
	HashBucketNode* _next;
};
template<class K, class V, class HashFunc = DefaultHash<K> >
class HashBucket
{
public:
	typedef HashBucketNode<K,V> Node;
	HashBucket()
		:_size(0)
	{
			_tables.resize(0);
	}
	bool Push(const K& key, const V& value)
	{
		_CheckCapacity();
		size_t index = HashFunc()(key) % _tables.size();
		Node*cur = _tables[index];
		while (cur)
		{
			if (cur->_key == key&&cur->_value == value)
				return false;
			cur = cur->_next;
		}
		Node*tmp = new Node(key, value);
		if (_tables[index])
		{
			_tables[index]->_next = tmp->_next;
		}
		_tables[index] = tmp;
		++_size;
		return true;
	}
	void Swap(HashBucket & h)
	{
		swap(_size, h._size);
		_tables.swap(h._tables);
	}
	Node* find(const K& key, const V& value)
	{
		size_t index = HashFunc()(key) % _tables.size();
		Node*cur = _tables[index];
		while (cur)
		{
			if (cur->_key == key&&cur->_value == value)
				return cur;
			cur = cur->_next;
		}
		return NULL;
	}
	bool Remove(const K& key)
	{
		size_t index = HashFunc()(key) % _tables.size();
		if (_tables[index])
		{
			if (_tables[index]->key == key)
			{
				Node*tmp = _tables[index];
				_tables[index] = tmp->_next;
				delete tmp;
				return true;
			}
			else
			{
				Node*cur = _tables[index];
				while (cur->_next)
				{
					if (cur->_next->_key == key)
					{
						Node*tmp = cur->_next;
						cur->_next = cur->_next->_next;
						delete tmp;
						return true;
					}
					cur = cur->_next;
				}
			}
		}
		return false;
	}
protected:
	void _CheckCapacity()
	{
		if (_size >= _tables.size())
		{
			HashBucket tmp;
			tmp._tables.resize(GetSize());
			for (size_t i = 0; i < tmp._tables.size(); ++i)
			{
				Node*cur = tmp._tables[i];
				while (cur)
				{
					tmp.Push(cur->_key, cur->_value);
					cur = cur->_next;
				}
			}
			Swap(tmp);
		}
	}
protected:
	vector<Node*> _tables;
	size_t _size;
};

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

光山县| 霍邱县| 离岛区| 邵阳县| 济南市| 清水河县| 玉林市| 多伦县| 华阴市| 班玛县| 光山县| 兴业县| 叙永县| 双柏县| 宜君县| 邯郸市| 兴隆县| 新巴尔虎左旗| 昔阳县| 孙吴县| 资讯| 轮台县| 保山市| 玛沁县| 新田县| 龙井市| 光泽县| 务川| 临湘市| 崇仁县| 根河市| 商南县| 临朐县| 酒泉市| 诸城市| 中西区| 尚志市| 冷水江市| 鄯善县| 乌兰浩特市| 镇雄县|