C++数据结构 之 哈希表(散列表)_Hash Table

C++数据结构 之 哈希表(散列表)_Hash Table

源代码只包含头文件

注:需要C++11的支持

一、哈希表

哈希表是一种高效的数据结构,能在平均时间复杂度O(n)的情况下存储与查询。它是根据关健值(key)进行访问的。存在一函数,当key传入函数之后,函数输出一个独一无二的值val,函数叫哈希函数。当给定所存储容器V大小为m时,那么输入元素所在的位置就是val % m。
当输入很多元素之后, 同一位置下就可能会存入多个元素,因而产生冲突(collision),那么这时候就需要用链接(chaining)来解决问题:使用链表将同一位置下的元素链起来。

支持的操作:
1、insert 插入元素
2、erase 删除元素
3、search 搜索元素

示意图:
哈希表

二、源代码:

#ifndef HASH_TABLE_H
#define HASH_TABLE_H

#include <vector>
#include <list>
#include <utility>
#include <stdexcept>
#include <algorithm>
#include <functional>

using std::vector;
using std::list;
using std::hash;
using std::pair;

template<typename T>
class Sgl_HashTable {
	typedef typename list<T>::iterator iterator;
public:
	Sgl_HashTable() { resize(); }
	Sgl_HashTable(const size_t &temp_bucket) {
		bucket = temp_bucket;
		elem.resize(bucket);
	}
	~Sgl_HashTable() = default;

	size_t Hash_Val(const T &x) {
		return hash<T>()(x) % bucket;
	}

	void insert(const T &x) {
		auto Hval = Hash_Val(x);
		elem[Hval].push_back(x);
	}

	pair<size_t, iterator> search(const T &x) {
		auto Hval = Hash_Val(x);
		auto pos = find(elem[Hval].begin(), elem[Hval].end(), x);
		try {
			if (pos == elem[Hval].end()) {
				throw runtime_error("The element was not found.");
			}
		}
		catch (runtime_error &err) {
			cout << err.what() << endl;
		}

		return std::make_pair(Hval, pos);
	}

	void erase_one(const T &x) {
		auto p = search(x);
		if (p.second != elem[p.first].end()) {
			elem[p.first].erase(p.second);
		}
	}

	void erase(const T &x) {
		auto p = search(x);
		auto pos = p.second;
		if (pos != elem[p.first].end()) {
			while (pos != elem[p.first].end() && *pos == x) {
					pos = elem[p.first].erase(pos);
			}
		}
	}

private:
	vector<list<T>> elem;
	size_t bucket = 100;
	void resize() { elem.resize(bucket); }
};

template<typename key, typename T>
class Dbl_HashTable {
	typedef typename list<pair<key, T>>::iterator iterator;
public:
	Dbl_HashTable() { resize(); }
	Dbl_HashTable(const key &temp_bucket) {
		bucket = temp_bucket;
		elem.resize(bucket);
	}

	size_t Hash_Val(const key &x) {
		return hash<T>()(x) % bucket;
	}

	void insert(const key &x1, const T &x2) {
		auto Hval = Hash_Val(x1);
		elem[Hval].push_back(std::make_pair(x1, x2));
	}

	pair<size_t, iterator> search(const key &x) {
		auto Hval = Hash_Val(x);
		auto pos = find_if(elem[Hval].begin(), elem[Hval].end(), [&](pair<key, T> temp_p)->bool {
			return temp_p.first == x;
		});
		try {
			if (pos == elem[Hval].end()) {
				throw runtime_error("The element was not found.");
			}
		}
		catch (runtime_error &err) {
			cout << err.what() << endl;
		}

		return std::make_pair(Hval, pos);
	}

	void erase_one(const key &x) {
		auto p = search(x);
		if (p.second != elem[p.first].end()) {
			elem[p.first].erase(p.second);
		}
	}

	void erase(const key &x) {
		auto p = search(x);
		auto pos = p.second;
		if (pos != elem[p.first].end()) {
			while (pos != elem[p.first].end() && pos->first == x) {
				pos = elem[p.first].erase(pos);
			}
		}
	}

private:
	vector<list<pair<key, T>>> elem;
	size_t bucket = 100;
	void resize() { elem.resize(bucket); }
};

#endif // !HASH_TABLE_H

注解:支持两种元素类型,一种是单元素(key),一种是双元素(key, T),分别对应于Sgl_HashTable和Dbl_HashTable。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值